다음 이전 차례

5. 데이타베이스 생성과 유지 보수

이 절에서는 scratch로부터 slapd 데이타베이스를 생성하는 방법에 대해 논의한다. 데이타베이스는 두가지 방법으로 생성할 수 있다. 첫째, LDAP를 이용하여 온라인상에서 데이터베이스를 생성할 수 있는데 간단히 slapd를 구동하고 선택한 LDAP 클라이언트를 이용하여 엔트리를 추가해주면 된다. 이 방법은 비교적 작은 데이터베이스에 대해서는 더할 나위없이 좋다 (요구에 따라 수백 또는 수천개의 엔트리).

두 번째는 인덱스 생성 도구를 이용하여 오프라인상에서 데이터베이스를 생성하는 것인데 LDAP 방법을 이용할 때 매우 오랜 시간이 소요될 수 있는 방대한 엔트리 생성 또는 데이터베이스가 생성되는 동안 엑세스되지 않기를 원할 경우 좋은 방법이다.

5.1 온라인상에서 데이타베이스 생성하기

OpenLDAP 소프트웨어 패키지에는 LDAP 서버 작동중에 엔트리를 추가하는데 사용하는 ldapadd 유틸리티를 포함하고 있다. 온라인상에서 데이터베이스를 생성하려고 한다면 엔트리 추가를 위해 ldapadd 도구를 사용할 수 있다. 첫 번째 엔트리를 추가한 후 더 많은 엔트리를 추가하기 위해 ldapadd를 사용할 수 있다. slapd를 구동하기 전에 slapd.conf 파일에 다음 옵션이 설정되어 있음을 확인해야 한다.

suffix <dn>

3절에 설명한 바와 같이 이 옵션은 어떤 엔트리가 이 데이타베이스에 들어있는지를 말해주는데 이를 생성하려고 하는 하위 트리의 루트 DN으로 설정해야 한다:

suffix "o=TUDelft, c=NL"

인덱스 파일이 생성되어 놓이는 디렉토리 지정을 확실히 해주어야 한다:

directory <directory>

예:

directory /usr/local/tudelft

엔트리를 추가할 수 있는 허가권을 가진 누군가로 slapd 에 연결할 수 있도록 설정할 필요가 있는데 이는 데이터베이스 정의에서 다음 두 옵션을 통해 이루어진다:

rootdn <dn>

rootpw <passwd> /* 암호화된 패스워드를 사용하는 것을 기억해라 !!! */

이 옵션들은 데이터베이스의 슈퍼유저 엔트리(어떤 작업이든 할 수 있는 엔트리)를 인증하는데 사용될 수 있는 DN과 password를 지정한다. 여기서 지정한 DN과 password는 실제 이름을 갖는 엔트리가 존재하든지 또는 엔트리가 지정된 패스워드를 갖는지 상관없이 늘 작동한다. 이는 아직 어떤 엔트리가 존재하기도 전에 어떻게 인증을 하고 어떻게 엔트리를 추가하는지의 chicken and egg (병아리가 먼저냐 닭이 먼저냐 하는 식의) 문제를 해결한다.

마지막으로 데이터베이스 정의가 원하는 인덱스 정의를 포함하는지를 확인해야 한다:

index {<attrlist> | default} [pres,eq,approx,sub,none]

예를들어 cn, sn, uid 와 objectclass 속성을 인덱스하기 위해 다음 인덱스 설정 라인이 사용될 수 있다.

index cn,sn,uid

index objectclass pres,eq

index default none

취향에 맞게 구성했다면 slapd를 구동하고 LDAP 클라이언트로 연결하여 엔트리 추가를 시작해라. 예를들어 ldapadd 도구를 이용하여 TUDelft 엔트리와 Postmaster 엔트리를 순차적으로 추가하기 위해 다음 내용을 갖는 /tmp/newentry 파일을 생성할 수 있다:

o=TUDelft, c=NL
objectClass=organization
description=Technical University of Delft Netherlands

cn=Postmaster, o=TUDelft, c=NL
objectClass=organizationalRole
cn=Postmaster description= TUDelft postmaster - postmaster@tudelft.nl

그리고나서 엔트리를 실제 생성하기 위해 다음 명령을 사용한다:

ldapadd -f /tmp/newentry -D "cn=Manager, o=TUDelft, c=NL" -w secret

위 명령은 rootdn을 "cn=Manager, o=TUDelft, c=NL" 으로 rootpw를 "secret" 설정했다고 가정한다. command-line 상에서 패스워드를 타이핑하길 원하지 않는다면 -w "password" 대신 ldapadd 명령에 대해 -W 옵션을 사용해라. 패스워드를 입력하는 프롬프트를 볼 수 있을 것이다:

ldapadd -f /tmp/newentry -D "cn=Manager, o=TUDelft, c=NL" -W
Enter LDAP Password:

5.2 오프라인상에서 데이타베이스 생성하기

데이터베이스를 생성하는 두 번째 방법은 다음에 설명된 인덱스 생성 도구를 이용하여 오프라인상에서 작업을 하는 것인데 LDAP 방법을 이용할 때 매우 오랜 시간이 소요될 수 있는 방대한 엔트리 생성 또는 데이터베이스가 생성되는 동안 엑세스되지 않기를 원할 경우 좋은 방법이다. 이 도구는 slapd 설정 파일과 추가되는 엔트리의 텍스트 표현을 포함하는 입력 LDIF 파일을 읽어들이는데 LDBM 인덱스 파일을 직접적으로 생성한다. config 파일 데이터베이스 정의에서 우선적으로 확인 및 설정하길 원하는 여러 중요한 설정 옵션이 있다:

suffix <dn>

이전 절에서 설명한 바와 같이, 이 옵션은 어떤 엔트리가 이 데이타베이스에 들어 있는지를 말해주는데 이를 생성하려고 하는 하부 트리의 루트 DN에 설정해야 한다. 예:

suffix "o=TUDelft, c=NL"

인덱스 파일이 생성되어 놓이는 디렉토리 지정을 확실히 해주어야 한다.

directory <directory>

예:

directory /usr/local/tudelft

다음 아마도 각 오픈 인덱스 파일이 사용하는 in-core 캐시의 크기를 증가시키길 원할 수 있는데 인덱스 생성중 최상의 성능을 위해 전체 인덱스가 메모리상에 놓여야 한다. 데이터가 메모리에 올리지 못할 정도로 방대하거나 또는 메모리가 너무 작다면 메모리 크기를 증가시키거나 페이징 시스템을 작동시킬 수 있다. 이 크기는 다음 옵션에 의해 설정된다:

dbcachesize <integer>

예: dbcachesize 50000000

이 옵션은 꽤 큰(Michigan 대학에서 데이터베이스는 대략 125K 엔트리를 가지며 가장 큰 인덱스 파일은 대략 45MB 이다) 50MB 크기의 캐시를 생성할 것이다. 시스템이 어떤 옵션 값에서 최상으로 작동하는 가를 살펴보기 위해 이 비트수와 아래서 설명되는 parallelism 정도를 변화시키면서 실험해봐라. 인덱스 파일이 일단 생성되면 slapd를 실행시키기 전에 이 값을 감소시키는 것을 잊지 마라.

마지막으로 어떤 인덱스를 구축하길 원하는지 지정할 필요가 있는데 이는 하나 또는 그 이상의 인덱스 옵션에 의해 지정된다:

index {<attrlist> | default} [pres,eq,approx,sub,none]

예:

index cn,sn,uid pres,eq,approx

index default none

이는 cn, sn과 uid 속성에 대해 presence, equality 와 approximate 인덱스를 생성하며 나머지 다른 속성에 대해서는 인덱스를 생성하지 않을 것이다. 이 옵션에 대해 더 많은 정보를 얻기 위해서는 3절의 설정 파일을 보라.

취향에 맞게 설정했다면 slapadd(8) 프로그램을 실행시킴으로써 기본 데이터베이스와 관련 인덱스를 생성한다:

slapadd -l <inputfile> -f <slapdconfigfile> [-d <debuglevel>] [-n <integer>|-b <suffix>]

인수들은 다음의 의미를 갖는다:

-l <inputfile>

텍스트 형태로 추가되는 엔트리를 포함한 LDIF 입력 파일을 지정한다(다음 절을 보라).

