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 承担动态细粒度约束。通过策略仓库版本化、自动发布与审计联动,可实现高可维护、可追踪的授权治理闭环。