[클러스터] OpenLdap 을 이용한 NIS 구성 하기

발췌 : 마이크로소프트웨어 2003년 3월호 (작성자: jst.kim@gmail.com )

LDAP(Lightweight Directory Access Protocol)은 네트워크 상에서 디렉토리 서비스를 위해 공개된 표준 프로토콜로써 조직이나 개체 그리고 인터넷이나 기업 내의 인트라넷 등 네트워크 상에 있는 파일이나 장치들과 같은 자원 등의 위치를 찾을 수 있게 해준다. 디렉토리 서비스는 정보를 저장, 액세스, 관리 할 공통 장소를 제공하면서 응용 프로그램과 운영체제 기능에는 영향을 주지 않는 별도의 서비스를 말한다.

준비해야 할 것들
LDAP에도 여러 가지 종류가 있지만 여기서는 OpenLDAP 2.0.x 버전을 사용해서 작업을 진행할 것이다. 현재 OpenLDAP은 2.1.x와 2.0.x 버전의 두 갈래로 개발되고 있다. 2.0.x 버전을 사용한다고 명시한 이유는 nss_ldap, pam_ldap과 같이 유닉스 시스템에서 LDAP을 통해 인증하도록 하는 라이브러리가 아직은 2.1.x 버전을 지원하지 않기 때문이다. 일단 시스템에 OpenLDAP이 설치돼 있어야 하고 그 외 추가적으로 몇 가지 패키지들이 더 필요하다. 목록은 다음과 같다.

◆ openldap 2.0.x : http://www.openldap.org
◆ 마이그레이션 툴 : http://www.padl.com/OSS/MigrationTools.html
◆ nss_ldap : http://www.padl.com/OSS/nss_ldap.html
◆ pam_ldap : http://www.padl.com/OSS/pam_ldap.html

설치 방법은 다른 프로그램들의 설치와 다를 바가 없다. 레드햇 배포판의 경우 openldap 패키지를 설치하면 마이그레이션 툴까지 같이 설치된다.

LDAP 서버 설정하기
OpenLDAP 서버 설정 파일
OpenLDAP 서버의 설정 파일은 slapd.conf이며 보통은 /etc/openldap 디렉토리 안에 들어있다. NIS(Network Information System)를 구성하기 위해서는 기본적으로 제공되는 slapd.conf 파일에 NIS와 관련된(정확하게는 PosixAccount와 관련된) LDAP 스키마 파일을 추가해야 한다. 기본적으로 core.schema 만이 추가되어 있다.

/etc/openldap/schema 디렉토리를 보면 core.schema 이외에도 여러 가지 종류의 스키마(schema) 파일들이 있는데 각각의 스키마 파일들은 서로 연관성이 있으며 인클루드하는 순서가 뒤바뀌어도 인식하지 못하므로 다음과 같이 slapd.conf 파일을 작성해줘야 한다.

include /etc/openldap/schema/core.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema

설정 파일 중 아래쪽을 보면 ‘ldbm database definitions’라고 눈에 띄는 곳이 있을 것이다. 이곳에서 OpenLDAP 서버의 슈퍼 유저를 설정한다고 생각하면 된다. 여기서 사용한 도메인은 solux.sookmyung.ac.kr이며 도메인의 ‘.’을 기준으로 dc를 설정하여 dc=solux, dc=sookmyung, dc=ac, dc=kr로 해주었다.

database ldbm
suffix “dc=solux,dc=sookmyung,dc=ac,dc=kr”
rootdn “cn=root,dc=solux,dc=sookmyung,dc=ac,dc=kr”

rootpw {MD5}R7zlx09Yn0hn29V+nKn4CA==

directory /export/database/ldap

index objectClass,uid,uidNumber,gidNumber eq
index cn,mail,surname,givenname eq,subinitial

database는 OpenLDAP이 사용할 데이터 타입인데 특별한 사항이 있지 않다면 그대로 두는 것이 좋다. 다음으로 rootdn은 suffix에서 지정한 것을 그대로 사용하고 cn을 root로 했다. cn은 기본 값이 Manager이다. root가 아닌 다른 이름으로 사용해도 상관없다. rootpw는 암호화된 루트의 비밀번호이다. 앞으로 LDAP에 관련된 설정을 할 때 여기에 적어준 패스워드를 사용하게 된다. 패스워드의 암호화는 독자가 개인적으로 선호하는 암호화 툴이 있다면 그것을 사용해도 무방하지만 OpenLDAP 자체에서 제공하는 slappasswd 사용을 권장한다.

