작성자 : 백종규 문서위치 : http://database.sarang.net 제목 [설치] LDAP 설치에 대한 기초지식 작성일자 2001-01-05 19:55:57 (*) LDAP에 대한 개념과 사용에 대한 어려움 LDAP를 사용함에 어려움은 몇가지가 있는데, 첫째, 대부분의 문서들이 영어로 만들어져 있어서 접근이 힘들다. (영어를 못하는 신세한탄입니다. T.T) 둘째, LDAP는 맨처음의 글자처럼 LightWeght 가볍지만 힘들다. 이 말을 풀어서 얘기를 하면, 프로토콜 자체의 멧세지 구조가 아주 간결하고, 함축적으로 이루어져 있기 때문에 한편으로는 간결하지만, 사용하는데는 상당한 조심을 해야 한다는 것이다. LDAP에서 나오는 모든 지시자(indentifier)들은 모두 함축적의미를 가지고 있기 때문에, 이 지시자들에 대한 이해를 잘 하고 있어야만 사용이 간편하다. 결국은 말은 간결하고 명확하지만, 배우기는 쉽지 않다는 뜻이다. DN을 예로 들면, 이는 실제 distingushed name 으로 풀이가 되며, 또한 FQDN(Fully Qua... Domain Name) 처럼 Full DN을 의미할때가 있다. o=ecis | | | ou=JongKyu Baek 위의 예에서 dn은 o=ecis 이고, 또다른 dn은 ou=JongKyu Baek 이다. 그렇지만, ou=JongKyu Baek 의 FULLY-DN을 얘기하자면, "ou=JongKyu Baek, o=ecis" 가 된다. 개발 과정에서 해당 DN을 명시할때, 이의 구분을 명확히 해야만 할것이다. 따라서 원문에서 인용되는 어떤 실제 명칭에 대해서 정확하게 파악을 하는 것이 좋다. 셋째, 정규화된 프로토콜의 규약. LDAP는 실제 이 자체만으로 동작을 하지 아니한다. 내부에 DB도 있고, 하지만, 이 자체는 데이터(DATA)가 아닌 구조(STRUCTURE)라고 보는 것이 정확할 것이다. 따라서, LDAP를 구축한다는 말은 데이터를 입력하는 작업이 아닌, 구조를 만들어 나가는 작업이라고 보면 좋을 것이다. 실제 데이터가 들어가기는 하나, 이는 추후에 그냥 입력만 하면 되는 사항이고, 데이터를 입력하기 위한 준비작업이 중요하다는 것이다. 넷째, 세번째에 언급한대로 LDAP는 프로토콜이며, 구조적인 녀석이다. 따라서 이것을 원하는 대로 바꾸고 수정하고, 다른 프로그램들과 연관을 시키려면, 관계시켜주는 프로그램들이 부수적으로 필요하게 된다. 그러한 프로그램들 중에 하나가 바로 아래와 같은 프로그램들이다. ldapadd, ldapmodify, ldapsearch... 한가지 유의할 점은 위에서 언급한 프로그램들은 LDAP 프로토콜에 의거해 동작하는 아주 저수준의 연결프로그램이므로, 사용상에 상당히 까다로운 몇가지 점들을 가지고 있음을 알아야 한다. .사용상의 문제점 - 프로그램 사용시의 syntax(구문)의 정형성(고정성, 또는 non-flexibility) - LDAP 제반 구성요소에 대한 이해. - LDAP 의 기능적 제한 요소. 간단히 위에서 언급한 3가지의 문제점이 있는데, 하나씩 살펴보기로 하겠다. "구문의 정형성"은 아주 간단한 구문오류에도 심각한 오류를 발생하는 것이다. 오류뿐만이 아니라, 잘못 기입된 자료가 여과없이 입력되는 사태가 발생하기도 한다. 따라서, 되도록 이러한 작업에서는 여타의 툴(GUI 툴)을 이용해서 작업하는 것이 좋고, 대규모 및 많은 데이터의 일시처리를 위한 작업에서만 기본 툴들을 사용하는 것이 좋다. 물론 처음 사용하는 사람에 있어서는 기본 툴들에 대한 이해를 위해서 필히 한번 이상은 테스트를 해야 하므로 피해갈수 없는 어려움이다. 두번째로 "LDAP 제반요소에 대한 이해"가 왜 문제되는지 알아보자. LDAP 는 기본적으로 X.500 을 지원하기 만들어진 것이다. 따라서 X.500이라는 것에 대해서 좀더 파악을 한다면(개념적이해), 사용하기 좋지만, 그렇지 않을경우에서 LDAP에서 사용되는 각종 요소(attribute, entry, object)에 대한 정확한 이해를 가져야 한다. 이들의 정의 또는 목록을 모르는 상태에서 접근을 하는 것은 상당히 곤란한 경우를 많이 발생시킨다. LDAP에는 "기능적 제한 요소"들이 많이 존재한다. 실제로 우리가 쓰는 OPENLDAP의 경우에 미시간 대학에서 처음으로 만들어졌으며, 이를 바탕으로 계속 개발 수정이 이루어지고 있다. 따라서, 이를 관리하는 여러가지 응용어플리케이션들이 부족하며, 이들의 사용이 용이하지는 않다. 다만, java 등을 이용한다면, 한결 나은 개발환경을 제공하나, 회사의 개발적인 입장에서는 이는 별로 달가운 것만은 아닌 것이다. 문제가 되느것 중에 하나가 LDAP의 Backend 데이터베이스인데, 현재 검색시 가장 빠른 결과를 출력해주는 GDBM이 쓰이고 있다. 그러나, 이 GDBM은 수정이나, 삭제작업시에 상당히 느린 수행을 하며, BACKEND를 이용한 다양한 sql을 사용할수가 없다. 이는 현재 개발자들 사이에서 상당히 많이 논의가 되고 있는 부분이며, 현재 이 sql 백엔드를 지원하기 위한 시험적인 코드들이 OPENLADP 2.0 버젼에 추가가 되고 있다. 언제 안정화가 될지는 의문이다. 이제 본론인 LDAP 설치 및 기본 설정을 하는 작업으로 넘어가 보도록 하자. LDAP의 개념적인 이해를 돕기 위해서는 http://linuxfocus.org/English/July2000/article159.shtml#lfindex0 의 그림들과 그림 및의 설명을 참고하기 바란다. 위의 문서를 찾아서 읽어보면, LDAP를 파일시스템과 비교를 하여 설명하고 있다. LDAP의 DN을 파일시스템의 Filename(또는 DirectoryName)과 일치시키고 있다. 파일의 FQN(Fully-Qualified-Name)은 항상 유일하다. 또한 LDAP의 에서 FQN-DN도 항상유일하다. /etc/passwd를 예를 들어 보면, FQN은 /etc/passwd 이며, 이것은 유일하다. 또한 위의 예제에서 나오는 "ou=JongKyu Baek" 의 FQN-DN은 "ou=JongKyu Baek, o=ecis" 이다. 한가지 다른 점이 보이는데, 파일 명칭과 달리 FQN-DN은 역순으로 명시가 된다는 것이다. 위에서 많은 쓸데없는 내용을 언급하였는데, 위의 개괄적은 설명들을 굳이 이해할 필요는 없다. 다만, LDAP의 사용 과정에서 위에서 언급한 내용들이 있을 것이니, 참고(?)하라는 얘기다. 1. 설치 우리는 여기서 일반적으로 많이 알려진 Netscape LDAP가 아닌, 미시간 대학에서 개발된 OPENLDAP을 가지고 설명할 것이다. 실제로 각 제품에 따라 다른 구성요소(개발 및 관리툴)를 가지고 있기는 하나, LDAP는 말그대로 프로토콜이기 때문에 기본적인 사용및 프로토콜의 차이는 전혀 없다. OpenLDAP 버젼은 1.2.x 를 기반으로 설명할 것이다. OpenLDAP 1.2.x 버젼은 LDAPv2(LDAP 프로토콜 버젼 2.)를 지키고 있다. 참고로 LDAP 2.x 버젼은 LDAPv2 및 LDAPv3 모두를 지원하고 있다. OpenLDAP 1.2패키지를 설치한다. OpenLDAP 는 현재 래드햇에서 공식적으로 패키지 하고 있으므로, ftp://ftp.redhat.com 또는 미러링 사이트에서 rpm패키지로 구하면 된다. 사용하는 배포판이 오래 된 경우에는 SRPMS 를 구해서 리빌드(rebuild)를 해서 설치하기 바란다. rpm이 모두 완벽한 것은 아니나, 굳이 쉬운길을 돌아갈 필요는 없는 것이다. 우리는 패키징을 하는 사람이 아니라, 개발이나 사용을 하기 위한 사람들인 것이다. 패키지는 아래의 URL에 다운로드 해 두었다. ftp://test.ecis.co.kr/pub/Server_Packages/openldap-1.2.9-6.i386.rpm ftp://test.ecis.co.kr/pub/Server_Packages/openldap-devel-1.2.9-6.i386.rpm *참고적으로 래드햇의 추가적인 패키지들은 아래의 미러 사이트에서 구할수가 있다. ftp://ftp.linux.sarang.net/.1/ftp.redhat.com/pub/redhat/updates/6.0/i386/ 패키지는 다음과 같이 설치를 한다. rpm -ivh openldap-1.2.9-6.i386.rpm openldap-devel-1.2.9-6.i386.rpm 2. 설정 설정 부분이 상당히 애매한데, LDAP에 기본적인 지식이 없으면, 문제가 생긴다 LDAP는 말그대로 프로토콜이며, OpenLDAP는 프로그램이다. 일반적인 프로그램들은 설치가 되면, 필요한 데이터들이 생성이 되지만, LDAP는 그렇지 않다는 것을 알아야 한다. LDAP 패키지는 크게 두가지로 구성이 되는데, 하나는 LDAP 데몬 프로그램이고, 또다른 하나는 LDAP 유틸리티이다. LDAP 데몬 프로그램은 각종 클라이언트에서 요구하는 프로토콜 명령들을 받아서 처리만 해준다. LDAP 유틸리티는 사용자가 LDAP 데몬에 필요한 요구를 할수 있도록 도와주는 프로그램이다. 자, 이제 이것을 명심하고 다음으로 넘어가도록 하자. LDAP 데몬 프로그램도 크게 2가지 종류로 나뉘게 되는데, 하나는 로컬에서만 사용이 가능한 SLAPD 라는 프로그램과, 여러서버를 동시에 이어주는 SLURPD라는 프로그램의 두가지가 있다. 일반적으로 한대의 서버에서만 동작시키게 되므로, SLAPD라는 데몬을 사용하게 된다. SLAPD의 설정파일은 다음의 위치에 있다. /etc/openldap/slapd.conf 설정파일의 내용을 살펴보면, 아래와 같다. ----------------------------------------------------------------- # define the kind of database to use. keep default ldbm database ldbm # this is where ldap dbs will be kept directory /var/lib/ldap # suffix or directory root. This is top node my LDAP directory. suffix "dc=my-domain, dc=com" # the distinguished name of directory manager rootdn "cn=Manager, dc=my-domain, dc=com" # cleartext passwords, especially for the rootdn, should rootpw secret ----------------------------------------------------------------- 하나씩 살펴보도록 하자. database ldbm OpenLDAP가 Backend로 사용할 데이터베이스를 지정한다. 기본적으로 ldbm을 사용하도록 한다.(권장사항) 다른 데이터베이스에 대한 지원은 아직 실험적인 단계이다. directory /var/lib/ldap LDAP 의 자료(DB)가 위치할 디렉토리를 지정한다. suffix "dc=my-domain, dc=com" suffix는 현재 로컬 LDAP가 동작할때, LDAP의 최고 DN을 일컫는다. 즉, suffix 또는 root DN 이라고 할수 있는 것이다. 그림으로 설명하자면, 아래와 같다. +----------------------+ | dc=my-domain, dc=com | +----------------------+ | | | | | | | | +-----------+ +-----------+ | | | | +-----------+ +-----------+ | | | | +------+ +------+ | | | | +------+ +------+ 그런데, 여기서 절대로 절대로 명심해야 할것이 한가지 있다. 실제 LDAP 데이터베이스(Backend) 상에는 "dc=my-domain, dc=com" DN을 가지는 실체가 없다는 것이다. 즉, 데이터 베이스에는 들어있지 않다는 뜻이다. 그럼 왜 설정파일에 적혀 있느냐고 물을 것이다. 이것은 LDAP 서버(SLAPD)가 프로토콜상의 응답을 할때에 어느 DN을 최고 상위로 잡을지를 지정하는 것이다. 즉, 설정한다고 끝날 문제가 아니라, 아래에도 설명을 하겠지만, 데이터를 실제로 입력해 주는 작업이 필요한 것이다. 다음 설정라인을 살펴보자. rootdn "cn=Manager, dc=my-domain, dc=com" LDAP는 서버에 접속할때에 마찬가지로 특정한 사용자로만 작업이 가능하다. 따라서, 그 사용자를 지정하는 라인이다. suffix 와 마찬가지로, 실제 존재하지는 않으므로 추후에 만들어만 한다. 이제 구조는 다음과 같이 될것이다. +----------------------+ | dc=my-domain, dc=com | +----------------------+ | | | | | | | | +-----------+ +------------+ | | | cn=Manager | +-----------+ +------------+ | | | | +------+ +------+ | | | | +------+ +------+ 다음 설정 라인을 보도록 하자. rootpw secret LDAP 접속 또는 프로토콜 명령시, rootdn 으로 접속하면서, 이에 대한 패스워드를 지정하게 되는데, 이 패스워드가 여기에 표시된다. 그래서 아래에도 설명을 하게 되겠지만, 현재 설정의 경우에 ldapadd 명령을 다음처럼 사용하게 되는 것이다. ldapadd -D "cn=Manager, dc=my-domain, dc=com" -w secret << EOF > .... > .... > .... > EOF 자, 이제 설정은 모두 끝났으므로 다음에는 데몬 실행과 기본적인 기초(필수) 데이터를 입력해 보도록 하자. 3. 실행 실행은 다음과 같이 하면 된다. /etc/rc.d/init.d/ldap start 이렇게 하면, slapd라는 데몬이 실행이 되면, 정상적으로 실행이 되었는지 확인하려면, 다음과 같은명령으로 확인해 볼수가 있다. # ps auwx | grep slapd 4. 데이터 입력 이제 기초적인 데이터를 입력해야 하는데, ldapadd 라는 클라이언트 프로그램을 사용하도록 한다. 기본 명령은 다음과 같다. ldapadd -D [루트DN] -w [패스워드] << EOF ... ... LDAP 구문 ... EOF 자, 그러면 현재 상태에서 구문은 다음과 같이 될 것이다. ldapadd -D "dc=my-domain, dc=com" -w secret << EOF ... ... EOF 자, 그러면, 이제 뭘 넣어야 할지 생각을 해 보자. 위에서도 계속 강조하고 있지만, 현재 데이터베이스에는 아무런 자료도 들어있지 아니하다. 따라서, 최상위의 ROOT-DN 항목을 넣어야 한다고 생각을 했다면, 상당히 재질이 있는 분일것이다. 다음과 같은 구문이 될것이다. ldapadd -D "dc=my-domain, dc=com" -w secret << EOF dn:dc=my-domain,dc=com cn:my-domain objectclass:domain EOF 이제 구문을 살펴 보도록 하자. dn:dc=my-domain, dc=com 위의 구문은 말그대로 dn을 설정하는 것이다. "dc=my-domain, dc=com" 전체가 DN(Distinguished Name)이 되는 것이다. dn은 Distinguished Name 으로 필수 항목이다. 파일시스템에서 파일 및 디렉토리 이름이라고 생각하면 된다. cn:my-domain 이것은 cn 이라는 속성 attribe를 설정한다. cn은 일반적으로 많이 쓰이는 것으로 entry의 이름을 나타낸다. objectclass:domain 모든 엔트리는 하나이상의 objectclass를 가지고 있어야 하기때문에 필히 넣어줘야 한다. EOF 쉘 명령에서 << EOF 라는 구문이 있는데, EOF 글자가 오면, 완료를 하게 되는 것이다. 위의 구문은 오자가 하나도 없어야 하며, 구문상의 어떠한 오류도 용납하지 않는다. -.- 실수를 할 경우에, 다음과 같은 에러멧세지가 표시될수 있다. ldap_add: No such object DN 입력을 잘못한 경우. ldap_bind: No such object ldap_bind: matched: DC=MY-DOMAIN,DC=COM 위와 같은 경우에는 데이터 입력 실수이거나 패스워드 오류 INAPPROPRIATE AUTH... 어쩌구 저쩌구... 위와 같은 경우에는 인증 실패이다. 따라서 ROOT-DN이나, 패스워드를 확인해보기 바란다. 자, 이렇게 해서 입력이 완료가 되었다. 제대로 들어갔는지 확인해 보기로 하자. ldapsearch -b "dc=my-domain, dc=com" 'objectclass=*' 위의 옵션에 대해서는 man ldapsearch 를 해서 확인하기 바란다. 대략적으로 기본 위치(DN)를 지정하고, 다음에 검색조건을 넣으면 된다. 위의 구문을 해석하면 다음과 같다. -b "dc=my-domain, dc=com" 위 내용은 DN 이 "dc=my-domain, dc=com"인 위치에서부터 검색하라는 것이다. 즉 베이스 DN을 입력한다. 'objectclass=*' 은 LDAP 검색 조건식이다. LDAP 검색조건에 맞추어 검색을 하도록 한다. -------------------------------------------------------------------------------- 이상으로 기본적인 설치까지 완료를 하였다. 추가적인 것은 프로그램툴이나, API등을 이용하고, 관련 문서들을 참조하여, 검색 및 수정, 추가의 기능들을 알아보면 될것이다. 5. 활용 - 각종 GUI 유틸들이 있으며, API함수가 지원되므로 이것들 활용하도록 한다. 앞으로 좀더 알아봐야 하는 것은 다음과 같다. - 스키마 구성 - objectclass의 의존성 - LDAP 백업 - SASL 인증 - LDAP 관련 서비스와의 연동 -- 인간산적 백종규