天天看點

應用層安全架構設計-通路控制

權限控制,或者說通路控制,廣泛應用于各個系統中。抽象地說,是某個主體(subject)對某個客體(object)需要實施某種操作(operation),而系統對這種操作的限制就是權限控制。

在網絡中,為了保護網絡資源的安全,一般是通過路由裝置或者防火牆建立基于IP和端口的通路控制。

在作業系統中,對檔案的通路也要通路控制。比如在Linux系統中,一個檔案可以執行的操作分為“讀”、“寫”、“執行”三種,這三種操作同時對應着三種主體:檔案擁有者、檔案擁有者所在的使用者組、其他使用者,主體、客體、操作這個三者之間的對應關系,構成了通路控制清單。

在Web應用中,根據通路客體的不同,常見的通路控制可以通過解決以下幾個目标問題來實作:

  • 他是誰?
  • 他隻能通路給他授予了權限的接口!
  • 他不能檢視别人的資料!

下面我們以前後端分離的項目為例,解釋如何解決這幾個目标問題:

在前後端分離項目中,前端使用者登入後後端服務會給其頒發一個token,比如我們所熟知的JWT(JSON Web Token),而後每次前端請求後端接口都會帶上這個token。由于JWT上會帶有使用者資訊,此時我們要做的就是校驗這個token對應的使用者是否為系統合法使用者。

應用層安全架構設計-通路控制

光知道他是系統的合法使用者還是不夠,web應用還得保證目前使用者隻能通路他擁有權限的接口。

比如有個薪資查詢的接口,業務上隻允許部門上司角色通路。如果系統不做控制,張三知道了薪資查詢接口,就拿着自己的token去調用此接口然後就能知道所有員工的薪資了,這種問題我們稱之為"越權通路"。

處理這個問題現在應用廣泛的一種方法就是“基于角色的通路控制(RBAC:Role-Based Access Control)”,也稱“垂直權限管理”。

RBAC事先會在系統中定義出不同的角色,不同的角色擁有不同的權限,一個角色實際上就是一個權限的集合。而系統的所有使用者都會被配置設定到不同的角色中,一個使用者可能擁有多個角色。

當使用者帶着token請求後端服務時,我們還得通過token查詢出目前使用者所屬的角色,然後根據角色查詢出使用者擁有的所有權限。權限架構

Spring Security

和  

Shiro

都很好的支援RBAC控制。

應用層安全架構設計-通路控制

張三和李四都是部門上司,他們都可以查詢員工薪資的權限。但是他們都隻被允許檢視自己部門員工的薪資。張三知道了接口調用規則,就可以通過修改調用參數擷取李四部門員工的薪資了,這種情況當然也是不被允許的。

在RBAC模型下,系統隻會驗證使用者A是否屬于角色RoleX,而不會判斷使用者A是否能通路隻屬于使用者B的資料DataB,是以發生了越權通路。這種問題我們稱之為“水準權限管理問題”。

現在資料級權限管理并沒有很通用的解決方案,一般是具體問題具體解決。

簡單的做法是給接口請求加上秘鑰,通過接口參數+目前系統登入人一起進行加密發送給後端服務,後端接受到請求後對加密内容進行解密,根據約定的規則解析出使用者資訊并與登入使用者進行比對,比對上正常通路,比對不上則拒絕通路。

應用層安全架構設計-通路控制

以上,希望對你有所幫助!

End