# slappasswd -h {MD5} -s aaa
{MD5}R7zlx09Yn0hn29V+nKn4CA==

aaa라는 평문에 대한 MD5의 암호문이 생성되었다. 이 결과를 slapd.conf의 rootpw에 넣어주면 된다. slappasswd는 기본적으로 SSHA를 사용한다. 이외에도 CRYPT, MD5, SMD5, SHA 등의 방식을 지원하므로 -h 옵션을 사용해서 적당한 암호화 알고리즘을 선택해 사용하자. 주의할 것은 CRYPT는 운영체제의 의존적이기 때문에 항상 slapd가 동작하는 시스템 내에서만 사용 가능하며, 크랙이 가능한 알고리즘이므로 가급적 다른 것을 선택하도록 한다. 만약 NIS를 구성하는 시스템이 리눅스로만 이뤄진 것이 아니라, MS의 윈도우 액티브 디렉토리나 썬의 솔라리스 시스템이 있다면 더더욱 CRYPT 암호화 방식을 사용하면 안된다.

OpenLDAP은 데이터를 바이너리화시켜서 저장하는데 이러한 데이터를 저장해 둘 곳을 database 항목에서 설정해 줘야한다. 각 배포판에서 대부분은 /var/lib/ldap 디렉토리를 사용하도록 되어 있다. 필요하다면 다른 디렉토리를 설정해 줘도 무방하지만 해당 디렉토리의 소유권과 그룹이 ldap이 되도록 설정해 줘야 한다. index 부분에서는 지정한 항목에 대한 인덱스를 작성하여 LDAP에서 검색 속도를 빠르게 해준다.

서버 실행
서버에 대한 설정이 끝났으며 실행하도록 하자.

# /etc/init.d/slapd start

이제 OpenLDAP 서버가 구동됐다. 주의할 점은 OpenLDAP 서버가 구동하고 있는 시스템이 NIS 클라이언트로도 동작하도록 설정한 경우 부팅 시에 반드시 OpenLDAP 서버가 구동하도록 해줘야 한다는 것이다. 시스템이 LDAP을 이용한 NIS에 참여하고 있는데 LDAP 서버를 찾을 수 없게 되면 싱글 모드 이외에는 로그인하지 못하는 현상이 발생할 수도 있다.

그러므로 반드시 부팅시 LDAP 서버가 자동으로 구동되도록 설정해야 한다. 각 리눅스 배포판마다 설정 사항이 다르므로 각자의 환경에 맞는 설정을 하기 바란다. init level 3과 5로 부팅 시에 자동으로 실행되도록 설정했다. 레드햇이라면 ntsysv를 실행해 openldap을 체크해주면 된다(OpenLDAP 서버가 구동됐지만 아무런 데이터도 들어있지 않은 상태이다). 구동 여부를 확인하기 위해 검색 명령을 내려보도록 하자.
# ldapsearch -x -b ” -s base ‘(objectclass=*)’ namingContexts version: 2
version: 2

#
# filter: (objectclass=*)
# requesting: namingContexts version: 2
#

#
dn:
namingContexts: dc=solux,dc=sookmyung,dc=ac,dc=kr

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

이와 같은 결과가 나왔다면 서버가 정상적으로 작동하고 있다는 것이다.

데이터 옮기기
마이그레이션 툴의 사용
LDAP 서버가 정상적으로 구동이 되었다면 사용자 계정에 대한 정보를 입력하여 주면 된다. 일일이 수작업으로 ldif (‘LDAP Data Interchange Format’의 약자로 텍스트 형태의 LDAP entry를 표현하는데 사용된다) 파일을 생성하여 입력해도 되지만 마이그레이션 툴을 사용하면 어느 정도는 편리하게 입력할 수 있다. 마이그레이션 툴은 Perl로 작성된 간단한 유틸리티이다.

