自动生成账号审计报告
目标
通过脚本核对 HR 名册与 LDAP 目录,找出幽灵账户、未创建账户、特权幽灵账户和长期未登录账户,并在隔离处理后编写审计报告。
为什么重要
“离职人员的账户是否会立即停用?”是所有安全审计首先提出的问题。然而,大多数组织仍每季度安排人员在 Excel 中手工核对一次,事故就发生在两次核对之间。幽灵账户的产生并非因为懒惰,而是结构性问题——增量同步无法发现删除;没有预配机制(SCIM)时,账户会继续留在各个系统中。如果能每周自动执行这项核对,它就不再只是应付审计,而会成为日常运营。
步骤
- 准备:在 1389 端口启动 slapd,并加载
00-base、10-people、20-groups。 - 导出目录中的所有
inetOrgPerson,生成/root/audit/ldap_users.csv。第一行为uid,cn,ou,title,按 uid 升序排列。 - 将
/opt/lab/fixtures/auth/audit/hr_roster.csv复制到/root/audit/hr.csv。(内容必须完全一致) - 将目录中存在但 HR 名册中不存在的 uid 每行一个、按升序保存到
/root/audit/ghost.txt。 - 将HR 名册中存在但目录中不存在的 uid 以相同格式保存到
/root/audit/missing.txt。 - 从幽灵账户中找出属于
cn=admins,ou=Groups,dc=labhub,dc=co,dc=kr组的 member,保存到/root/audit/critical.txt。 - 以
/opt/lab/fixtures/auth/audit/lastlogin.csv为依据,将截至 2026-08-01 已有 90 天以上未登录的 uid 按升序保存到/root/audit/stale.txt。(文件中没有的 uid 视为“无登录记录”,也应包含在内。) - 将所有幽灵账户移动到
ou=Disabled,dc=labhub,dc=co,dc=kr下。(必须先创建ou=Disabledentry。)移动后,在ou=People中不得再查到这些账户,且ou=Disabled的 entry 数量必须与幽灵账户数量相同。 - 编写
/root/audit/report.md。必须包含## 총계、## 유령 계정、## 미생성 계정、## 특권 계정、## 휴면 후보、## 조치 계획六个 h2 标题,并原样包含以下五行。total=<디렉터리 전체 사용자 수(격리 포함)> ghost=<유령 계정 수> missing=<미생성 계정 수> critical=<특권 유령 계정 수> stale=<90일 미접속 계정 수>
参考
- 差集:
comm -23 <(sort a.txt) <(sort b.txt) - 将日期转为秒:
date -d 2026-05-01 +%s - 移动 DN:
ldapmodrdn -r -s "ou=Disabled,dc=labhub,dc=co,dc=kr" "<기존DN>" "uid=<uid>" - 常见错误 1:向
comm提供未排序的输入,结果会静默出错。 - 常见错误 2:把 CSV header 行包含在 uid 列表中。
- 常见错误 3:删除幽灵账户。为了保留审计轨迹和引用完整性,原则上应进行隔离。
导出目录账户
导出目录中的所有 inetOrgPerson,生成 /root/audit/ldap_users.csv。
第一行为 uid,cn,ou,title,按 uid 升序排列。
只导出所需属性。要把 ldapsearch 结果整理为 CSV,可先使用 -LLL 减少多余输出。
获取 HR 名册
将 /opt/lab/fixtures/auth/audit/hr_roster.csv 复制到
/root/audit/hr.csv。(内容必须完全一致)
不要改动原文件,请使用副本操作。先统计条目数,之后可据此核对集合运算结果。
提取幽灵账户
将目录中存在但 HR 名册中不存在的 uid 每行一个、按升序保存到
/root/audit/ghost.txt。
先对两侧 uid 列表排序,再求差集。comm 只有在输入已排序时才能得到正确结果。
提取未创建账户
将HR 名册中存在但目录中不存在的 uid 以相同格式保存到
/root/audit/missing.txt。
这是方向相反的差集。请记住,这份列表反映的是业务延迟指标,而不是安全问题。
识别特权幽灵账户
从幽灵账户中找出属于 cn=admins,ou=Groups,dc=labhub,dc=co,dc=kr 组的
member,保存到 /root/audit/critical.txt。
这是幽灵账户列表与管理员组成员列表的交集,也是审计中优先级最高的处置对象。
识别长期未登录账户
以 /opt/lab/fixtures/auth/audit/lastlogin.csv 为依据,
将截至 2026-08-01 已有 90 天以上未登录的 uid
按升序保存到 /root/audit/stale.txt。
(文件中没有的 uid 视为“无登录记录”,也应包含在内。)
基准日期必须固定,结果才能复现。可以使用 date 命令把日期转为秒后比较。
隔离账户
将所有幽灵账户移动到 ou=Disabled,dc=labhub,dc=co,dc=kr 下。
(必须先创建 ou=Disabled entry。)
移动后,在 ou=People 中不得再查到这些账户,且
ou=Disabled 的 entry 数量必须与幽灵账户数量相同。
想一想为什么要隔离而不是删除账户。移动后数据仍应保留,但不再出现在“活跃用户”搜索结果中。
编写审计报告
编写 /root/audit/report.md。
必须包含 ## 총계、## 유령 계정、## 미생성 계정、## 특권 계정、## 휴면 후보、
## 조치 계획 六个 h2 标题,并原样包含以下五行。
total=<디렉터리 전체 사용자 수(격리 포함)>
ghost=<유령 계정 수>
missing=<미생성 계정 수>
critical=<특권 유령 계정 수>
stale=<90일 미접속 계정 수>
报告的价值在于数字和趋势。直接引用前面步骤得到的数值,并为每项附上处置计划。