c# - 如何使用开放策略代理验证分层 RBAC/ABAC 策略定义中的应用程序授权?

标签 c# azure rbac abac open-policy-agent

我们正在构建一个基于云的应用程序,使用 C# 作为我们的主要语言并在 Microsoft Azure 上运行。 该架构的关键部分之一是为应用程序中的业务逻辑实现细粒度的授权权限。

开放策略代理

我们正在研究开放策略代理,因为这似乎是用于这些目的的一项有前途的技术。示例场景/规则如下所述。但它可以归结为 SharePoint 库或文件系统上的 Windows 文件夹之类的场景。

您有一个层次结构,并且希望将具有特定权限的用户分配到层次结构中的位置,这些权限可以继承,但可以在树的更深处被覆盖。

我们的平台会经常更新树中用户的权限,并且会不断评估策略代理以询问用户是否有权在我们的平台上执行特定操作。

问题

我们的问题:

  • 有人在 OpenPolicyAgent 中提供了一个很好的示例来实现类似层次结构/树状的权限策略吗?
  • 是否有其他更适合此目的的 OPA 替代方案?

授权规则

我们有一个列出设备的租户层次结构,其定义类似于树结构:

+- Plant01
   +- Line01
      +- Device01
    - Line02
      +- Device02
       - Device03
       - Device04
+- Plant02
   +- Line03
      +- Device05
       - Device06
       - Device07

我们还有在组/用户中定义的人员,我们希望在上面的层次结构中的某个位置分配特定角色。

示例:

  • User01可以停止Plant01-Line01的所有设备
  • 用户01只能查看Plant01-Line02的设备
  • User00可以停止Plant01的所有设备
  • User00 不得停止 Plant01-Line02-Device04

最佳答案

Are there other alternatives to OPA that are better suited for this?

ReBAC 解决方案(例如基于 Google's Zanzibar paper 的解决方案)可能为您的用例提供一个很好的替代方案。

当前基于本文并提供细粒度授权服务的一些产品包括:

它们都允许您定义策略并表示系统状态,以便决定某人是否有权访问资源。

例如,在 Auth0 FGA 中,您可以定义如下授权模型:

type plant
  relations
    define parent as self
    define viewer as self
    define stopper as self
    define can_stop as stopper
type line
  relations
    define parent as self
    define viewer as self or viewer from parent
    define stopper as self or stopper from parent
    define can_stop as stopper
type device
  relations
    define parent as self
    define viewer as self or viewer from parent
    define stopper as self or stopper from parent 
    define can_stop as stopper but not can_not_stop
    define can_not_stop as self

然后您可以添加以下关系元组来反射(reflect)您当前的状态:

write({ "user": "plant:01", "relation": "parent_plant", "object": "line:01" })
write({ "user": "plant:01", "relation": "parent_plant", "object": "line:02" })
write({ "user": "line:01", "relation": "parent_line", "object": "device:01" })
write({ "user": "line:02", "relation": "parent_line", "object": "device:02" })
write({ "user": "line:02", "relation": "parent_line", "object": "device:03" })
write({ "user": "line:02", "relation": "parent_line", "object": "device:04" })
write({ "user": "plant:02", "relation": "parent_plant", "object": "line:03" })
write({ "user": "line:03", "relation": "parent_line", "object": "device:05" })
write({ "user": "line:03", "relation": "parent_line", "object": "device:06" })
write({ "user": "line:03", "relation": "parent_line", "object": "device:07" })
write({ "user": "user01", "relation": "stopper", "object": "line:01" })
write({ "user": "user01", "relation": "viewer", "object": "line:02" })
write({ "user": "user00", "relation": "stopper", "object": "plant:01" })
write({ "user": "user00", "relation": "can_not_stop", "object": "device:04" })

然后您可以提出诸如“user1 与 X 的 can_stop 相关吗?”之类的问题:

check("user01", "can_stop", "device:01") // { "allowed": true }
check("user01", "can_stop", "line:01") // { "allowed": true }
check("user01", "can_stop", "device:02") // { "allowed": false }

您可以在 Playground 中尝试一下:https://play.fga.dev/stores/create/?id=01GGQYNRHK8EM07146HB8SSHXD

免责声明:我目前是 Auth0 FGA 团队的一员。

关于c# - 如何使用开放策略代理验证分层 RBAC/ABAC 策略定义中的应用程序授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71142616/

相关文章:

c# - ASP.Net 的自动回发。当速度太慢时会发生什么?

azure - 如何知道特定 Azure VM 类型是否支持高级磁盘?

html - Azure WebMatrix(图片未在网站上加载)

azure - 对 Azure 存储的只写访问(不可读取、不可列表、不可删除)

c# - List<Nullable<T>> 的运行时指令

c# - 使用 Azure REST API 创建角色分配时出错 - 目录中不存在主体

c# - Windows 8 CollectionViewSource ObservableCollection 绑定(bind)不更新

Azure Log Analytics - 加入失败 - 数据类型不一致

ssl - 浏览器是否支持属性证书?

php - 使用 "member"表代替 "user"表进行 Yii 身份验证