마이그레이션 툴을 실행하기 전에 먼저 migrate_common.ph 파일을 수정해야 한다. 다음의 네 부분만 고쳐주면 되며, 사용자와 시스템 경로명은 다를 수 있으므로 주의하기 바란다. 레드햇의 경우 패키지로 설치했다면 /usr/share/openldap/migration 디렉토리에 있다.

$DEFAULT_MAIL_DOMAIN = “solux.sookmyung.ac.kr”;
$DEFAULT_BASE = “dc=solux,dc=sookmyung,dc=ac,dc=kr”;
$DEFAULT_MAIL_HOST = “mail.solux.sookmyung.ac.kr”;
$EXTENDED_SCHEMA = 1;

계정 데이터 입력
migrate_all_online.sh의 스크립트는 /etc 디렉토리에 있는 hosts, groups, users, network, services 등의 파일의 내용을 LDAP으로 옮기고 그 내용이 시스템에서 그 내용을 필요로 할 때 LDAP 서버에서 읽게 하는 것이다. 이 부분은 실제 NIS만을 구성할 때는 불필요한 부분이므로 선택적으로 데이터를 입력하도록 하자.

원하는 데이터만 선택적으로 옮기기
우리는 사용자 인증 부분만을 LDAP으로 사용하려는 것이기 때문에 Group과 People이 필요하다. 실제 데이터를 넣기 전에 LDAP 데이터베이스에 데이터가 들어갈 기반 구조(base structure)를 구성해 줘야 한다. 그 중 하나가 migration_base.pl에 의해 생성된다. 먼저 base.ldif라는 파일을 생성해 줘야 한다.

# ./migrate_base.pl > base.ldif

base.ldif 파일을 열어 보자. 상당히 많은 내용이 담겨져 있겠지만 사용자 인증 부분에 필요한 부분만 사용할 것이기 때문에 필요 없는 부분들은 삭제하도록 하였다. 맨 윗 단락에 dn: dc=solux,dc=sookmyung,dc=ac,dc=kr로 되어있는 root node와 ou=People, ou=Goup인 세 부분만 남기고 나머지는 모두 지우자. ou=People은 passwd와 shadow 파일에 관련된 내용이 담기고 ou=Group에는 group에 관련된 내용이 담기게 된다. 그 내용은 다음과 같다.

dn: dc=solux,dc=sookmyung,dc=ac,dc=kr
ou: solux
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: solux.sookmyung.ac.kr

dn: ou=People,dc=solux,dc=sookmyung,dc=ac,dc=kr
ou: People
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: solux.sookmyung.ac.kr

dn: ou=Group,dc=solux,dc=sookmyung,dc=ac,dc=kr
ou: Group
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: solux.sookmyung.ac.kr

ldapadd는 ldapmodify 툴을 하드 링크한 것으로 LDAP 서버와 커넥션을 맺고 바인딩한 후에 entry를 추가한다. entry 정보는 직접 standard input으로 써 줄 수도 있고 -f 옵션을 이용해서 파일로부터 추가할 수도 있다. -D 옵션은 뒤에 binddn 파라미터와 함께 LDAP 디렉토리에 바인딩될 binddn을 지정해 준다. -W 옵션은 간단한 사용자 인증을 위해 패스워드를 받는 프롬프트를 띄운다. -w 옵션을 사용하면 -w passwd로 프롬프트에 패스워드를 입력하는 과정 없이 바로 결과가 출력된다. 패스워드를 입력한 후 다음의 메시지가 출력되면 성공적으로 기반 구조가 생성된 것이다.

# ldalpadd -x -D “cn=root,dc=solux,dc=sookmyung,dc=ac,dc=kr” -W -f base.ldif

adding new entry “dc=solux,dc=sookmyung,dc=ac,dc=kr”
adding new entry “ou=People,dc=solux,dc=sookmyung,dc=ac,dc=kr”
adding new entry “ou=Group,dc=solux,dc=sookmyung,dc=ac,dc=kr”

