LabHub
배우기 러닝패스 코스

Enterprise Authentication Integration

Generating an Account Audit Report Automatically

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

인사 명부와 LDAP 디렉터리를 대사(對査)해 유령 계정·미생성 계정·특권 유령 계정· 장기 미접속 계정을 스크립트로 뽑아내고, 격리 처리 후 감사 리포트를 작성할 수 있게 됩니다.

왜 중요한가

"퇴사자 계정이 즉시 비활성화됩니까"는 모든 보안 감사의 첫 질문입니다. 그리고 대부분의 조직은 이 대사를 분기에 한 번 사람이 엑셀로 합니다. 그 사이에 사고가 납니다. 유령 계정이 생기는 이유는 게으름이 아니라 구조입니다 — 증분 동기화는 삭제를 감지하지 못하고, 프로비저닝(SCIM)이 없으면 개별 시스템에 계정이 그대로 남습니다. 이 대사를 매주 자동으로 돌릴 수 있으면 감사 대응이 아니라 운영이 됩니다.

단계

  1. 준비: slapd 를 1389 로 기동하고 00-base, 10-people, 20-groups 를 적재해 둡니다.
  2. 디렉터리의 모든 inetOrgPerson 을 뽑아 /root/audit/ldap_users.csv 를 만듭니다. 첫 줄은 uid,cn,ou,title, uid 오름차순 정렬입니다.
  3. /opt/lab/fixtures/auth/audit/hr_roster.csv/root/audit/hr.csv 로 복사합니다. (내용 동일해야 합니다)
  4. 디렉터리에는 있는데 HR 명부에는 없는 uid 를 한 줄에 하나씩 오름차순으로 /root/audit/ghost.txt 에 저장합니다.
  5. HR 명부에는 있는데 디렉터리에는 없는 uid 를 같은 형식으로 /root/audit/missing.txt 에 저장합니다.
  6. 유령 계정 중 cn=admins,ou=Groups,dc=labhub,dc=co,dc=kr 그룹의 member 인 것을 골라 /root/audit/critical.txt 에 저장합니다.
  7. /opt/lab/fixtures/auth/audit/lastlogin.csv 를 기준으로, 2026-08-01 기준 90일 이상 미접속인 uid 를 /root/audit/stale.txt 에 오름차순으로 저장합니다. (파일에 없는 uid 는 '접속 이력 없음'으로 보고 대상에 포함합니다.)
  8. 유령 계정을 모두 ou=Disabled,dc=labhub,dc=co,dc=kr 아래로 이동시킵니다. (ou=Disabled 엔트리를 먼저 만들어야 합니다.) 이동 후 ou=People 에서는 조회되지 않아야 하고, ou=Disabled 의 엔트리 수가 유령 계정 수와 같아야 합니다.
  9. /root/audit/report.md 를 작성합니다. ## 총계, ## 유령 계정, ## 미생성 계정, ## 특권 계정, ## 휴면 후보, ## 조치 계획 여섯 개의 h2 제목이 있어야 하고, 아래 다섯 줄이 정확히 들어가야 합니다.
    total=<디렉터리 전체 사용자 수(격리 포함)>
    ghost=<유령 계정 수>
    missing=<미생성 계정 수>
    critical=<특권 유령 계정 수>
    stale=<90일 미접속 계정 수>
    

참고

디렉터리 계정 추출

디렉터리의 모든 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일 미접속 계정 수>

리포트의 가치는 숫자와 추세에 있습니다. 앞 단계에서 구한 수치를 그대로 인용하고, 각 항목에 조치 계획을 붙이세요.