跳过内容

C7:强制执行访问控制

该控制措施的新版本已发布!

您正在查看 OWASP 十大主动控制的 2018 年旧版。您可以在 OWASP 十大主动控制 2024 中的 C1: 实施访问控制 中找到有关同一控制的信息!

描述

访问控制(或授权)是授予或拒绝来自用户、程序或进程的特定请求的过程。访问控制还涉及授予和撤销这些权限的行为。

需要注意的是,授权(验证对特定功能或资源的访问权限)与身份验证(验证身份)不等同。

访问控制功能通常涵盖软件的许多领域,具体取决于访问控制系统的复杂性。例如,管理访问控制元数据或为可伸缩性目的构建缓存通常是访问控制系统中需要构建或管理的其他组件。有几种不同类型的访问控制设计需要考虑。

  • 自主访问控制 (DAC) 是一种根据主体(例如用户、进程)的身份和知情需求以及/或对象所属的组来限制对对象(例如文件、数据实体)访问的方式。
  • 强制访问控制 (MAC) 是一种根据系统资源中包含的信息的敏感度(由标签表示)以及用户访问此类敏感度信息的正式授权(即许可)来限制对系统资源访问的方式。
  • 基于角色的访问控制 (RBAC) 是一种用于控制资源访问的模型,其中资源上的允许操作与角色而非单个主体身份相关联。
  • 基于属性的访问控制 (ABAC) 将根据用户的任意属性、对象的任意属性以及可能被全球识别并与当前策略更相关的环境条件来授予或拒绝用户请求。

访问控制设计原则

以下“积极”访问控制设计要求应在应用程序开发的初始阶段加以考虑。

1) 提前彻底设计访问控制

一旦选择了特定的访问控制设计模式,在应用程序中用新模式重新设计访问控制通常是困难且耗时的。访问控制是应用程序安全设计中必须预先彻底设计的主要领域之一,尤其是在处理多租户和横向(数据相关)访问控制等需求时。

访问控制设计可能开始时很简单,但通常会发展成为一个复杂且功能丰富的安全控制。在评估软件框架的访问控制能力时,请确保您的访问控制功能允许为您的特定访问控制功能需求进行定制。

2) 强制所有请求都经过访问控制检查

确保所有请求都经过某种访问控制验证层。Java 过滤器或其他自动请求处理机制等技术是理想的编程工件,有助于确保所有请求都经过某种访问控制检查。

3) 默认拒绝

默认拒绝的原则是,如果一个请求未被明确允许,则它将被拒绝。此规则将在应用程序代码中以多种方式体现。其中一些示例如下:

  1. 应用程序代码在处理访问控制请求时可能会抛出错误或异常。在这些情况下,访问控制应始终被拒绝。
  2. 当管理员创建新用户或用户注册新账户时,该账户默认应具有最小或没有访问权限,直到该访问权限被配置。
  3. 当一个新功能添加到应用程序中时,所有用户都应被拒绝使用该功能,直到其正确配置为止。

4) 最小权限原则

确保所有用户、程序或进程只被授予尽可能少或必要的访问权限。警惕那些不提供粒度访问控制配置功能的系统。

5) 不应硬编码角色

许多应用程序框架默认采用基于角色的访问控制。在应用程序代码中很容易发现这类检查。

    if (user.hasRole("ADMIN")) || (user.hasRole("MANAGER")) {
        deleteAccount();
    }

请谨慎处理代码中这种基于角色的编程。它具有以下限制或危险:

  • 这种性质的基于角色的编程很脆弱。很容易在代码中创建不正确或缺失的角色检查。
  • 基于角色的编程不支持多租户。需要采取极端措施,例如分叉代码或为每个客户添加检查,才能使基于角色的系统为不同客户提供不同的规则。
  • 基于角色的编程不支持数据特定或横向的访问控制规则。
  • 包含许多访问控制检查的大型代码库可能难以审计或验证整体应用程序访问控制策略。

相反,请考虑以下访问控制编程方法:

    if (user.hasAccess("DELETE_ACCOUNT")) {
        deleteAccount();
    }

这种性质的基于属性或功能的访问控制检查是构建设计良好且功能丰富的访问控制系统的起点。这种编程类型还允许随着时间的推移实现更大的访问控制定制能力。

6) 记录所有访问控制事件

所有访问控制失败都应被记录,因为这些可能表明恶意用户正在探测应用程序的漏洞。

防止的漏洞

参考资料

工具