ldapsearch는 LDAP 서버와 커넥션을 맺고 바인딩을 해주며 지정된 파라미터에 따라 LDAP 서버로부터 데이터를 검색해주는 인터페이스이다. 필요한 데이터를 검색하기 위해 필터(filer)를 사용하는데 사용자가 필터를 지정하지 않은 경우 기본적으로 objectDlass=* 가 사용된다. -b 옵션은 검색을 시작할 곳을 지정해 준다.

# ldapsearch -b “dc=solux,dc=sookmyung,dc=ac,dc=kr” “objectclass=*”
version: 2

#
# filter: objectclass=*
# requesting: ALL
#

# solux, sookmyung, ac, kr
dn: dc=solux,dc=sookmyung,dc=ac,dc=kr
ou: solux
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: solux.sookmyung.ac.kr

# People, solux, sookmyung, ac, kr
dn: ou=People,dc=solux,dc=sookmyung,dc=ac,dc=kr
ou: People
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: solux.sookmyung.ac.kr

# Group, solux, sookmyung, ac, kr
dn: ou=Group,dc=solux,dc=sookmyung,dc=ac,dc=kr
ou: Group
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: solux.sookmyung.ac.kr

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3

우리가 base.ldif에 남겼던 대로 dc=solux,dc=sookmyung,dc=ac,dc=kr라는 루트 노드 밑에 ou=People,dc=solux,dc=sookmyung,dc=ac,dc=kr과 ou=Group, dc=solux, dc=soo kmyung, dc=ac, dc=kr라는 하위 노드가 생성된 것을 확인할 수 있다. 마이그레이션 툴을 사용하지 않는다면 직접 standard input으로 entry를 추가할 수 있다.

# ldapadd -D “cn=root,dc=solux,dc=sookmyung,dc=ac,dc=kr” -W << EOF
> dn: ou=People,dc=solux,dc=sookmyung,dc=ac,dc=kr
> ou: People
> objectClass: top
> objectClass: organizationalUnit
> objectClass: domainRelatedObject
> associatedDomain: solux.sookmyung.ac.kr
> Enter LDAP Password:

이렇게 타이핑해 줘도 LDAP 데이터베이스에 entry가 추가된다. 파일로 추가했던 것과 마찬가지로 adding new entry “ou=Group,dc=solux,dc=sookmyung,dc=ac,dc=kr”라는 메시지가 출력되면 정상적으로 실행된 것이다.
ldapdelete는 마찬가지로 LDAP 서버와 커넥션을 맺고 지정된 dn에 대해 바인딩을 한 후 하나 또는 그 이상의 entry를 삭제한다. dn argument를 지정해 주지 않으면 standard input으로 직접 입력해 줘야 한다. -v 옵션은 출력 결과를 진단하는데 사용된다.

# ldapdelete -vD “cn=root,dc=solux,dc=sookmyung,dc=ac,dc=kr” \\
> -W “ou=Hosts,dc=solux,dc=sookmyung,dc=ac,dc=kr”

ldapdelete 역시 마찬가지로 deleting entry “ou=Hosts,dc=solux,dc=sookmyung,dc=ac, dc=kr”과 같은 메시지가 출력된다면 정상적으로 실행된 것이지만 이번에도 역시 ldapsearch로 다시 한번 확인해 보길 바란다.

ldapdelete를 사용할 때 두 가지 주의할 점이 있다. ldapdelete는 LDAP 트리의 맨 마지막 노드인 리프 노드만을 삭제할 수 있다. 또 한 가지 루트 노드는 ldapdelete로 지워지지 않는다. 루트 노드를 꼭 삭제해야 한다면 ldap database 디렉토리 밑의 파일을 모두 삭제하고 데몬을 다시 실행해야 한다.
지금까지 우리가 원하는 데이터에 대한 base structure를 생성했다. 이제 실제 데이터를 LDAP 데이터베이스에 입력하면 된다. Group 정보를 입력하기 위해 group.ldif를 만들어 보자.

# ./migrate_group.pl /etc/group group.ldif

