我们正在构建一个基于云的应用程序,使用 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 Fine Grained Authorization (FGA) - SaaS
- Authzed - SaaS 和 OSS 产品
- Ory Keto - OSS 产品
- OpenFGA - OSS 产品
它们都允许您定义策略并表示系统状态,以便决定某人是否有权访问资源。
例如,在 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/