Enterprise Authentication Integration
Designing the Org Tree and Checking Group Integrity
한국어 원문으로 표시합니다.
목표
조직 구조(OU)와 역할 그룹을 직접 설계·적재하고, 인사이동을 반영하고, 끊어진 그룹 멤버십을 스크립트로 탐지해 정리할 수 있게 됩니다.
왜 중요한가
LDAP 그룹의 member 는 그냥 DN 문자열입니다. 그 DN 이 실제로 존재하는지
서버가 검사해 주지 않습니다. 그래서 사용자를 지우면 그룹에는 그 사람의 DN 이
그대로 남습니다. 이 끊어진 멤버십은 조용히 쌓이다가, 권한 감사 때
"이 그룹 멤버가 12명인데 실제 재직자는 9명"이라는 지적으로 돌아옵니다.
또 하나 — 조직도를 그대로 트리에 옮기면 인사이동마다 DN 이 바뀌고,
DN 을 연결 키로 쓰던 연동 시스템이 전부 깨집니다. 무엇을 트리로 두고
무엇을 속성으로 둘지가 이 실습의 진짜 주제입니다.
단계
- 준비: slapd 를 1389 로 기동하고
00-base,10-people,20-groups, 그리고/opt/lab/fixtures/auth/ldif/30-legacy.ldif까지 적재해 둡니다. /root/ldap/org.csv를 만듭니다. 첫 줄은ou_name,parent_ou,manager_uid.ou=Org아래에 둘 조직 6개 이상을 적습니다.parent_ou가Org가 아닌 행(2단계 조직)이 최소 2개 있어야 하고,manager_uid는 디렉터리에 실제 존재하는 uid 여야 합니다.- 설계표대로
/root/ldap/org.ldif를 작성합니다. 먼저ou=Org,dc=labhub,dc=co,dc=kr을 만들고 그 아래에 조직들을 둡니다. 각 엔트리는objectClass: organizationalUnit이어야 합니다. org.ldif를 적재합니다.ou=Org하위에 organizationalUnit 이 설계표의 행 수만큼 있어야 합니다.ou=Groups아래에 역할 그룹 세 개를 만듭니다.cn=role-admin,cn=role-approver,cn=role-viewer. 각 그룹은member를 2명 이상 가져야 하고, 모든 member DN 은 실제 존재하는 사용자여야 합니다.cn=role-admin의 member 에cn=role-approver의 DN 을 추가합니다(중첩 그룹).uid=kim을ou=People에서ou=Org아래의 조직 중 하나로 이동시킵니다. 이동 후 원래 위치에서는 조회되지 않아야 합니다. 그리고 그를member로 갖고 있던 그룹들의member도 새 DN 으로 함께 고치세요. 서버는 그룹을 따라 고쳐 주지 않습니다. 그대로 두면 kim 의 옛 DN 이 끊어진 멤버십으로 남아 7단계에서 2건이 나오고, 그 단계를 통과할 수 없습니다./root/ldap/orgcheck.sh를 만듭니다. 모든groupOfNames의memberDN 중 실제로 존재하지 않는 DN 을 찾아 한 줄에 하나씩 출력하고, 하나라도 있으면 0 이 아닌 종료코드로 끝냅니다. 실행 결과로 발견한 DN 을/root/ldap/dangling.txt에 저장하세요. (30-legacy.ldif가 적재한 그룹에 하나가 숨어 있습니다.)- 7단계에서 찾은 끊어진 member 를 해당 그룹에서 제거하고,
orgcheck.sh를 다시 실행했을 때 종료코드 0 이 나오게 합니다. 그룹 엔트리 자체는 남아 있어야 합니다.
참고
- 엔트리 존재 확인:
ldapsearch -x -H ... -b "<DN>" -s base -LLL "(objectClass=*)" dn - 속성 삭제:
ldapmodify에changetype: modify/delete: member/member: <DN> - 부모까지 바꾸는 이동:
ldapmodrdn -r -s "<새 상위 DN>" "<기존 DN>" "<새 RDN>" - 흔한 실수 1: 조직도를 그대로 DN 에 넣어 인사이동마다 DN 이 바뀌게 만드는 것.
- 흔한 실수 2:
groupOfNames에 member 없이 만들려다 스키마 위반을 만나는 것. - 흔한 실수 3: 끊어진 멤버십을 정리한다며 그룹 엔트리를 통째로 지우는 것.
조직 구조 설계표
/root/ldap/org.csv 를 만듭니다. 첫 줄은 ou_name,parent_ou,manager_uid.
ou=Org 아래에 둘 조직 6개 이상을 적습니다.
parent_ou 가 Org 가 아닌 행(2단계 조직)이 최소 2개 있어야 하고,
manager_uid 는 디렉터리에 실제 존재하는 uid 여야 합니다.
조직도는 회사 조직표를 그대로 옮기는 것이 아닙니다. 인사이동이 잦은 축을 DN 에 넣으면 DN 이 계속 바뀝니다. 무엇을 트리로 하고 무엇을 속성/그룹으로 할지가 설계입니다.
OU LDIF 작성
설계표대로 /root/ldap/org.ldif 를 작성합니다.
먼저 ou=Org,dc=labhub,dc=co,dc=kr 을 만들고 그 아래에 조직들을 둡니다.
각 엔트리는 objectClass: organizationalUnit 이어야 합니다.
LDIF 는 dn 줄로 시작해 빈 줄로 구분됩니다. organizationalUnit 은 ou 속성이 필수입니다. 부모가 먼저 나와야 합니다.
조직 적재
org.ldif 를 적재합니다. ou=Org 하위에 organizationalUnit 이
설계표의 행 수만큼 있어야 합니다.
적재 실패는 대개 부모 엔트리 부재이거나 스키마 위반입니다. 오류 메시지를 그대로 읽으면 어떤 DN 에서 멈췄는지 알려 줍니다.
역할 그룹 생성
ou=Groups 아래에 역할 그룹 세 개를 만듭니다.
cn=role-admin, cn=role-approver, cn=role-viewer.
각 그룹은 member 를 2명 이상 가져야 하고, 모든 member DN 은
실제 존재하는 사용자여야 합니다.
부서 그룹과 역할 그룹은 다릅니다. 부서는 조직 개편으로 바뀌고 역할은 업무 권한입니다. 둘을 섞으면 조직 개편 때마다 권한이 무너집니다.
중첩 그룹
cn=role-admin 의 member 에 cn=role-approver 의 DN 을 추가합니다(중첩 그룹).
그룹의 member 에 다른 그룹의 DN 을 넣을 수 있습니다. 다만 이걸 해석하는 것은 클라이언트의 몫이라, 재귀 전개를 지원하는지 확인이 필요합니다.
인사이동 반영
uid=kim 을 ou=People 에서 ou=Org 아래의 조직 중 하나로 이동시킵니다.
이동 후 원래 위치에서는 조회되지 않아야 합니다.
그리고 그를 member 로 갖고 있던 그룹들의 member 도 새 DN 으로 함께 고치세요.
서버는 그룹을 따라 고쳐 주지 않습니다. 그대로 두면 kim 의 옛 DN 이 끊어진
멤버십으로 남아 7단계에서 2건이 나오고, 그 단계를 통과할 수 없습니다.
DN 이 바뀌는 이동은 modrdn 계열 연산으로 합니다. 부모가 바뀌는 경우 새 상위 DN 도 함께 지정해야 합니다.
끊어진 멤버십 탐지
/root/ldap/orgcheck.sh 를 만듭니다. 모든 groupOfNames 의 member DN 중
실제로 존재하지 않는 DN 을 찾아 한 줄에 하나씩 출력하고,
하나라도 있으면 0 이 아닌 종료코드로 끝냅니다.
실행 결과로 발견한 DN 을 /root/ldap/dangling.txt 에 저장하세요.
(30-legacy.ldif 가 적재한 그룹에 하나가 숨어 있습니다.)
그룹의 member 에는 DN 문자열이 들어갈 뿐, 그 DN 이 실제로 존재하는지는 서버가 강제하지 않습니다. 각 member DN 을 base 로 조회해 보면 알 수 있습니다.
정리와 재검증
7단계에서 찾은 끊어진 member 를 해당 그룹에서 제거하고,
orgcheck.sh 를 다시 실행했을 때 종료코드 0 이 나오게 합니다.
그룹 엔트리 자체는 남아 있어야 합니다.
속성 하나만 지우는 것은 ldapmodify 의 delete 연산으로 합니다. 엔트리 전체를 지우면 안 됩니다.