LabHub
배우기 러닝패스 코스

Enterprise Authentication Integration

Designing the Org Tree and Checking Group Integrity

LabHub 에서 이어서 보기

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

목표

조직 구조(OU)와 역할 그룹을 직접 설계·적재하고, 인사이동을 반영하고, 끊어진 그룹 멤버십을 스크립트로 탐지해 정리할 수 있게 됩니다.

왜 중요한가

LDAP 그룹의 member 는 그냥 DN 문자열입니다. 그 DN 이 실제로 존재하는지 서버가 검사해 주지 않습니다. 그래서 사용자를 지우면 그룹에는 그 사람의 DN 이 그대로 남습니다. 이 끊어진 멤버십은 조용히 쌓이다가, 권한 감사 때 "이 그룹 멤버가 12명인데 실제 재직자는 9명"이라는 지적으로 돌아옵니다. 또 하나 — 조직도를 그대로 트리에 옮기면 인사이동마다 DN 이 바뀌고, DN 을 연결 키로 쓰던 연동 시스템이 전부 깨집니다. 무엇을 트리로 두고 무엇을 속성으로 둘지가 이 실습의 진짜 주제입니다.

단계

  1. 준비: slapd 를 1389 로 기동하고 00-base, 10-people, 20-groups, 그리고 /opt/lab/fixtures/auth/ldif/30-legacy.ldif 까지 적재해 둡니다.
  2. /root/ldap/org.csv 를 만듭니다. 첫 줄은 ou_name,parent_ou,manager_uid. ou=Org 아래에 둘 조직 6개 이상을 적습니다. parent_ouOrg 가 아닌 행(2단계 조직)이 최소 2개 있어야 하고, manager_uid 는 디렉터리에 실제 존재하는 uid 여야 합니다.
  3. 설계표대로 /root/ldap/org.ldif 를 작성합니다. 먼저 ou=Org,dc=labhub,dc=co,dc=kr 을 만들고 그 아래에 조직들을 둡니다. 각 엔트리는 objectClass: organizationalUnit 이어야 합니다.
  4. org.ldif 를 적재합니다. ou=Org 하위에 organizationalUnit 이 설계표의 행 수만큼 있어야 합니다.
  5. ou=Groups 아래에 역할 그룹 세 개를 만듭니다. cn=role-admin, cn=role-approver, cn=role-viewer. 각 그룹은 member2명 이상 가져야 하고, 모든 member DN 은 실제 존재하는 사용자여야 합니다.
  6. cn=role-admin 의 member 에 cn=role-approver 의 DN 을 추가합니다(중첩 그룹).
  7. uid=kimou=People 에서 ou=Org 아래의 조직 중 하나로 이동시킵니다. 이동 후 원래 위치에서는 조회되지 않아야 합니다. 그리고 그를 member 로 갖고 있던 그룹들의 member 도 새 DN 으로 함께 고치세요. 서버는 그룹을 따라 고쳐 주지 않습니다. 그대로 두면 kim 의 옛 DN 이 끊어진 멤버십으로 남아 7단계에서 2건이 나오고, 그 단계를 통과할 수 없습니다.
  8. /root/ldap/orgcheck.sh 를 만듭니다. 모든 groupOfNamesmember DN 중 실제로 존재하지 않는 DN 을 찾아 한 줄에 하나씩 출력하고, 하나라도 있으면 0 이 아닌 종료코드로 끝냅니다. 실행 결과로 발견한 DN 을 /root/ldap/dangling.txt 에 저장하세요. (30-legacy.ldif 가 적재한 그룹에 하나가 숨어 있습니다.)
  9. 7단계에서 찾은 끊어진 member 를 해당 그룹에서 제거하고, orgcheck.sh 를 다시 실행했을 때 종료코드 0 이 나오게 합니다. 그룹 엔트리 자체는 남아 있어야 합니다.

참고

조직 구조 설계표

/root/ldap/org.csv 를 만듭니다. 첫 줄은 ou_name,parent_ou,manager_uid. ou=Org 아래에 둘 조직 6개 이상을 적습니다. parent_ouOrg 가 아닌 행(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. 각 그룹은 member2명 이상 가져야 하고, 모든 member DN 은 실제 존재하는 사용자여야 합니다.

부서 그룹과 역할 그룹은 다릅니다. 부서는 조직 개편으로 바뀌고 역할은 업무 권한입니다. 둘을 섞으면 조직 개편 때마다 권한이 무너집니다.

중첩 그룹

cn=role-admin 의 member 에 cn=role-approver 의 DN 을 추가합니다(중첩 그룹).

그룹의 member 에 다른 그룹의 DN 을 넣을 수 있습니다. 다만 이걸 해석하는 것은 클라이언트의 몫이라, 재귀 전개를 지원하는지 확인이 필요합니다.

인사이동 반영

uid=kimou=People 에서 ou=Org 아래의 조직 중 하나로 이동시킵니다. 이동 후 원래 위치에서는 조회되지 않아야 합니다. 그리고 그를 member 로 갖고 있던 그룹들의 member 도 새 DN 으로 함께 고치세요. 서버는 그룹을 따라 고쳐 주지 않습니다. 그대로 두면 kim 의 옛 DN 이 끊어진 멤버십으로 남아 7단계에서 2건이 나오고, 그 단계를 통과할 수 없습니다.

DN 이 바뀌는 이동은 modrdn 계열 연산으로 합니다. 부모가 바뀌는 경우 새 상위 DN 도 함께 지정해야 합니다.

끊어진 멤버십 탐지

/root/ldap/orgcheck.sh 를 만듭니다. 모든 groupOfNamesmember DN 중 실제로 존재하지 않는 DN 을 찾아 한 줄에 하나씩 출력하고, 하나라도 있으면 0 이 아닌 종료코드로 끝냅니다. 실행 결과로 발견한 DN 을 /root/ldap/dangling.txt 에 저장하세요. (30-legacy.ldif 가 적재한 그룹에 하나가 숨어 있습니다.)

그룹의 member 에는 DN 문자열이 들어갈 뿐, 그 DN 이 실제로 존재하는지는 서버가 강제하지 않습니다. 각 member DN 을 base 로 조회해 보면 알 수 있습니다.

정리와 재검증

7단계에서 찾은 끊어진 member 를 해당 그룹에서 제거하고, orgcheck.sh 를 다시 실행했을 때 종료코드 0 이 나오게 합니다. 그룹 엔트리 자체는 남아 있어야 합니다.

속성 하나만 지우는 것은 ldapmodify 의 delete 연산으로 합니다. 엔트리 전체를 지우면 안 됩니다.