group.ldif 파일을 열어보면 /etc/group에 있는 내용과 동일한 그룹들을 볼 수 있다. 사용자 인증을 위해 LDAP을 사용할 때 UID, GID가 0번부터 LDAP 서버에서 인증을 받게할 수도 있지만 이 경우 루트 사용자조차도 항상 LDAP 서버가 동작하고 있어야 로그인할 수 있다. 그래서 여기서는 UID, GID가 1000번 이상인 사용자에 대해서만 LDAP 서버 인증을 받도록 설정할 것이다. 다시 말해 UID, GID가 1000번 이하인 사용자가 LDAP에 기록되어 있다면 로그인을 허용하지 않게 된다. 반드시 1000번 이하의 사용자는 LDAP 서버에 기록되어 있지 않아야 한다. group.ldif 파일에서 gid가 1000이하인 사용자는 모두 삭제하도록 하자. 이제 LDAP database에 추가할 entry 준비가 끝났다. ldapadd를 이용해서 입력한다.

# ldalpadd -x -D “cn=root,dc=solux,dc=sookmyung,dc=ac,dc=kr” -W -f group.ldif

마지막으로 People 정보를 넣을 차례다. 앞에서와 마찬가지로 먼저 passwd.ldif 파일을 만들자.

# ETC_SHADOW=/etc/shadow ./migrate_passwd.pl /etc/passwd passwd.ldif

passwd.ldif 파일을 열고 group.ldif 파일과 마찬가지로 uid가 1000번 이상인 user만 남기고 나머지는 모두 삭제한다. passwd.ldif 파일은 다음과 같은 형태가 될 것이다.

dn: uid=groou,ou=People,dc=pulib,dc=uos,dc=ac,dc=kr
uid: groou
cn: groou
sn: groou
mail: groou@pulib.uos.ac.kr
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$oB6FcysF$VADgUDJW7pKcrQtgCOZWY0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /export/home/groou

이제 ldap 서버에 추가하도록 하자.

# ldapadd -xD “cn=root,dc=solux,dc=sookmyung,dc=ac,dc=kr” -Wf passwd.ldif

시스템에 설치된 패키지에 따라서 objectClass나 attribute에 문제가 발생했다는 메시지가 나올 수 있다. 예를 들어 additional info: unrecognized objectClass ‘mailRecipient’ 혹은 additional info: attribute ‘mailHost’ not allowed 라는 메시지가 나왔다면 passwd.ldif 파일의 각 엔트리에서 해당 부분을 삭제한 후 다시 ldapadd 명령을 실행한다. 이러한 에러는 마이그레이션 툴에서 사용하는 ldap 스키마 파일이 다르기 때문이다. 버전에 따라서는 문제없이 그냥 진행 될 수도 있다.

LDAP 클라이언트 설정하기
LDAP 서버의 구성이 완료되었다. 이제는 시스템에서 사용자 인증 시에 LDAP에게 질의를 하도록 설정해야 한다.

/etc/ldap.conf 파일 설정
host 127.0.0.1
base dc=solux,dc=sookmyung,dc=ac,dc=kr
rootbinddn cn=root,dc=solux,dc=sookmyung,dc=ac,dc=kr
scope one

pam_min_uid 1000
pam_max_uid 65000
pam_filter objectclass=posixaccount
pam_login_attribute uid
pam_member_attribute gid
pam_template_login_attribute uid
pam_password md5

nss_base_passwd ou=People,dc=solux,dc=sookmyung,dc=ac,dc=kr?one
nss_base_shadow ou=People,dc=solux,dc=sookmyung,dc=ac,dc=kr?one
nss_base_group ou=Group,dc=solux,dc=sookmyung,dc=ac,dc=kr?one

People의 entry에서 1000번 이상인 것만 추가했다. pam_min_uid는 LDAP에서 1000번 이상인 것만 인증하도록 한다. 만약 1000번 미만의 uid를 추가했다면 pam_min_uid 값을 조절해 줘야 한다.

/etc/ldap.secret 파일 생성
이 파일에는 시스템에서 LDAP 서버에 연결할 때 사용할 패스워드를 적어두어야 한다. /etc/ldap.secret 파일을 만들고 파일에는 평문의 루트 패스워드를 입력한다. 시스템의 루트 패스워드가 아닌 slapd.conf에서 입력했던 rootpw의 암호화 되지 않은 패스워드를 말한다. 이 파일은 상당히 보안을 요하는 파일이므로 소유자와 그룹을 모두 root로 해두고 퍼미션을 600으로 해 둬서 일반 사용자가 접근하는 것을 막도록 한다. 주의할 점은 반드시 ldap.secret 파일에 패스워드를 타이핑한 후 엔터키를 눌러줘야 한다는 것이다. 파일이 두 번째 라인에서 끝나지 않으면 LDAP 서버와 커넥션을 맺을 수 없다.

