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_idtask_idresource 为必填字段。

合规模块与基线检查#

合规模块需映射企业与行业规范(等保、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

练习#

  1. 使用 Casbin 新增角色 auditor,只允许 read 资产与审计日志,验证其对 /orchestration/*exec 必须拒绝。
  2. 在 Vault 中配置另一条 readonly 角色,要求 TTL 为 30m,并验证凭据过期后无法登录数据库。
  3. 设计 5 条审计事件字段规范(必填/可选)并用 JSON Schema 表达。
  4. 实现一个合规巡检:检测 /etc/sudoers 中是否包含 NOPASSWD 项。

落地清单#

  • 权限粒度与角色矩阵
  • 审计事件字典
  • 合规控制映射表
  • 定期复核与应急授权流程
  • 不可篡改留存与归档策略