强化 API 访问控制:基于属性的授权(ABAC)安全实践指南

作者:API传播员 · 2025-10-25 · 阅读时间:5分钟

保护数字服务的安全涉及多个方面,从用户身份验证到保护软件供应链、防止恶意代码注入等。其中,API的授权控制是一个关键领域。根据 OWASP 的 API 十大安全漏洞列表,授权破坏不仅排名第一,还以多种形式出现(如 BOLA、BOPLA 和 BFLA)。因此,强化 API 的授权控制对于保障系统安全至关重要。

开发人员通常会通过 API 密钥OAuth 访问令牌来保护 API 的访问。然而,即使采用了这些成熟的技术方案,仍可能存在过于技术化的问题。在本文中,我们将探讨如何通过基于属性的授权(ABAC)提供一种以业务为中心且更具扩展性的解决方案。


访问控制方法

访问控制,也称为授权访问控制,是确保请求者能够访问资源的关键机制。在系统中实现访问控制有多种模型,其中最流行的两种是基于角色的访问控制(RBAC)和基于属性的访问控制(ABAC)。

基于角色的访问控制(RBAC)

RBAC 是通过用户分配的角色来授权请求的。开发人员需要先为用户分配角色(例如客户、VIP 客户、管理员、供应商或匿名用户),然后将这些角色与 API 端点的访问权限关联。RBAC 在简单系统中非常高效,因此广受欢迎。然而,在复杂系统中,RBAC 的局限性也显而易见,因为它无法实现细粒度的权限控制,仅能基于用户角色制定授权策略。

基于属性的访问控制(ABAC)

ABAC 则通过使用所有可用属性(通常是关于用户的属性)来决定是否授权访问。例如,ABAC 系统不仅可以根据用户的角色,还可以根据用户所属的部门、地理位置,甚至访问时间等条件来做出授权决策。实际上,ABAC 所使用的属性不局限于用户,还可以包括其他相关信息。

ABAC 提供了一种更强大的细粒度授权方法,但其关键在于 API 必须从可信来源获取属性,并确保这些属性未被篡改。这使得 OAuth 访问令牌及其声明成为 ABAC 的理想属性来源。


利用基于声明的授权

OAuth 授权服务器会在访问令牌中包含声明信息,并通过签名保护这些属性的完整性。API 应尽可能依赖令牌中的声明信息,但在某些复杂的授权场景中,这些信息可能还不够全面。此时,API 可以通过补充其他属性来完成授权决策。然而,这些补充属性必须来自安全的来源,例如服务自身的数据库,而非请求头、查询字符串或请求正文,因为这些内容容易被篡改。


ABAC 的扩展应用

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/