【问题标题】:Designing Role/User based application security设计基于角色/用户的应用程序安全性
【发布时间】:2014-04-30 11:58:17
【问题描述】:

我相信你们中的许多人都已经这样做了,并且正在寻找一些指导来设计一个可以为多个用户处理数据(行级)安全性的强大、可扩展的应用程序。

我们正在研究一个系统,在该系统中,一些用户(一些作为个人,一些作为更大群体的一部分)需要访问他们自己的数据以及其他个人和组织与他们共享的数据。在某些情况下,共享数据只是为了查看,而在其他情况下,将提供完整的编辑权限。 即使在同一个组织内,也需要限制用户可以看到组织中其他用户创建的数据的内容。

所以一个非常粗略的例子可能是...... 具有角色 X 的用户 A,(个人用户) 具有角色 Y 的用户 B(个人用户) 具有角色 Z 的用户 C(个人用户) 组织 AA 中具有角色 X 的用户 D 和 E 组织 AA 中具有角色 Y 的用户 F 和 G

每个单独的用户都可以在我们的系统上创建例如合同。该合约不应该被其他任何人查看,直到他们选择与其他个人用户共享该合约,例如 A 将与用户 B 或 F 共享他的合约。 但是用户 A 可能还想与组织 AA 中角色 Y 的所有用户共享他的合同。 同样,共享合同甚至可能意味着允许编辑合同。

我们最初希望为每个单独的用户提供一个单独的架构,以确保数据级别的安全性,但这使得共享更加复杂,并且还可能导致 1000 多个架构(这似乎不是一个好主意)。 因此,似乎我们唯一的办法是将所有数据留在一个数据库中的一个模式中,并简单地设计一个用户和角色驱动的应用程序级安全模型,该模型可以容纳每个合同上所有必需的 CRUD 权限。听起来这会变得非常复杂并且“不那么漂亮”。对于每个合同,我们必须按组织定义用户和角色列表,其中每个用户/角色具有单独的权限。 有没有人做过这样的事情?关于良好且安全的应用程序设计有什么建议吗?

谢谢

【问题讨论】:

    标签: security permissions roles


    【解决方案1】:

    这里有一些关于这个要求的粗略想法

    由于您说的是数据安全控制,而不是系统功能/特性访问控制,所以这里我将重点介绍数据访问控制。

    访问控制类的结构

    • 您可能希望将所有级别的安全原子视为同一事物,例如。 g、一般定义为个体/权限/角色/组都继承自同一个基本原理类,那么从概念上讲,所有的访问控制定义都会在这个基本原理上,所以你不需要知道是否控制权在角色、组或用户上,这将为您提供更大的灵活性并简化问题。
    • 您可能还希望将原则定义为一种组合/层次结构,例如

      • 为用户 A 分配了 RoleA、RoleB、RoleC 和 PERMISSION2
      • 角色 A 是 RoleC 和 RoleD 的组合
      • RoleC 是权限 PERMISSION1、PERMISSION2 等的组合。

    BTW:由于这里的设计非常灵活,所以你需要一个系统级的冲突检查机制来检查

    • 在任何分配时所有原则之间的冲突,以确保没有系统级冲突(例如,roleA定义用户不能更新类型A的文档,而PERMISSION2定义它可以),另一种可能的方法就是为不同类型的原则定义一个优先级,例如定义级别USER > ROLE > PERMISSION。

    • 还有一个功能级别(SOX 法律等)冲突检查,以确保没有功能级别冲突,例如,能够进行支付的人无法使用现金等操作)

    文档访问

    • 然后可以定义诸如文档/原则/限制类型/限制操作/限制开始和截止日期等模式来存储每个文档的数据访问控制,

      • 文档可以是合同、采购订单、采购请求等,在这里它的实际类型根本不重要。
      • 原则可以是用户/权限/角色/组等,你也不想在这里关注实际的原则类型,通过这种设计,那些普通文档只需要一行数据(因为我们可以在角色级别定义它),并且如果用户选择与特定组织或个人共享此文档,它也将能够处理。
      • 限制类型可能是“ALLOW”/“NOT_ALLOW”等,
      • 限制操作可以是“VIEW”/“UPDATE”/“ADMIN”等,
      • 限制开始和截止日期将是此访问控制生效的日期范围,通过结合我们定义的截止日期、操作和限制类型,您可以将异常访问控制与正常访问控制结合起来,从而实现共享/委托会更容易,也不会给正常的访问控制带来太多的复杂性。

    组织

    如果您的组织具有层次结构,您还可以定义如何为父组织和子组织继承访问控制,示例架构可能是,

    组织 ID/访问固有类型/开始和截止日期。

    • 组织 ID:该组织的主键
    • 访问固有类型:可能类似于:ALLOW_ALL_CHILD / ALLOW_ALL_PARENT / ALLOW_ALL_SAME_LEVEL /DENY_ALL 等。
    • 开始和截止日期可以是此角色生效和结束的日期。

    您可以实现的可能是:

    • 对于组织 A,其所有子公司均不得查看/更新其下的任何文档。
    • 对于组织 B,允许其所有子公司对其下的所有文档具有查看/更新权限,但不允许对同一层次结构级别的文档具有查看/更新权限。

    然后你可以将这个组织级访问控制和文档级访问控制结合起来,在评估规则时,文档级访问控制总是比组织级访问控制具有更高的优先级。

    【讨论】:

    • 谢谢您 - 我会仔细审查并寄回 cmets。虽然只是一个快速的 - 我正在寻找数据安全和应用程序安全访问控制,这就是为什么我发现这个具有挑战性
    猜你喜欢
    • 2010-12-28
    • 2015-12-23
    • 2013-03-21
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多