NSS 설정하기
/etc/nsswitch.conf 파일 설정
여러 가지 많은 내용들이 적혀있지만 사용자 인증에 대한 항목은 passwd, shadow, group 등 세 항목이다.
passwd: db files ldap
shadow: db files ldap
group: db files ldap

이와 같이 ldap이란 항목을 추가해서 OpenLDAP 서버에 접근하여 인증받을 수 있도록 한다.

PAM 설정하기
/etc/pam.d/system-auth 파일 설정
시스템에서 어떤 식으로 인증을 처리할지를 결정한다. 앞에서 사용자 인증 순서를 말할 때 먼저 LDAP 서버에 질의를 하고 없다면 passwd, shadow 파일을 참조한다고 했는데 이 부분에서 처리하는 것이다. 아래 세 번째 auth 항목에 보면 use_first_pass라는 내용이 있는데 ldap을 먼저 이용하라는 옵션을 적어준 것이다.

#%PAM-1.0

auth required /lib/security/pam_env.so
auth sufficient /lib/security/pam_unix.so likeauth nullok
auth sufficient /lib/security/pam_ldap.so use_first_pass
auth required /lib/security/pam_deny.so

account required /lib/security/pam_unix.so
account [default=bad success=ok user_unknown=ignore service_err=ignore \\
system_err=ignore] /lib/security/pam_ldap.so

password required /lib/security/pam_cracklib.so retry=3
password sufficient /lib/security/pam_unix.so nullok md5 shadow use_authtok
password sufficient /lib/security/pam_ldap.so use_authtok
password required /lib/security/pam_deny.so

session required /lib/security/pam_mkhomedir.so skel=/etc/skel umask=026
session required /lib/security/pam_limits.so
session required /lib/security/pam_unix.so
session optional /lib/security/pam_ldap.so

주의할 점은 반드시 하나의 항목은 반드시 단일 라인 명령이어야 한다는 것이다. ‘\\‘를 사용해서 라인을 나누는 것은 상관없다.

/etc/pam.d/passwd 파일 설정
passwd 파일에 접근할 때의 pam 설정이다. 다음과 같이 변경해 준다.
#%PAM-1.0

auth required /lib/security/pam_stack.so service=system-auth
account required /lib/security/pam_stack.so service=system-auth
password required /lib/security/pam_stack.so service=system-auth

auth sufficient /lib/security/pam_ldap.so
auth required /lib/security/pam_pwdb.so shadow nullok

account sufficient /lib/security/pam_ldap.so
account required /lib/security/pam_pwdb.so

password required /lib/security/pam_cracklib.so retry=3 \\
minlen=4 dcredit=0 ucredit=0
password sufficient /lib/security/pam_ldap.so use_authtok
password required /lib/security/pam_pwdb.so use_authtok \\
nullok md5 shadow

NIS 테스트와 남아있는 과제
테스트에는 별다른 방법이 없다. 단순히 LDAP에 적어준 계정으로 ssh나 telnet을 이용하여 로그인을 시도하여 보면 된다.
NIS 구성은 끝났지만 문제점이 하나 남아있다. 사용자의 추가, 변경, 삭제가 모두 LDAP에서 이뤄져야 하는데 이것은 기존에 단일 시스템처럼 자유롭지가 못하다. 여기서는 지면상 사용자를 추가하는 스크립트를 PHP를 이용하여 작성한 예제만을 살펴보도록 하겠다. 다음은 useradd.php 파일이다.

<?php

$user = “groou”; //추가할 사용자 id
$passwd = “1234”; // 사용자의 패스워드
$uid = 1001; // 사용자의 uid, gid

$rootdn = “cn=root,dc=solux,dc=sookmyung,dc=ac,dc=kr”;
$ldaphost = “127.0.0.1”;
$rootpw = “aaa”; // LDAP 루트 사용자 패스워드

