LabHub
배우기 러닝패스 코스

企業認証の連携

組織図の設計とグループ整合性の点検

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 연산으로 합니다. 엔트리 전체를 지우면 안 됩니다.