什么是 Usage Control (UCON)?持续授权
什么是 UCON?
UCON (Usage Control) 扩展了访问控制,包含 authorizations (A)、obligations (B) 和 conditions (C)。它支持使用期间的 continuous 执行(而不仅仅是在访问时)和 mutable 属性。Casbin 核心未实现 UCON;请使用 casbin-ucon 扩展来实现基于会话的使用控制。
Model & Policy
Note: Casbin 核心库不直接支持 UCON。相反,UCON 功能通过扩展库 casbin-ucon 提供,该库添加了具有条件、义务和持续监控功能的基于会话的访问控制。该扩展可以使用 Casbin 核心支持的相同模型和策略。
model
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
policy
p, alice, document1, read
Note: 在 UCON 中,Conditions 和 Obligations 不会写入 policy.csv;它们通过 casbin-ucon API 在代码中添加和管理。
Core components
- Authorizations (A) — 基于主体/对象属性的访问规则(类似标准 Casbin)。
- Obligations (B) — 主体在使用前或使用期间必须执行的操作(例如记录日志、确认)。
- Conditions (C) — 必须满足的环境或系统状态(例如时间、位置)。
Features
- Continuous enforcement — 在整个使用会话期间进行检查,而不仅仅是在入口处。
- Mutability — 属性可以因使用而改变。
- Pre / ongoing / post — 在访问时、使用期间和使用后的决策和义务。
Use Cases
UCON 模型特别适用于:
- 数字版权管理 (DRM) 系统
- 医疗信息系统
- 云计算环境
- 物联网设备访问控制
- 协作环境中的数据共享
- 具有复杂合规要求的金融系统
Implementation with casbin-ucon
要在基于 Casbin 的应用程序中实现 UCON,请使用 casbin-ucon 扩展库:
go get github.com/casbin/casbin-ucon
// Import the required packages
import (
"github.com/casbin/casbin/v3"
"github.com/casbin/casbin-ucon"
"fmt"
"time"
)
func main() {
// Create standard Casbin enforcer
e, _ := casbin.NewEnforcer("model.conf", "policy.csv")
// Wrap with UCON functionality
uconE := ucon.NewUconEnforcer(e)
// Add conditions
condition := &ucon.Condition{
ID: "location_condition",
Name: "location",
Kind: "always",
Expr: "office",
}
uconE.AddCondition(condition)
// Add obligations
obligation := &ucon.Obligation{
ID: "post_log",
Name: "access_logging",
Kind: "post",
Expr: "log_level:detailed",
}
uconE.AddObligation(obligation)
// Create a session
sessionID, _ := uconE.CreateSession("alice", "read", "document1", map[string]interface{}{
"location": "office",
"log_level": "detailed",
})
// UCON session-based enforcement
session, err := uconE.EnforceWithSession(sessionID)
if session == nil {
// refused
fmt.Println("session refused because: ", err)
}
// Monitor session status
go func() {
for {
if !session.IfActive() {
if session.GetStopReason() == ucon.NormalStopReason {
break
}
//TODO
//decide how to handle session termination yourself
// For example, clean up resources, close connections, write logs, notify the frontend, etc.
fmt.Printf("%s %s %s is stopped because: %s\n",
session.GetSubject(), session.GetAction(),
session.GetObject(), session.GetStopReason())
break
}
time.Sleep(200 * time.Millisecond)
}
}()
// You can update attributes during the session
// session.UpdateAttribute("location", "home")
// Stop the session when done
_ = uconE.StopMonitoring(sessionID)
}
Implementation Notes
- UCON 涵盖了传统的访问控制模型,如 MAC、DAC 和 RBAC
- 实现需要一个能够进行持续监控的参考监视器
- 属性更新(可变性)应原子化处理以保持一致性
- 义务可能需要与外部监控系统集成
- 条件评估可能取决于访问控制系统之外的环境因素
- 使用 casbin-ucon 时,你需要妥善管理会话生命周期和监控
与传统模型的对比
| 方面 | 传统访问控制 | UCON |
|---|---|---|
| 决策时间 | 仅访问前 | 访问前、进行中及访问后 |
| 属性可变性 | 静态 | 动态(在使用期间可变化) |
| 决策因素 | 仅授权 | 授权、义务和条件 |
| 执行 | 一次性检查 | 持续监控 |
| 撤销 | 显式 | 可根据属性变化自动进行 |
参考资料
有关 casbin-ucon 的完整 API 文档、详细用法和最新更新,请参阅 casbin-ucon。
常见问题
Casbin 核心库是否支持 UCON? 不支持。核心库在调用 Enforce() 时做出决策。UCON 需要持续检查和可变属性,因此由 casbin-ucon 扩展提供,该扩展将 enforcer 包装起来以提供会话、条件和义务功能。
UCON 与 RBAC 有何不同? RBAC 在访问前基于角色进行一次决策。UCON 可以在使用期间和访问后进行决策,且其属性可在会话活动状态期间发生变化,因此无需等待下次登录即可撤销权限。
何时应使用 UCON? 当访问取决于时间、使用次数、位置或其他变化的上下文,或者策略必须在会话仍在运行时做出反应时。如果请求时的角色检查已足够,请使用 RBAC。
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.