訪問控制,也稱為授權訪問控制,是確保請求者能夠訪問資源的關鍵機制。在系統中實現訪問控制有多種模型,其中最流行的兩種是基于角色的訪問控制(RBAC)和基于屬性的訪問控制(ABAC)。
RBAC 是通過用戶分配的角色來授權請求的。開發人員需要先為用戶分配角色(例如客戶、VIP 客戶、管理員、供應商或匿名用戶),然后將這些角色與 API 端點的訪問權限關聯。RBAC 在簡單系統中非常高效,因此廣受歡迎。然而,在復雜系統中,RBAC 的局限性也顯而易見,因為它無法實現細粒度的權限控制,僅能基于用戶角色制定授權策略。
ABAC 則通過使用所有可用屬性(通常是關于用戶的屬性)來決定是否授權訪問。例如,ABAC 系統不僅可以根據用戶的角色,還可以根據用戶所屬的部門、地理位置,甚至訪問時間等條件來做出授權決策。實際上,ABAC 所使用的屬性不局限于用戶,還可以包括其他相關信息。
ABAC 提供了一種更強大的細粒度授權方法,但其關鍵在于 API 必須從可信來源獲取屬性,并確保這些屬性未被篡改。這使得 OAuth 訪問令牌及其聲明成為 ABAC 的理想屬性來源。
OAuth 授權服務器會在訪問令牌中包含聲明信息,并通過簽名保護這些屬性的完整性。API 應盡可能依賴令牌中的聲明信息,但在某些復雜的授權場景中,這些信息可能還不夠全面。此時,API 可以通過補充其他屬性來完成授權決策。然而,這些補充屬性必須來自安全的來源,例如服務自身的數據庫,而非請求頭、查詢字符串或請求正文,因為這些內容容易被篡改。
ABAC 的優勢在于它不僅限于用戶屬性,還可以利用其他屬性來制定授權策略。例如,某些 API 端點可能只允許內部應用程序訪問。在這種情況下,可以通過驗證令牌中的 client_id 聲明,僅授權由內部客戶端發起的請求。
此外,授權策略的制定不應僅基于 API 憑據所標識的用戶。例如,用戶可能授予某個應用程序對特定資源的訪問權限,而該應用程序的訪問令牌中會明確列出允許訪問的資源。API 在處理這些請求時,必須確保僅允許訪問指定的資源,即使用戶本身擁有更高的權限。這種細粒度的授權可以通過令牌聲明或查詢數據庫來實現。
在大規模系統中,管理訪問控制可能會變得復雜。通過結合 OAuth 和 ABAC,可以實現更高效的授權管理。OAuth 提供了標準化的訪問令牌,而 ABAC 則允許基于多種屬性制定細粒度的授權策略。這種組合能夠有效應對復雜的授權需求,同時提升系統的安全性和靈活性。
正如 OWASP API 漏洞列表所示,正確的授權控制是 API 安全的核心組成部分。OAuth 提供了標準化的訪問令牌,非常適合與 ABAC 模型結合使用。相比 RBAC,ABAC 在大多數情況下更具優勢,因為它能夠利用多種屬性實現細粒度的授權策略。
通過充分利用令牌中的聲明信息和其他可信屬性,您可以顯著增強 API 的安全性,有效應對與授權相關的威脅。記住,授權策略不應僅限于用戶屬性,而是應綜合考慮所有可用的屬性,從而為系統提供更全面的保護。
原文鏈接: https://curity.io/blog/strengthen-api-access-control-with-attribute-based-authorization/