-f <slapdconfigfile>

인덱스를 어디에 생성하는지, 어떤 인덱스를 생성하는지 등을 말해주는 slapd 설정 파일을 지정한다.

-d <debuglevel>

<debuglevel>에 의해 지정된 디버깅을 작동시킨다. 디버그 레벨은 slapd 에 대한 레벨과 같다. 4.1 절의 옵션을 보라.

-n <databasenumber>

어떤 데이터베이스가 수정되는가를 지정하는 선택적 인수로 설정 파일에 명시된 첫 번째 데이터베이스는 1, 두 번째는 2 등으로 표현된다. 디폴트로 설정 파일의 첫 번째 ldbm 데이터베이스가 사용된다. -b 옵션과 함께 사용되서는 안된다.

-b <suffix>

어떤 데이터베이스가 수정되는가를 지정하는 선택적 인수로 데이터베이스 넘버를 결정하기 위한 데이터베이스 suffix 지시와 부합되지 않는다. -n 옵션과 함께 사용되서는 안된다.

slapd.conf(5) 파일을 수정한 후와 같이 때때로 인덱스들을 재 생성할 필요가 있을 수 있는데 이는 slapindex(8) 프로그램을 이용하여 가능하다. slapindex 는 다음과 같이 실행시킨다:

slapindex -f <slapdconfigfile> [-d <debuglevel>] [-n <databasenumber>|-b <suffix>]

-f, -d, -n 과 -b 옵션은 slapadd(1) 프로그램에 대한 옵션과 동일하다. slapindex는 현재 데이터베이스 내용에 기초한 모든 인덱스들을 재 구축한다.

데이터베이스를 LDIF 파일로 덤프(dump)하는데 사용되는 slapcat 이라는 프로그램이 있는데 이는 데이터베이스를 읽을 수 있는(human-readable) 백업을 할때나 데이터베이스를 오프라인 상에서 편집하려고 할 때 유용하다. 이 프로그램은 다음과 같이 실행시킨다:

slapcat -l <filename> -f <slapdconfigfile> [-d <debuglevel>] [-n <databasenumber>|-b <suffix>]

-n 또는 -b 옵션은 -f를 사용하여 지정된 slapd.conf(5)내의 데이터베이스를 선택하는데 사용된다. 해당 LDIF 출력은 표준 출력 또는 -l 옵션을 사용하여 지정된 파일에 작성된다.

5.3 More on the LDIF format

LDAP Data Interchange Format (LDIF)은 간단한 텍스트 포맷으로 LDAP 엔트리를 표현하기 위해 사용된다. 엔트리의 기본 폼은:

#comment
dn: <distinguished name>
<attrdesc>; <attrvalue>
<attrdesc>; <attrvalue>
...

