アカウント監査レポートの自動生成
한국어 원문으로 표시합니다.
목표
인사 명부와 LDAP 디렉터리를 대사(對査)해 유령 계정·미생성 계정·특권 유령 계정· 장기 미접속 계정을 스크립트로 뽑아내고, 격리 처리 후 감사 리포트를 작성할 수 있게 됩니다.
왜 중요한가
"퇴사자 계정이 즉시 비활성화됩니까"는 모든 보안 감사의 첫 질문입니다. 그리고 대부분의 조직은 이 대사를 분기에 한 번 사람이 엑셀로 합니다. 그 사이에 사고가 납니다. 유령 계정이 생기는 이유는 게으름이 아니라 구조입니다 — 증분 동기화는 삭제를 감지하지 못하고, 프로비저닝(SCIM)이 없으면 개별 시스템에 계정이 그대로 남습니다. 이 대사를 매주 자동으로 돌릴 수 있으면 감사 대응이 아니라 운영이 됩니다.
단계
- 준비: slapd 를 1389 로 기동하고
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=Disabled엔트리를 먼저 만들어야 합니다.) 이동 후ou=People에서는 조회되지 않아야 하고,ou=Disabled의 엔트리 수가 유령 계정 수와 같아야 합니다. /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 헤더 줄을 uid 목록에 포함시키는 것.
- 흔한 실수 3: 유령 계정을 삭제하는 것. 감사 추적과 참조 무결성 때문에 격리가 원칙입니다.
디렉터리 계정 추출
디렉터리의 모든 inetOrgPerson 을 뽑아 /root/audit/ldap_users.csv 를 만듭니다.
첫 줄은 uid,cn,ou,title, uid 오름차순 정렬입니다.
필요한 속성만 뽑아야 합니다. 출력 형식을 CSV 로 맞추려면 ldapsearch 결과를 가공해야 하는데, -LLL 로 군더더기를 줄이고 시작하세요.
인사 명부 확보
/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 엔트리를 먼저 만들어야 합니다.)
이동 후 ou=People 에서는 조회되지 않아야 하고,
ou=Disabled 의 엔트리 수가 유령 계정 수와 같아야 합니다.
계정을 지우지 않고 격리하는 이유를 생각해 보세요. 이동 후에도 데이터는 남아야 하고, '활성 사용자' 검색에서는 빠져야 합니다.
감사 리포트 작성
/root/audit/report.md 를 작성합니다.
## 총계, ## 유령 계정, ## 미생성 계정, ## 특권 계정, ## 휴면 후보,
## 조치 계획 여섯 개의 h2 제목이 있어야 하고, 아래 다섯 줄이 정확히 들어가야 합니다.
total=<디렉터리 전체 사용자 수(격리 포함)>
ghost=<유령 계정 수>
missing=<미생성 계정 수>
critical=<특권 유령 계정 수>
stale=<90일 미접속 계정 수>
리포트의 가치는 숫자와 추세에 있습니다. 앞 단계에서 구한 수치를 그대로 인용하고, 각 항목에 조치 계획을 붙이세요.