安全架构 - 驱动 UI 和权限(权限)的设置 - 基于角色,每个用户帐户

信息安全 访问控制 rbac 操作
2021-08-27 16:22:37

大公司如何实现他们的安全要求,这些要求集中并用于驱动人们可以做的事情(允许调用某个 Web 服务、提交订单等)以及驱动 UI(禁用按钮、菜单选项、个人表单域)?

我正在考虑 RBAC 架构:用户 -> 角色、角色 -> 特权。

具有基于许多单独的 field-account-user-role-amountThreshhold 权限的复杂应用程序将有很多很多“角色”,并且随着角色数量的增加,管理这些变得复杂。

管理所有这些可能的选项似乎令人生畏,而我之前的经验是在应用程序中硬编码这样的逻辑。

前任: If (User.Roles("IsAccounting")) { btnEditOrder.enabled = false; }

我的任务是设计/实现一个安全服务/架构,它将用作任何/所有应用程序(所有 .NET,但一些 GUI 和一些面向过程)的通用身份验证/授权点。

这是不可能开箱即用的,因为围绕客户帐户的业务组织和基于财务金额的权限层。

例如:John 是用户,他可以查看和提交帐户“Microsoft”和“Google”的请求。Mike 可以查看“Microsoft”和“Google”请求,但只能提交“Google”请求。

帐户/用户的数量庞大且多变。

如果我遵循 RBAC,将会有数百个“角色”来容纳所有必需的权利(特权)。这无济于事,因为最终目标是提供易于管理的 GUI 工具,以便管理人员可以将其直接下属分配给适当的角色。

我正在考虑使用以下 API(伪代码中的草稿)来实现这个安全部分:

UserContext securityContext = Security.GetContext(userID, userPwd);

应用程序中的用法是这样的: if (securityContext.RequestManager.CanSubmitRequest("Google")) {...}

这样一来,就会有成千上万的“Can(params)”方法来检查权限,这并不容易管理或使用这种模式。

任何链接/想法/指针表示赞赏。

这是一个 .NET 商店,但我从 .NET(成员资格/AzMan)中看到的任何内容都不会为我们提供所需的粒度和委派要求。ActiveDirectory / Oracle LDAP 集成会很好,但不是必需的。

旧(当前)系统使用 LDAP 对用户进行身份验证,但所有授权都在内部完成并存储在经典的“用户、角色、权限”表中。

3个回答

您是否查看过基于声明的身份验证?这个想法是附加到每个经过身份验证的用户是一个声明的集合,每个声明都代表关于用户的一些东西。当用户通过身份验证时,相关特定应用程序的声明集合被下拉,并且可以包含任意集合,如“CanSubmitGoogleOrders”或“PurchaseLimit = $4000”。

应用程序本身只需要知道它可以接收哪些潜在的声明,并在它看到(或没有看到)任何特定声明时采取相应的行动。

我认为这在很大程度上取决于最终用途。就在我的脑海中,并且对您的应用程序最终用户一无所知,您是否考虑过基于会话的身份验证?基本上检查他们的权限并将某种类型的标识符应用于他们的会话。这样,您可以授予请求允许的权限,这应该比检查每个请求的所有用户权限更快。只需有一个操作查找表以及允许哪些会话使用它,这样您就可以集中存储所有内容,这更容易管理。顺便说一句,这纯粹是对易于实施/可管理性/速度的回应,您希望您的应用程序越安全,显然您就越会牺牲速度。 真正推动您的实施的是找出可接受的速度和安全性之间的合理平衡点。

当我今天晚些时候有更多时间时,我会发布一个更冗长的回复。

这实际上是一个众所周知的问题,不幸的是,目前还没有很多打包的解决方案——至少,不是很好的解决方案。

基于角色的访问控制只是可扩展管理和安全性之间的折衷。通常,这是一个不错的选择,仅仅是因为替代方案是——嗯,直到现在还没有很多替代方案……它总是涉及大量复杂的自定义编码。除了银行或军事级别的安全要求外,这是可行的方法……但是,为了使安全易于管理,它始终是一种妥协。

虽然@SteveS 对基于声明的身份验证的建议是一个很好的建议(对于 .NET,您可以查看被称为日内瓦框架或Windows 身份基础 (WIF)的内容),并且绝对是朝着更细化方向的改进安全性,它并没有真正帮助解决“可扩展管理”问题。

您还可以了解(不幸的是)所谓的“权利管理”、基于策略/属性的访问控制 (ABAC/PBAC)、上下文敏感访问控制等方向
。为此,您可以看看XACML - 虽然它肯定有不小的缺点(即使即将发布的 v3 也没有做到这一点……),它绝对是朝着正确概念方向迈出的重要一步。(这只是一种格式/协议,不熟悉执行此操作的标准工具......)

不幸的是,底线仍然没有真正好的解决方案来实现可扩展的访问控制管理粒度。今天,它仍然需要大量的定制——无论是在您的应用程序中进行自定义编码,还是对一些相关的管理产品进行大量修改。也许一些小型初创公司很快就会提出解决方案……
披露:我正在与其中一家初创公司合作,以使您可以使用可扩展的访问粒度……