19.8.4 授权模型(RBAC/ABAC)与策略管理

授权模型是运维平台安全与权限体系的核心,决定“谁在什么条件下可以做什么”。本节以 RBAC/ABAC 及策略管理为主线,给出落地要点与可执行示例。

原理与架构草图#

文章图片
  • RBAC:用户→角色→权限(资源+动作)三层映射,适合角色稳定场景。
  • ABAC:主体/资源/行为/上下文多维属性,适合细粒度动态控制。
  • 混合模型:RBAC 定义基础权限,ABAC 追加环境/时间/工单等约束。

RBAC 数据模型示例(SQL)#

-- 用户、角色、权限、资源
CREATE TABLE users(id INT PRIMARY KEY, username VARCHAR(64), dept VARCHAR(64));
CREATE TABLE roles(id INT PRIMARY KEY, name VARCHAR(64));
CREATE TABLE permissions(id INT PRIMARY KEY, action VARCHAR(32), resource VARCHAR(64));

-- 关系表
CREATE TABLE user_role(user_id INT, role_id INT);
CREATE TABLE role_perm(role_id INT, perm_id INT);

-- 示例数据
INSERT INTO roles VALUES(1,'platform_admin'),(2,'dba'),(3,'dev');
INSERT INTO permissions VALUES
(1,'read','host'),(2,'change','host'),(3,'deploy','app'),(4,'read','db'),(5,'change','db');
INSERT INTO user_role VALUES(1001,2);
INSERT INTO role_perm VALUES(2,4),(2,5);

-- 解释:用户1001为dba,可对db执行read/change

ABAC 策略示例(OPA/Rego)#

1)安装与运行(Docker)#

# 拉取 OPA 并启动
docker pull openpolicyagent/opa:latest
docker run --rm -p 8181:8181 --name opa \
  -v $PWD/policies:/policies \
  openpolicyagent/opa:latest run --server /policies
# 说明:/policies 中保存策略文件,OPA HTTP端口8181

2)策略文件(/policies/ops.rego)#

package ops.authz

default allow = false

# RBAC:角色具备动作权限
allow {
  input.subject.role == "dba"
  input.action == "change"
  input.resource.type == "db"
}

# ABAC:仅工作时间内允许变更生产环境
allow {
  input.subject.role == "dba"
  input.action == "change"
  input.resource.type == "db"
  input.resource.env == "prod"
  input.context.time >= "09:00"
  input.context.time <= "18:00"
  input.context.network == "intranet"
  input.context.ticket == "approved"
}

3)策略评估与命令说明#

# 构造请求体
cat > /tmp/input.json <<'EOF'
{
  "subject": {"user":"lihua","role":"dba","dept":"infra"},
  "action": "change",
  "resource": {"type":"db","name":"orders","env":"prod"},
  "context": {"time":"10:30","network":"intranet","ticket":"approved"}
}
EOF

# 调用 OPA 进行策略判断
curl -s -X POST \
  -H "Content-Type: application/json" \
  --data @/tmp/input.json \
  http://localhost:8181/v1/data/ops/authz/allow | jq

# 预期结果:{"result":true}

策略管理与发布流程示例(Git 版本化)#

# 策略仓库结构
ops-policy/
  policies/ops.rego
  data/roles.json
  CHANGELOG.md

# 策略变更
git add policies/ops.rego
git commit -m "feat: restrict prod change to intranet+worktime+ticket"
git tag v1.2.0
git push origin main --tags

说明:通过 Git 版本化策略,配合平台发布流程实现灰度、回滚与审计。

关键命令说明(OPA)#

  • opa run --server /policies:以服务模式启动并加载策略目录。
  • curl ... /v1/data/ops/authz/allow:调用策略决策点接口。
  • jq:格式化输出结果,便于调试。

常见故障与排错#

1) 策略未生效

# 检查策略是否加载
curl -s http://localhost:8181/v1/policies | jq
# 若为空,检查容器挂载路径 /policies 是否正确
docker exec -it opa ls /policies

2) 返回 always false

# 启用 OPA 解释模式检查匹配路径
curl -s -X POST \
  -H "Content-Type: application/json" \
  --data @/tmp/input.json \
  "http://localhost:8181/v1/data/ops/authz/allow?explain=full" | jq

3) 时间比较问题
- 确保时间字段格式一致,如 "10:30"
- 若需更复杂时间范围,建议转换为分钟数后比较。

练习#

1) 将 ABAC 增加条件:仅在 context.geo == "CN" 时允许变更。
2) 为角色 dev 增加仅允许 resource.env == "dev" 的部署权限。
3) 编写脚本批量验证 10 条策略请求,统计允许/拒绝比例。

小结#

RBAC 提供清晰角色边界,ABAC 承担动态细粒度约束。通过策略仓库版本化、自动发布与审计联动,可实现高可维护、可追踪的授权治理闭环。