$lcon = ldap_connect ($ldaphost);
$lbind = ldap_bind ($lcon, $rootdn, $rootpw);

$user_dn = “uid=”.$user.”,ou=People,dc=solux,dc=sookmyung,dc=ac,dc=kr”;
$adduser[“uid”] = $user;
$adduser[“cn”] = $user;
$adduser[“objectClass”][0] = “account”;
$adduser[“objectClass”][1] = “posixAccount”;
$adduser[“objectClass”][2] = “top”;
$adduser[“objectClass”][3] = “shadowAccount”;
$adduser[“userPassword”] = “{crypt}”.crypt ($passwd); // 패스워드의 crypt 암호화
// 동일한 기종끼리 묶는 것이 아니라면
// md5 같은 다른 암호화 알고리즘을 써야한다.
$adduser[“shadowLastChange”] = “11921”;
$adduser[“shadowMax”] = “99999”;
$adduser[“shadowWarning”] = “7”;
$adduser[“loginShell”] = “/bin/bash”;
$adduser[“uidNumber”] = $uid;
$adduser[“gidNumber”] = $uid;
$adduser[“homeDirectory”] = “/export/home/user1/”.$user;

$group_dn = “cn=”.$user.”,ou=Group,dc=solux,dc=sookmyung,dc=ac,dc=kr”;
$addgroup[“cn”] = $user;
$addgroup[“objectClass”][0] = “posixGroup”;
$addgroup[“objectClass”][1] = “top”;
$addgroup[“userPassword”] = “x”;
$addgroup[“gidNumber”] = $uid;

$ladd = ldap_add ($lcon, $user_dn, $adduser);
$ladd = ldap_add ($lcon, $group_dn, $addgroup);
ldap_close ($lcon);
?>

PHP를 셸 스크립트로 사용하는 곳에서는 다음과 같은 명령으로 사용자를 추가한다.

# php useradd.php

조금만 변경하면 웹 페이지 상에서 사용자 계정을 발급 받을 수 있도록 변경도 가능할 것이다.

계정 정보 통합을 더욱 쉽게
시스템은 많고 계정 정보는 통합해야 하는데 기존의 yp로는 관리하기가 너무 힘들고 어렵다고 생각되어 OpenLDAP을 이용해 볼 생각으로 시도한 방법이었다. 관리의 편리성으로 인해 좀더 큰 규모의 시스템을 구축하기가 쉬워졌고 특히 다른 OS간의 연결이 용이해 졌다. 유닉스 계열의 OS와 윈도우의 경우 계정 정보 통합이 어려웠지만 MS의 액티브 디렉토리가 LDAP의 일종이므로 이 정보를 이용하여 연결할 수도 있다. 또 계정 정보가 많아지고 NIS에 참여하는 노드가 많아진다면 LDAP의 리플리케이션(replication) 기능을 이용하여 슬레이브 LDAP 서버를 사용할 수 있도록 설정하여 처리 능력을 향상시킬 수 있다. NIS가 필요한 시스템에서는 이 방법이 최선이 아닐까 생각된다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

3 Responses

  1. 저작자 말해보세요:

    안녕하세요,
    본 글의 저작자 입니다.

    마이크로소프트웨어 2003년 3월호에 투고했던 내용인데 출처 없이 떠도는 내용이 모두 이곳을 원 출처인것 처럼 링크하고 있더군요. 원래의 출처를 정확하게 명시해주십시오.

    문제가 있거나 다른 의견이 있으시면 jst.kim@gmail.com 으로 메일을 주시면 감사하겠습니다.

  2. 서진우 말해보세요:

    네 그렇군요. 본의 아니게 죄송하게 되었습니다. 원래는 비공개 개인 홈페이지로 운영되다가 1년전쯤 기존 시판 DB를 일괄적으로 본 블로그 DB로 마이그레이션을 시킴으로 몇몇 게시물의 출처가 명확하게 표시되어 있지 않았네요. 양해 바랍니다. 좋은글 덕분에 많은 공부가 되었습니다. 감사합니다.

페이스북/트위트/구글 계정으로 댓글 가능합니다.