應用層安全架構設計-訪問控制
本文轉載自微信公眾號「JAVA日知錄」,作者單一色調 。轉載本文請聯系JAVA日知錄公眾號。
權限控制,或者說訪問控制,廣泛應用于各個系統中。抽象地說,是某個主體(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,因此發生了越權訪問。這種問題我們稱之為“水平權限管理問題”。
現在數據級權限管理并沒有很通用的解決方案,一般是具體問題具體解決。
簡單的做法是給接口請求加上秘鑰,通過接口參數+當前系統登錄人一起進行加密發送給后端服務,后端接受到請求后對加密內容進行解密,根據約定的規則解析出用戶信息并與登錄用戶進行匹配,匹配上正常訪問,匹配不上則拒絕訪問。