`#' 문자로 시작하는 라인들은 주석이다. 속성 설명(attrdesc)은 cn 또는 objectClasse 또는 1.2.3(속성 형태와 관련된 OID)과 같은 간단한 속성형태 이거나 cn:lang_en_US 또는 userCertificate;binay와 같은 옵션을 포함할 수 있다.

라인은 single space 또는 tab 문자로 다음 라인을 시작함으로써 계속될 수 있다. 예를들어:

dn: cn=Barbara J Jensen, dc=example, dc=
 com
cn: Barbara
      Jensen
dn: cn=Barbara J Jensen, dc=example, dc=com
cn: Barbara J Jensen
과 동일하다.

다중 속성 값들은 별개 라인에서 지정된다. 예:

cn: Barbara J Jensen
cn: Babs Jensen

<attrvalue>가 출력되지 않는 문자들을 포함하거나 또는 space, 콜론(':') 또는 '<' 으로 시작된다면, <attrdesc>다음에 이중 콜론과 base64 로 암호화된 값이 온다. 예를들어 "space로 시작"되는 값은 다음과 같이 암호화될 것이다:

 cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U= 

속성값을 포함하는 URL을 지정할 수 있다. 예를들어, 다음은 jpegPhoto 값이 /path/to/file.jpg 파일로부터 얻어야 함을 지정한다.

cn:<file://path/to/file.jpeg

동일한 LDIF 파일내의 다중 엔트리들은 blank 라인으로 구별된다. 세 개의 엔트리를 갖는 LDIF 파일의 예는 다음과 같다:

# Barbara's Entry
dn: cn=Barbara J Jensen, dc=example, dc=com
cn: Barbara J Jensen
cn: Babs Jensen
objectClass: person
sn: Jensen

# Bjorn's Entry
dn: cn=Bjorn J Jensen, dc=example, dc=com
cn: Bjorn J Jensen
cn: Bjorn Jensen
objectClass: person
sn: Jensen
# Base64 encoded JPEG photo
jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD
A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ
ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG

# Jennifer's Entry
dn: cn=Jennifer J Jensen, dc=example, dc=com
cn: Jennifer J Jensen
cn: Jennifer Jensen
objectClass: person
sn: Jensen
# JPEG photo from file
jpegPhoto:<file://path/to/file.jpeg

Bjorn 엔트리의 jpegPhoto는 base64로 암호화되어 있고 Jennifer 엔트리의 jpegPhoto는 URL이 가리키는 위치로부터 얻어짐을 주목하라.

trailing space는 LDIF 파일의 값들로부터 정리되지 않으며 또한 내부의 다중 space는 압축되지도 않는다. 데이터내에 trailing과 내부 space를 원하지 않는다면 거기에 그들을 넣지 마라.

5.4 The ldapsearch, ldapdelete and ldapmodify utilities

ladpsearch - ldapsearch 는 ldap_search(3) 라이브러리 콜에 대해 쉘이 엑세스할 수 있는 인터페이스로 LDAP 데이터베이스 백엔의 엔트리를 검색하기 위해 사용한다.

ldapsearch를 호출하기 위한 개요는 다음과 같다 (각 옵션의 의미를 알기 위해 ldapsearch man 페이지를 찾아보라):

ldapsearch  [-n]  [-u]  [-v]  [-k]  [-K]  [-t]  [-A] [-B] [-L] [-R] [-d debuglevel] [-F sep] [-f file]
[-D binddn]  [-W]  [-w bindpasswd] [-h ldaphost]  [-p ldapport]   [-b searchbase]   [-s base|one|sub]
[-a never|always|search|find] [-l timelimit] [-z sizelimit] filter [attrs...]

ladpsearch는 LDAP 서버에 연결, 바인드해 필터를 이용하여 검색을 수행한다. 필터는 RFC 1558에 정의된 것과 같은 LDAP 필터에 대한 문자열 표현을 따라야 한다. ldapsearch가 하나 또는 그 이상의 엔트리를 찾으면 attrs에 의해 지정된 속성들이 검색되어 엔트리와 값이 표준 출력으로 출력된다. attrs가 명시되지 않으면 모든 속성들을 되돌려준다.

다음은 ldapsearch 사용 예이다:

ldapsearch -b 'o=TUDelft,c=NL' 'objectclass=*'

ldapsearch -b 'o=TUDelft,c=NL' 'cn=Rene van Leuken'

ldasearch -u -b 'o=TUDelft,c=NL' 'cn=Luiz Malere' sn mail

-b 옵션은 searchbase(initial search point, 초기 검색 지점)을 -u 옵션은 사용자에 편리한(userfriendly) 출력 정보를 나타낸다.

ldapdelete - ldapdelete는 ldap_delete(3) 라이브러리 콜에 대해 쉘이 엑세스할 수 있는 인터페이스로 LDAP 데이터베이스 백엔드의 엔트리를 삭제하기 위해 사용한다.

ldapdelete를 호출하기 위한 개요는 다음과 같다 (각 옵션의 의미를 알기 위해 ldapdelete man 페이지를 찾아보라):

ldapdelete   [-n]   [-v]  [-k]  [-K]  [-c]  [-d debuglevel]  [-f file]  [-D binddn]  [-W]  [-w passwd]
[-h ldaphost] [-p ldapport] [dn]...

ldapdelete는 LDAP 서버에 연결, 하나 또는 그 이상의 엔트리를 바인드해 삭제한다. 하나 또는 그 이상의 dn 인수가 제공되면 이러한 DN을 갖는 엔트리는 삭제된다. 각 dn은 RFC 1779에 정의된 것과 같은 문자열로 표현된 DN 이어야 한다. dn 인수가 없다면 DN의 리스트가 표준 입력(또는 -f flag가 사용된다면 파일)으로부터 읽혀진다.

다음은 ldapdelete 사용 예이다:

ldapdelete 'cn=Luiz Malere,o=TUDelft,c=NL'

ldapdelete -v 'cn=Rene van Leuken,o=TUDelft,c=NL' -D 'cn=Luiz malere,o=TUDelft,c=NL' -W

-v 옵션은 verbose 모드, -D 옵션은 Binddn(인증되어야 하는 dn), -W 옵션은 패스워드 프롬프트를 나타낸다.

ldapmodify - ldapmodify 는 ldap_modify(5)와 ldap_add 라이브러리 콜에 대해 쉘이 엑세스할 수 있는 인터페이스로 LDAP 데이터베이스 백엔드의 엔트리를 수정하기 위해 사용한다.

ldapmodify를 호출하기 위한 개요는 다음과 같다(각 옵션의 의미를 알기 위해 ldapmodify man 페이지를 찾아보라)

ldapmodify   [-a]  [-b]  [-c]  [-r]  [-n]  [-v]  [-k]  [-d debuglevel]  [-D binddn]  [-W]  [-w passwd]
[-h ldaphost] [-p ldapport] [-f file]
ldapadd [-b] [-c] [-r] [-n] [-v]  [-k]  [-K]  [-d debuglevel]  [-D binddn]  [-w passwd]  [-h ldaphost]
[-p ldapport] [-f file]

ldapadd는 ldapmodify 도구에 대해 하드 링크되어 수행되는데 ldapadd가 실행될 때 ldapmodify의 -a (새로운 엔트리를 추가) flag 가 자동적으로 설정된다. ldapmodify는 LDAP 서버에 연결, 바인드해 엔트리를 수정 또는 추가한다. 엔트리 정보는 표준 입력 또는 -f 옵션을 사용시 파일로부터 읽혀진다.

다음은 ldapmodify의 사용 예이다:

/tmp/entrymods 가 존재하고 다음 내용을 갖고 있다고 가정한다:

dn: cn=Modify Me, o=University of Michigan, c=US
changetype: modify
replace: mail
mail: modme@terminator.rs.itd.umich.edu
-
add: title
title: Grand Poobah
-
add: jpegPhoto
jpegPhoto: /tmp/modme.jpeg
-
delete: description
-
명령:
ldapmodify -b -r -f /tmp/entrymods

이는 "Modify Me" 엔트리의 메일 속성 내용을 "modme@terminator.rs.itd.umich.edu"로 대체하고, "Grand Poobah"을 타이틀에 /tmp/modme.jpeg 파일의 내용을 jpegPhoto로 추가하며, description 속성을 완전히 삭제한다.

위와 동일한 수정은 이전 ldapmodify 입력 포맷을 이용하여 수행할 수 있다:

cn=Modify Me, o=University of Michigan, c=US mail=modme@terminator.rs.itd.umich.edu
+title=Grand Poobah
+jpegPhoto=/tmp/modme.jpeg
-description
다음 명령을 실행시킨다: ldapmodify -b -r -f /tmp/entrymods

/tmp/newentry 파일이 존재하고 다음 내용을 갖는다고 가정한다:

dn: cn=Barbara Jensen, o=University of Michigan, c=US
objectClass: person
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous manager
mail: bjensen@terminator.rs.itd.umich.edu
uid: bjensen
다음 명령을 실행시킨다:
ldapadd -f /tmp/entrymods
/tmp/newentry 파일이 존재하고 다음 내용을 갖는다고 가정한다:
dn: cn=Barbara Jensen, o=University of Michigan, c=US
changetype: delete
다음 명령은 Babs Jensen의 엔트리를 삭제한다:
ldapmodify -f /tmp/entrymods

-f 옵션은 파일(표준 입력대신 파일로부터 수정 정보를 읽는), -b 옵션은 바이너리(입력 파일의 '/'로 시작되는 모든 값들은 바이너리로 해석된다), -r 옵션은 대체(디폴트로 기존 값을 대체한다)를 나타낸다.


다음 이전 차례