OpenLDAP 서버

LDAP은 경량 디렉토리 접근 프로토콜(Lightweight Directory Access Protocol)의 약자로, X500 프로토콜의 단순화된 버전입니다. 이 부분의 디렉토리 설정은 인증을 위해 사용될 것입니다. 하지만 LDAP 디렉토리는 인증, (이메일 클라이언트를 위한) 공유 디렉토리 및 모든 종류의 프로그램에서 여러 가지 방식으로 사용될 수 있습니다. LDAP은 널리 사용되는 표준입니다.

LDAP을 간략하게 설명하자면, 모든 정보들은 트리 내에 저장됩니다. 여러분은 디렉토리 구조 (DIT: Directory Information Tree)를 결정해야 합니다. 우리는 루트 상에 다음과 같은 두 개의 노드를 가지는 기본 트리로 시작해 보겠습니다:

여러분은 먼저 LDAP 트리의 루트를 결정해야 합니다. 기본적으로 여러분의 트리는 인터넷 도메인을 통해 정해지게 됩니다. 만약 여러분의 도메인이 example.com이라면 (우리는 예제에서 이것을 사용할 것입니다) 여러분의 루트는 dc=example,dc=com 이 될 것입니다.

설치

가장 먼저 서버에 ldap 서버 데몬 (slapd)을 설치합니다. slapd 꾸러미와 ldap-utils 꾸러미를 설치하세요.

창이 뜨면 여러분의 도메인과 디렉토리 관리자를 위해 필요한 암호를 입력하세요.

기본 설정에서 몇 가지만 수정하면 됩니다. 먼저 /etc/ldap/slapd.conf 파일을 편집하여 (디렉토리 내에서가 아니라) 설정 파일에 루트 비밀번호를 설정합니다.

하지만 평문 텍스트(cleartext) 비밀번호를 사용하지 마십시오. 암호화된 비밀번호를 생성하려면 먼저 slappasswd 명령을 사용하여 여러분의 비밀번호를 입력합니다.

