アカウント監査レポートの自動生成
目標
人事名簿とLDAPディレクトリを突合して、幽霊アカウント・未作成アカウント・特権の幽霊アカウント・長期未ログインのアカウントをスクリプトで取り出し、隔離処理のあとに監査レポートを作成できるようになります。
なぜ重要なのか
「退職者のアカウントはただちに無効化されますか」は、すべてのセキュリティ監査の最初の質問です。そして、ほとんどの組織は、この突合を四半期に1回、人がExcelで行います。その間に事故が起きます。幽霊アカウントが生まれる理由は、怠慢ではなく構造です。増分同期は削除を検出できず、プロビジョニング(SCIM)がないと、個別のシステムにアカウントがそのまま残ります。この突合を毎週自動で回せれば、監査対応ではなく運用になります。
ステップ
- 準備: slapdを1389で起動し、
00-base、10-people、20-groupsをロードしておきます。 - ディレクトリのすべての
inetOrgPersonを取り出して、/root/audit/ldap_users.csvを作成してください。1行目はuid,cn,ou,titleで、uidの昇順で並べ替えます。 /opt/lab/fixtures/auth/audit/hr_roster.csvを/root/audit/hr.csvにコピーしてください。(内容が同じである必要があります)- ディレクトリにはあるが、HR名簿にはないuidを、1行に1つずつ昇順で
/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=Disabledのエントリを先に作る必要があります。)移動後は、ou=Peopleでは照会されない必要があり、ou=Disabledのエントリ数が幽霊アカウント数と同じである必要があります。 /root/audit/report.mdを作成してください。## 총계、## 유령 계정、## 미생성 계정、## 특권 계정、## 휴면 후보、## 조치 계획(韓国語の見出しで、順に総計、幽霊アカウント、未作成アカウント、特権アカウント、休眠の候補、対応計画を意味します)の6つのh2見出しが必要で、次の5行が正確に含まれている必要があります。
(山括弧の中の韓国語はプレースホルダーで、順にディレクトリの全ユーザー数(隔離を含む)、幽霊アカウント数、未作成アカウント数、特権の幽霊アカウント数、90日ログインがないアカウント数です。)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>"(プレースホルダーは既存のDNです) - よくあるミス1:
commにソートされていない入力を渡すことです。結果が静かに間違います。 - よくあるミス2: CSVのヘッダー行をuid一覧に含めてしまうことです。
- よくあるミス3: 幽霊アカウントを削除することです。監査証跡と参照整合性のため、隔離が原則です。
ディレクトリのアカウント抽出
ディレクトリのすべてのinetOrgPersonを取り出して、/root/audit/ldap_users.csvを作成してください。
1行目はuid,cn,ou,titleで、uidの昇順で並べ替えます。
必要な属性だけを取り出す必要があります。出力形式をCSVにそろえるには、ldapsearchの結果を加工する必要がありますが、-LLLで余分なものを減らしてから始めてください。
人事名簿の確保
/opt/lab/fixtures/auth/audit/hr_roster.csvを/root/audit/hr.csvにコピーしてください。(内容が同じである必要があります)
元のファイルには触れず、コピーで作業します。件数を先に数えておけば、あとの集合演算の結果を検算できます。
幽霊アカウントの抽出
ディレクトリにはあるが、HR名簿にはないuidを、1行に1つずつ昇順で/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のエントリを先に作る必要があります。)
移動後は、ou=Peopleでは照会されない必要があり、ou=Disabledのエントリ数が幽霊アカウント数と同じである必要があります。
アカウントを削除せずに隔離する理由を考えてみてください。移動後もデータは残る必要があり、「有効なユーザー」の検索からは外れる必要があります。
監査レポートの作成
/root/audit/report.mdを作成してください。
## 총계、## 유령 계정、## 미생성 계정、## 특권 계정、## 휴면 후보、## 조치 계획(韓国語の見出しで、順に総計、幽霊アカウント、未作成アカウント、特権アカウント、休眠の候補、対応計画を意味します)の6つのh2見出しが必要で、次の5行が正確に含まれている必要があります。
total=<디렉터리 전체 사용자 수(격리 포함)>
ghost=<유령 계정 수>
missing=<미생성 계정 수>
critical=<특권 유령 계정 수>
stale=<90일 미접속 계정 수>
(山括弧の中の韓国語はプレースホルダーで、順にディレクトリの全ユーザー数(隔離を含む)、幽霊アカウント数、未作成アカウント数、特権の幽霊アカウント数、90日ログインがないアカウント数です。)
レポートの価値は、数字とトレンドにあります。前のステップで求めた数値をそのまま引用し、各項目に対応計画を付けてください。