4. 授权与访问控制审计:RBAC、ABAC、最小权限与PAM
授权与访问控制,说白了就是解决「谁能在什么条件下,对什么资源做什么事」。我做了这么多年安全审计,发现大部分数据泄露事件,根子都出在授权模型混乱上。要么权限给得太宽,要么账号没人管。
这一章,我们聚焦四个核心审计点:RBAC 模型、ABAC 模型、最小权限原则、特权账号管理(PAM)。每个点我都会结合实战中的踩坑经历来讲。
核心观点:授权审计不是查文档,是查「实际生效的权限」与「业务需要的权限」之间的差距。差距越大,风险越高。
4.1 RBAC 模型审计:别让角色变成「垃圾桶」
RBAC 是目前最主流的授权模型。它的核心思想很简单:把权限打包成角色,再把角色分配给用户。但我在项目中见过太多「角色膨胀」的情况——角色越来越多,权限越来越乱。
审计 RBAC 时,我通常会检查以下几个关键点:
- 角色定义是否清晰:每个角色是否有明确的职责描述?还是说「管理员」角色什么都能干?
- 角色继承关系是否合理:子角色是否继承了不该有的权限?
- 角色分配是否最小化:用户是否拥有超过其工作需要的角色?
- 角色变更是否有审批:谁有权创建、修改、删除角色?
我的经验:有一次审计一家金融公司,发现一个叫「临时运维」的角色居然有数据库 DROP 权限。问下来才知道,这个角色是三年前为了某个紧急故障创建的,用完就没人管了。嗯,这种「僵尸角色」在 RBAC 系统里非常常见。
审计 RBAC 时,我建议用以下 SQL 或脚本去拉取实际数据:
-- 检查角色权限分配情况
SELECT
r.role_name,
COUNT(DISTINCT up.permission_id) AS permission_count,
COUNT(DISTINCT ur.user_id) AS user_count
FROM roles r
LEFT JOIN role_permissions up ON r.role_id = up.role_id
LEFT JOIN user_roles ur ON r.role_id = ur.role_id
GROUP BY r.role_name
HAVING permission_count > 50 OR user_count = 0;
这个查询能帮你快速定位「权限过多」或「无人使用」的角色。我个人习惯把结果导出成表格,然后逐条跟业务负责人确认。
4.2 ABAC 模型审计:属性策略的「隐形漏洞」
ABAC 比 RBAC 更灵活,它基于用户属性、资源属性、环境条件来做决策。但灵活也意味着复杂,复杂就容易出漏洞。
审计 ABAC 时,我重点关注:
- 属性来源是否可靠:用户部门、职级这些属性是从 HR 系统同步的,还是手动维护的?
- 策略规则是否冲突:两条策略对同一资源做出相反决策时,系统怎么处理?
- 策略变更是否有审计日志:谁在什么时候改了什么策略?
- 默认拒绝是否生效:没有匹配到任何策略时,是拒绝还是允许?
我曾经踩过的坑:某次审计发现,ABAC 策略引擎的「默认行为」配置成了「允许」。这意味着任何未匹配到策略的请求都会被放行。你想想看,这相当于你家大门没锁,谁都能进。后来我每次审计 ABAC,第一件事就是检查默认策略。
ABAC 策略审计的一个实用方法,是进行「策略覆盖分析」:
| 审计项 | 检查方法 | 风险等级 |
|---|---|---|
| 属性源可靠性 | 检查属性同步机制和更新频率 | 高 |
| 策略冲突检测 | 使用策略分析工具扫描冲突规则 | 高 |
| 默认策略行为 | 查看引擎配置,确认是 deny 还是 permit | 严重 |
| 策略变更日志 | 检查审计日志是否完整保留 | 中 |
4.3 最小权限原则核查:权限收敛的「手术刀」
最小权限原则说起来简单——给用户刚刚好的权限,不多不少。但实际执行起来,阻力往往来自业务部门:「万一以后要用呢?」
我个人习惯用「权限基线法」来做核查:
- 定义基线:每个岗位完成本职工作所需的最小权限集合。
- 扫描实际权限:从系统中导出所有用户的实际权限分配。
- 对比差异:找出实际权限超出基线的部分。
- 逐条确认:跟业务负责人确认每条超额权限是否真的需要。
- 收敛清理:对不需要的权限进行回收。
关键指标:权限收敛率 = (已清理的超额权限数 / 发现的超额权限总数) × 100%。我一般要求这个指标达到 95% 以上才算合格。
审计时,我还会特别关注「权限继承」带来的隐蔽风险。比如,一个用户被分配到「部门经理」角色,而这个角色又继承了「系统管理员」角色的权限。用户可能自己都不知道自己有这么高的权限。
4.4 特权账号管理(PAM)审计:守住最后一道防线
特权账号——root、admin、sa——这些账号一旦失守,整个系统就完了。PAM 审计的核心,就是确保这些账号被严格管控。
我审计 PAM 时,会重点检查以下几个方面:
- 特权账号发现:是否所有特权账号都被纳管?有没有「影子账号」?
- 密码管理:密码是否定期轮换?是否使用强密码?是否存储在保险库中?
- 会话审计:特权操作是否被录屏或记录?谁在什么时候执行了什么命令?
- 临时授权:特权权限是否按需申请、按时回收?
- 共享账号:是否存在多人共用一个特权账号的情况?
我的建议:对于共享账号,一定要启用「先登录 PAM 系统,再通过 PAM 跳转到目标设备」的流程。这样每个人都能被唯一标识,出了问题也能追溯到人。我曾经见过一个团队 12 个人共用一个 root 密码,出了安全事件谁都说不清楚是谁操作的。
PAM 审计的一个实用检查清单:
| 检查项 | 合格标准 | 常见问题 |
|---|---|---|
| 特权账号清单 | 100% 纳管,无遗漏 | 本地管理员账号未纳入 |
| 密码轮换周期 | 不超过 90 天 | 轮换策略未生效 |
| 会话录屏 | 100% 记录,保存 ≥ 180 天 | 录屏文件损坏或丢失 |
| 临时授权审批 | 100% 有审批记录 | 事后补审批单 |
| 共享账号禁用 | 无共享账号,或已启用 PAM 跳转 | 多人共用同一账号 |
审计 PAM 时,我还会做一次「红队测试」:尝试绕过 PAM 系统直接登录目标设备。如果发现存在未纳管的 SSH 密钥或本地账号,那就是严重漏洞。
注意:PAM 系统本身也可能成为攻击目标。一定要确保 PAM 服务器自身的安全加固,包括双因素认证、最小化安装、定期漏洞扫描。我见过不止一次 PAM 系统被攻破,结果所有特权账号密码一次性泄露。
好了,授权与访问控制审计的核心内容就是这些。RBAC 看角色是否膨胀,ABAC 看策略是否冲突,最小权限看基线是否收敛,PAM 看特权是否可控。把这四个点抓牢,身份安全核查就完成了一大半。