$ slappasswd
New password:
Re-enter password:
{SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m

이 예제에서는 비밀번호로 "secret" 문자열을 사용한 경우에 어떻게 되는지를 보여줍니다. (SSHA 암호화 기법의 특성에 따라, 여러분의 결과는 다르게 보일 것입니다.)

이제 /etc/ldap/slapd.conf 파일을 편집하여 생성된 문자열을 붙여 넣습니다.

# Make sure you edit or add these directives after the first 'database' directive.

suffix          "dc=example,dc=com"
directory       "/var/lib/ldap"
rootdn          "cn=admin,dc=example,dc=com"
rootpw          {SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m

LDAP 데이터 넣기 (populating)

설치 시에 디렉토리가 생성되었으므로, 이제 디렉토리에 데이터를 입력할 수 있습니다. 여기에서는 디렉토리(예를 들어 공유 디렉토리), (웹 애플리케이션을 위한) 고전적인 계정, 유닉스 (POSIX) 계정 등과 호환이 가능한 "고전적인" (classical) 항목들로 채울 것입니다.

LDAP 디렉토리는 ldif (ldap directory interchange format) 파일을 입력으로 받을 수 있습니다. 아래의 예제를 여러분의 시스템 내에 init.ldif 라는 이름의 텍스트 파일로 저장하십시오.

dn: dc=example,dc=com
objectClass: dcObject
objectClass: organizationalUnit
dc: example
ou: Example Dot Com

dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups

dn: uid=john,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 1000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@example.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress: 
initials: JD

dn: cn=example,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: example
gidNumber: 10000

위의 예제에서 사용자와 그룹을 위한 디렉토리 구조가 설정되었습니다. 다른 예제에서 여러분은 objectClass를 볼 수도 있을 것입니다. 이것은 모든 항목에서 위쪽에 추가되지만, 이것은 기본적인 동작이므로 여러분이 명시적으로 이를 추가할 필요는 없습니다.

이제 여러분의 정보들을 LDAP에 추가합니다:

  • LDAP 데몬 중지: sudo /etc/init.d/slapd stop

  • 설치 시에 자동으로 추가된 내용들을 삭제: sudo rm -rf /var/lib/ldap/*

  • 내용 추가: sudo slapadd -l init.ldif

  • LDAP 데몬 시작: sudo /etc/init.d/slapd start

우리는 ldap-utils 꾸러미에 포함된 도구들을 통해 내용들이 올바로 추가되었는지 검사해 볼 수 있습니다. LDAP 디렉토리 상에서 검색을 수행하려면:

ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn
dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
sn: Doe
givenName: John

간단히 설명하자면:

  • -x 옵션은 (기본적으로 사용되는) SASL 인증 방식을 이용하지 않도록 합니다.

  • -LLL LDIF 정보를 출력하지 않도록 합니다.

ACL 설정

인증 과정은 기본적으로 접근할 수 없게 되어 있는 password 필드로의 접근을 필요로 합니다. 또 다른 문제는 passwd 명령을 통해 비밀번호를 변경하는 도중에 shadowLastChange 필드에도 접근할 수 있어야 한다는 것입니다. 다음의 코드는 shadowLastChange 필드에 접근을 허용하도록 ACL을 설정하는 예제를 보여줍니다.

access to attr=shadowLastChange
        by dn="cn=manager,dc=example,dc=com" write
        by self write
        by * read

LDAP 복제 (replication)

LDAP 서비스는 종종 정보 시스템 내에서 매우 크리티컬한 서비스가 됩니다. 인증, 권한 부여, 메일 시스템 등 모든 서비스를 LDAP에 의존됩니다. 따라서 중복된 시스템을 설정하는 것은 좋은 아이디어입니다. 이를 위한 설정은 간단하며, 여기에서 그 방법을 간략히 설명합니다.

복제는 마스터-슬레이브 관계를 기반으로 합니다. LDAP 복제를 실행하기 전에 다음 단계를 고려하십시오:

  1. 마스터 서버의 slapd 데몬 중지

  2. 새로운 슬레이브 서버로 복제가 가능하도록 마스터 서버의 slapd.conf 재설정

  3. 마스터 서버의 데이터베이스 내보내기

  4. 복제할 (슬레이브) 서버의 slapd.conf 설정

  5. 마스터 서버의 데이터베이스를 슬레이브 서버에서 가져오기

  6. 복제된 (슬레이브) 서버의 slapd 프로세스 (재)시작

  7. 마스터 서버의 slapd 프로세스 (재)시작

여러분은 변경 사항이 항상 마스터 서버 상에서 이루어져야 한다는 것을 기억해야 합니다. 만약 슬레이브 상에서 변경이 이루어 졌다면 이 정보는 잃어버리게 될 것입니다.

LDAP 마스터

마스터에서는 복제(replica) 관련 지시를 추가하기 위해 /etc/ldap/slapd.conf 파일의 데이터베이스 부분을 수정해야 합니다. 다음의 예제는 ldap-2.example.com 서버에 Manager 사용자와 secret 비밀번호를 복제하는 것을 보여줍니다. 복제 로그 파일은 LDAP 슬레이브에 데이터를 보내기 전에 변경 사항이 저장되는 위치입니다.

replica uri=ldap://ldap-2.example.com:389 binddn="cn=Manager,dc=example,dc=com" bindmethod=simple credentials=secret

replogfile      /var/lib/ldap/replog

slapcat 명령을 이용하여 마스터의 데이터베이스를 내보냅니다. 그리고 scp 혹은 다른 도구를 이용하여 master.ldif 파일을 슬레이브로 복사합니다.

user@master:~$ sudo slapcat -l master.ldif

LDAP 슬레이브

슬레이브에서는 LDAP 데이터베이스를 업데이트하기 위해 마스터에게 권한을 부여해야 합니다. /etc/ldap/slapd.conf 파일의 데이터베이스 부분에 다음 줄을 추가하세요:

updatedn        cn=Manager,dc=example,dc=com
updateref       ldap://ldap-1.example.com

slapadd 명령을 이용하여 master.ldif 파일을 가져옵니다.

user@slave:~$ sudo slapadd -c -l master.ldif

마스터 서버를 재시작합니다.

user@master:~$ sudo /etc/init.d/slapd start

슬레이브 서버를 재시작합니다.

user@slave:~$ sudo /etc/init.d/slapd start