实施 ACL 的最佳实践是什么

信息安全 Web应用程序 访问控制 LDAP 身份管理
2021-09-09 14:49:38

我有一个网站,其中包含某些需要对最终用户隐藏的菜单项。

该网站在前端使用 PHP,在后端使用 Java 和 Spring,部署在虚拟机基础架构中的 Linux 操作系统上,尽管完整的技术堆栈尚未完全理解,因为它是一个遗留系统并且没有完整的文档记录。

我需要基于访问控制来保护站点和功能 - 用户映射到组和组,这些组可以访问不同的菜单项(功能)。我还必须为管理员提供一个界面来更改功能到组的映射。我还需要对不同读/写方法访问的级别进行精细控制。

我知道我需要 ACL。这种要求的最佳实践设计是什么?

选项和问题:

  • DB - 负面问题将是:旧风格和创建我自己的身份管理功能,具有所有缺点和复杂性。
  • LDAP - 负面问题:同样是我自己的身份管理系统,但可能比 DB 更简单,但我不确定功能级别映射到组的工作原理。LDAP 提供商是否提供组到特定功能的映射(即给定菜单项“帐户”-我只希望财务能够看到帐户菜单)
  • OpenAM 和类似的将身份管理外部化的解决方案——这行得通吗?我一直在阅读这方面的内容——我了解身份验证,但我不了解细粒度级别的授权。看起来您需要一个配置为数据源的 LDAP 产品,那么 OpenAM 提供了什么而不是上面的选项 2,因为它是相同的?使用 OpenAM,它看起来像我配置了一个身份服务,但我在容器级别得到了保护——所以 Web 服务器和应用服务器,但它提供了自己的登录页面。我认为可以将其配置为访问样式表,以便与当前登录页面集成——但有没有人在任何这些类型的产品上这样做以确保它是可能的?另外,这是我的 ACL 要求吗?这是最好的设计吗?与 LDAP 和应用程序配置相比,它的设置要复杂多少?

进一步的问题:

  • 最好建议使用 LDAP 解决方案吗?
  • 您对 Apache LDAP 的开源产品有什么建议吗?有什么好的/容易管理的吗?是否有任何接口可以将功能操作到组?- LDAP 是否允许将函数/方法的细粒度级别映射到组,还是在应用程序中完成?这部分尤其令人困惑。如果有人能提供一个很好的资源,那就太好了。
2个回答

您需要外部授权,例如基于声明的授权(特定于 Microsoft)或更广泛的基于属性的访问控制 (ABAC)。

ABAC 最近由 NIST 定义,您可以在此处下载他们的报告。

在您的问题中,您指向 LDAP 和组。然后您解释您需要将功能与组/角色相关联。LDAP、角色和组代表您的属性。它们也可能来自其他来源(例如数据库)。您缺少的是授权逻辑:组和功能之间的映射。

在 ABAC 中,该逻辑表示为授权策略。OASIS 有一个称为 XACML 的标准,即可扩展访问控制标记语言。在 XACML 中,您将使用属性来定义允许或拒绝哪些访问。

例如:

具有角色经理并在财务组中的用户可以查看财务菜单。

您可以在此处此处阅读有关 XACML的更多信息

我不会将其归类为身份管理。这是一个访问管理问题。绝对建议将您的访问管理解决方案外部化,而且我不知道有任何不使用 LDAP 作为存储的解决方案。

细粒度访问控制定义了对在同一页面或 URL 中显示的元素的访问,例如带有查询字符串参数的 URL 可以使用支持细粒度访问控制的产品进行“访问管理”,这与仅支持此功能的粗粒度访问控制解决方案不同到页面级别即html、jsp、php页面,忽略查询字符串参数或其他按钮,页面内的链接。

一种解决方案是(假设访问管理解决方案不提供细粒度访问控制 - 许多不提供)是结合访问管理产品和您的自定义代码来实现细粒度访问控制。在访问管理产品中定义自定义组/属性。这些自定义定义必须具有在 TRW 中定义的遍历、读取、写入访问权限,例如,例如,某些按钮/链接仅针对同一 http URL 上的管理员显示。还要在您的自定义数据库中定义相同的值(如有必要),以将它们映射到用户的权限/类型和他们的自定义组。

当用户登录您的网站时,将用户的访问权限作为 http 标头传递给网站。读取这些标头,解析这些值,然后根据用户类型和权限,为用户显示按钮/链接。例如,如果标题包含 R 作为属性并且如果用户类型不是管理员,则不显示符合 R 标准但不符合经理标准的按钮 - 这可以在您的数据库中查找。

如果您设法获得支持细粒度访问控制的访问管理解决方案,则上述解决方案无关紧要,但如果成本是问题,则上述解决方案应该易于实施。