19.2.8 权限、审计与合规模块
权限、审计与合规模块围绕“最小权限、可追溯、可审计、可合规”构建,以统一身份与权限中心(IAM)对接资产管理与资源编排平台,打通账号、角色、资源与动作授权链路。建议以 RBAC 为主、ABAC 为辅:角色定义职能(运维、开发、审计、DBA),属性结合环境、资源标签、时间窗、工单状态等做细粒度控制,保证同一资源在不同场景下权限边界清晰。
权限模型与示例#
权限模型需覆盖:资产视图、编排操作、变更执行、凭据与密钥、自动化任务、API 调用等。对高风险操作引入强制审批与双人复核(4-eyes),支持短期临时授权与到期自动回收。
示例:使用 Casbin(RBAC+ABAC)定义策略并加载
- 安装:
# 以 Debian/Ubuntu 为例
sudo apt-get update
sudo apt-get install -y golang
# 初始化项目
mkdir -p /opt/iam && cd /opt/iam
go mod init iam-demo
go get github.com/casbin/casbin/v2
- 配置文件(/opt/iam/model.conf):
[request_definition]
r = sub, obj, act, env
[policy_definition]
p = sub, obj, act, env
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && keyMatch(r.obj, p.obj) && r.act == p.act && (p.env == "*" || r.env == p.env)
- 策略(/opt/iam/policy.csv):
p, ops, /assets/*, read, *
p, ops, /orchestration/*, exec, prod
p, dba, /db/*, admin, prod
g, alice, ops
g, bob, dba
- 验证代码(/opt/iam/main.go):
package main
import (
"fmt"
"github.com/casbin/casbin/v2"
)
func main() {
e, _ := casbin.NewEnforcer("model.conf", "policy.csv")
tests := [][]string{
{"alice", "/assets/host01", "read", "dev"},
{"alice", "/orchestration/app", "exec", "prod"},
{"alice", "/orchestration/app", "exec", "dev"},
{"bob", "/db/mysql01", "admin", "prod"},
}
for _, t := range tests {
ok, _ := e.Enforce(t[0], t[1], t[2], t[3])
fmt.Printf("%v -> %v\n", t, ok)
}
}
- 运行与预期:
cd /opt/iam
go run main.go
# 预期输出:
# [alice /assets/host01 read dev] -> true
# [alice /orchestration/app exec prod] -> true
# [alice /orchestration/app exec dev] -> false
# [bob /db/mysql01 admin prod] -> true
排错提示
- 报错 open model.conf: no such file:确认当前路径与文件名正确。
- 策略不生效:检查 policy.csv 中角色映射是否存在 g 规则,且对象路径匹配 keyMatch。
凭据管理与会话审计#
对接堡垒机或会话代理记录命令级、文件级操作;对接 Vault 动态凭据下发与轮换,杜绝明文泄露。
示例:安装并启用 Vault
# 下载并安装
wget https://releases.hashicorp.com/vault/1.15.3/vault_1.15.3_linux_amd64.zip
unzip vault_1.15.3_linux_amd64.zip
sudo mv vault /usr/local/bin/
# 启动开发模式(测试)
export VAULT_ADDR='http://127.0.0.1:8200'
vault server -dev -dev-root-token-id=root &
示例:启用动态数据库凭据(MySQL)
vault login root
vault secrets enable database
vault write database/config/mysql \
plugin_name=mysql-database-plugin \
connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" \
allowed_roles="readonly" \
username="vaultadmin" \
password="VaultPass123!"
vault write database/roles/readonly \
db_name=mysql \
creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT ON *.* TO '{{name}}'@'%';" \
default_ttl="1h" \
max_ttl="24h"
vault read database/creds/readonly
# 预期输出:返回临时用户名/密码与TTL
排错提示
- permission denied:检查 Vault token 与 policy 权限。
- connection_url 失败:确认 MySQL 账号、权限及端口。
审计日志与不可篡改留存#
审计体系需“全链路、不可篡改、可关联”:登录、授权变更、编排执行、配置变更、资源创建/销毁、API 访问等统一输出到日志与审计平台,支持按用户、资产、时间、工单、任务ID关联查询。关键审计日志建议 WORM/对象存储与哈希校验。
示例:审计事件结构化与转储
{
"event_time": "2024-05-01T12:00:00Z",
"user": "alice",
"action": "orchestration.exec",
"resource": "k8s/cluster-prod",
"ticket_id": "CHG-20240501-001",
"result": "success",
"ip": "10.0.1.10"
}
示例:生成哈希并上传对象存储(以本地为例)
# 生成哈希校验
sha256sum /var/log/audit/audit.log > /var/log/audit/audit.log.sha256
# 模拟归档
tar -czf /var/log/audit/audit-20240501.tar.gz /var/log/audit/audit.log*
# 预期:生成归档文件用于WORM/对象存储
排错提示
- 日志字段不统一:使用 schema 校验(JSON Schema)统一字段。
- 关联查询困难:保证 ticket_id、task_id、resource 为必填字段。
合规模块与基线检查#
合规模块需映射企业与行业规范(等保、ISO27001、PCI-DSS)到控制项,形成资产合规基线、权限合规检查、变更合规检查、账号合规检查。对超期账号、共享账号、过度授权、离职未回收、未备案变更设置自动巡检与闭环处置。
示例:合规基线检查脚本(账号过期)
#!/usr/bin/env bash
# /opt/compliance/check_expired_users.sh
set -e
echo "== 检查过期账号 =="
awk -F: '($8!="" && $8 < (systime()/86400)) {print $1, $8}' /etc/shadow
示例:巡检执行与告警
chmod +x /opt/compliance/check_expired_users.sh
/opt/compliance/check_expired_users.sh > /var/log/compliance/expired_users.log
# 预期:输出已过期账号
与资产管理与编排联动#
编排前校验权限与审批,执行过程中写入审计链路与变更记录,编排完成后回写 CMDB 与合规状态;对跨环境、跨集群操作设置分级策略与限流,支持审计可视化面板跟踪风险热区与高频敏感操作。
示例:编排前置校验(伪API)
curl -X POST http://iam.example.com/authz \
-H "Content-Type: application/json" \
-d '{
"user": "alice",
"action": "orchestration.exec",
"resource": "k8s/cluster-prod",
"env": "prod",
"ticket_id": "CHG-20240501-001"
}'
# 预期:返回 allow/deny
练习#
- 使用 Casbin 新增角色
auditor,只允许read资产与审计日志,验证其对/orchestration/*的exec必须拒绝。 - 在 Vault 中配置另一条
readonly角色,要求 TTL 为 30m,并验证凭据过期后无法登录数据库。 - 设计 5 条审计事件字段规范(必填/可选)并用 JSON Schema 表达。
- 实现一个合规巡检:检测
/etc/sudoers中是否包含NOPASSWD项。
落地清单#
- 权限粒度与角色矩阵
- 审计事件字典
- 合规控制映射表
- 定期复核与应急授权流程
- 不可篡改留存与归档策略