[보안]LDAP을 이용한 통합계정관리
ㅇ 문서소개
- openldap을 이용하여 계정통합을 하는 부분에 대한 자료는 여러가지가 있는데 이 문서는 거기에 TLS 암호화 통신, 각호스트별 접속 제한 등의 내용을 더 추가하였습니다.
- 가장 먼저 LDAP을 통하여 사용자 인증을 통합합니다.
- 사용자 계정에 대한 홈디렉토리는 nfs와 autofs 를 이용하여 중앙관리합니다. 각 서버별로 홈디텍로리를 따로 관리할 필요가 없습니다.
- autofs 설정에 대한 부분도 ldap 디렉토리에 넣어서 개별서버마다 설정을 할 필요가 없도록 합니다.
- autofs 는 사용자가 로그인했을 경우에만 홈디렉토리를 마운트하는 것입니다.
- 사용자, 그룹 추가, 삭제, 변경에 대한 부분은 cpu 라는 프로그램을 이용하여 중앙관리합니다. 굳이 ldap 명령어를 쓰지 않아도 되어 편리합니다.
- 각 호스트별로 접속할 수 있는 사용자를 제한합니다. LDAP을 쓰면 중앙집중적으로 사용자를 관리하지만 각 개별서버별로 접속제한을 해야 할 경우도 있습니다.
- TLS 암호화 통신을 이용하여 보안을 강화합니다.
- ldap 에 지정되지 않은 로컬사용자도 접속이 가능하도록 합니다.
ㅇ 주의사항
- 본 내용은 Redhat Enterprise Linux 3 에서 테스팅을 한 내용이며 다른 리눅스 배포판에서도 비슷하게 적용이 가능합니다.
- LDAP 에 대한 소개가 아니므로 이에 대한 설명은 다른 문서를 참고하시기 바랍니다.
- 본 문서에 내용을 추가한다면 ftp, apache 등에서의 ldap 인증부분, Windows 와의 인증통합 부분등이 있을 것입니다.
================================================
관련자료
http://www.linuxjournal.com/node/6266/print : OpenLDAP Everywhere - openldap 을 통한 계정통합 및 autofs 에 대한 내용. 상세한 세팅내용이 담겨있음. 이번에 주로 참고하였음.
http://www.linuxjournal.com/article/5505 : Highly Available LDAP - 공개 ha 프로그램을 이용하한 ldap ha 구성에 대한 내용임.
O'REILLY 의 LDAP System Administration 서적
http://database.sarang.net/?inc=read&aid=1243&criteria=ldap&subcrit=tuto... : LDAP의 모든것 ver 20011126 - 국내에 ldap 에 대한 한글자료가 별로 없는데 그나마 상세하게 ldap 에 대한 설명이 들은 한글문서입니다.
http://www.samag.com/documents/s=9494/sam0502a/0502a.htm : Centralized User Management with Kerberos and LDAP - kerberos, ldap을 이용한 사용자 통합에 대한 문서로 cpu 프로그램에 대한 소개가 있음
**************** 사전 확인
dc 정하기
rootpw 설정
계정정책 : UID 범위
계정관리프로그램 cpu 사용 여부
openldap-devel : openldap 과 연관된 프로그램을 개발할때 필요함. cpu 프로그램을 사용해야 할 경우 필요함
openldap : OpenLDAP 서버와 클라이언트 프로그램을 실행하기 위한 라이브러리
openldap-clients : client 프로그램
openldap-servers : server 프로그램
nss_ldap : NSS library and PAM module for LDAP
**************** ldap 서버설정
/etc/openldap/slapd.conf 에서 rootpw 를 추가함. 이를 통하여 root 권한 인증 사용함
아래 패스워드는 slappasswd 를 이용하여 생성함
[root@localhost openldap]# diff slapd.conf.orig slapd.conf
71a72
> rootpw {SSHA}HwbKjO6Omoxk2Sswm8NbHZbCx9LxextJ
# grep -v "^#" /etc/openldap/slapd.conf
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/redhat/autofs.schema
include /etc/openldap/schema/redhat/kerberosobject.schema
database ldbm
suffix "dc=isoc,dc=com"
rootdn "cn=Manager,dc=isoc,dc=com"
rootpw {SSHA}HwbKjO6Omoxk2Sswm8NbHZbCx9LxextJ
directory /var/lib/ldap
index objectClass,uid,uidNumber,gidNumber,memberUid eq
index cn,mail,surname,givenname eq,subinitial
#access control
access to attr=userPassword
by self write
by anonymous auth
by dn="cn=manager,dc=isoc,dc=com" write
by * compare
access to *
by self write
by dn="cn=manager,dc=isoc,dc=com" write
by * read
** rootpw 는 linux
ㅇ ldap server 세팅
위에서 suffix 를 조정하고 rootdn도 이와 맞추며 rootpw 를 설정하면 됨
# /etc/init.d/ldap start
Starting slapd: [ OK ]
**************** 기본 정보 입력
ㅇ directory structure 생성
아래 내용을 top.ldif 로 저장
dn: dc=isoc,dc=com
objectclass: dcObject
objectclass: organization
o: isoc Company
dc:isoc
dn: cn=manager, dc=isoc, dc=com
objectclass: organizationalRole
cn: manager
dn: ou=people, dc=isoc, dc=com
ou: people
objectclass: organizationalUnit
objectclass: domainRelatedObject
associatedDomain: isoc.com
dn: ou=contacts,ou=people, dc=isoc, dc=com
ou: contacts
ou: people
objectclass: organizationalUnit
objectclass: domainRelatedObject
associatedDomain: isoc.com
dn: ou=group, dc=isoc, dc=com
ou: group
objectclass: organizationalUnit
objectclass: domainRelatedObject
associatedDomain: isoc.com
# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f top.ldif
Enter LDAP Password:
adding new entry "dc=isoc,dc=com"
adding new entry "cn=manager, dc=isoc, dc=com"
adding new entry "ou=people, dc=isoc, dc=com"
adding new entry "ou=contacts,ou=people, dc=isoc, dc=com"
adding new entry "ou=group, dc=isoc, dc=com"
** -w password 로 해도 됨. -W 는 명령행에서 입력
위에서 입력한 내용을 검색하기
# ldapsearch -x -b 'dc=isoc,dc=com'
version: 2
#
# filter: (objectclass=*)
# requesting: ALL
#
# isoc, com
dn: dc=isoc,dc=com
objectClass: dcObject
objectClass: organization
o: isoc Company
dc: isoc
# manager, isoc, com
dn: cn=manager, dc=isoc, dc=com
objectClass: organizationalRole
cn: manager
# people, isoc, com
dn: ou=people, dc=isoc, dc=com
ou: people
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: isoc.com
# contacts, people, isoc, com
dn: ou=contacts,ou=people, dc=isoc, dc=com
ou: contacts
ou: people
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: isoc.com
# group, isoc, com
dn: ou=group, dc=isoc, dc=com
ou: group
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: isoc.com
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 5
** 옵션참고
-x : simple authentication
-D : binddn
-f file
-W : prompt for simple authentication
-b : searchbase
**************** 계정추가하기
ㅇ ldap 으로 단일한 리눅스 로그인 만들기
System accounts : UID < 500
Real people in LDAP : 499 < UID < 10,000
Local users, groups (not in LDAP ) > 10,000
ㅇ 로컬 컴퓨터 사용자 엔트리 만들기
ldaptest 라는 계정을 만들며 uid 1000 gid 1000으로 하고 홈디렉토리는 /home/ldaptest 로 함
# cat people.ldif
dn: uid=ldaptest,ou=people,dc=isoc,dc=com
uid: ldaptest
cn: ldap test
givenname: ldaptest
sn: sn
mail: aa@a.com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: kerberosSecurityObject
objectClass: shadowAccount
userPassword: {crypt}$1$OQAQLKrD$ktucNP.aAo/w5gbuAIV6H1
shadowLastChange: 11547
shadowMax: 99999
shadowFlag: 0
krbname: lddd@isoc.com
loginShell: /bin/bash
uidNumber: 1000
gidNumber : 1000
homeDirectory: /home/ldaptest
gecos: gecos
아래와 같이 추가하여줌
# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f people.ldif
Enter LDAP Password:
adding new entry "uid=ldaptest,ou=people,dc=isoc,dc=com"
아래와 같이 검색함
# ldapsearch -x -b "dc=isoc,dc=com" "(objectclass=*)"
사용자 지우기
ldapdelete -x -D 'cn=manager,dc=isoc,dc=com' 'uid=ldaptest,ou=people,dc=isoc,dc=com' -W
** 기존계정정보 이용하여 마이그레이션하기
/usr/share/openldap/migration/migrate_passwd.pl
/usr/share/openldap/migration/migrate_group.pl
사전에 migrate_common.ph 에서 몇가지 옵션을 수정함.
71 $DEFAULT_MAIL_DOMAIN = "padl.com";
74 $DEFAULT_BASE = "dc=padl,dc=com";
90 $EXTENDED_SCHEMA = 1;
ㅇ 그룹 엔트리 만들기
# cat group.ldif
dn: cn=webdev,ou=group,dc=isoc,dc=com
objectClass: posixGroup
objectClass: top
cn: webdev
gidNumber: 2000
memberUid: ldaptest
# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f group.ldif
Enter LDAP Password:
adding new entry "cn=webdev,ou=group,dc=isoc,dc=com"
2000 gid 에 해당하는 webdev 그룹을 만들기 ldaptest 를 이 그룹에 넣어줌
아래와 같이 검색함
# ldapsearch -x -b 'dc=isoc,dc=com'
**************** ldap client 설정
ㅇ ldap client 설정하기
authconfig 이용하여 설정
User Information Configuration 에서 Use LDAP 선택 -> Next -> Authentication Configuration 에서 Use LDAP Authentication 사용함. Server 및 Base DN에 적당하게 값을 넣음. 여기서는 dc=isoc,dc=com
# diff /etc/ldap.conf.orig /etc/ldap.conf
18c18
< base dc=example,dc=com
---
> base dc=isoc,dc=com
# diff /etc/openldap/ldap.conf.orig /etc/openldap/ldap.conf
16c16
< BASE dc=example,dc=com
---
> BASE dc=isoc,dc=com
# diff /etc/nsswitch.conf.orig /etc/nsswitch.conf
33,35c33,35
< passwd: files
< shadow: files
< group: files
---
> passwd: files ldap
> shadow: files ldap
> group: files ldap
53c53
< protocols: files
---
> protocols: files ldap
55c55
< services: files
---
> services: files ldap
57c57
< netgroup: files
---
> netgroup: files ldap
61c61
< automount: files
---
> automount: files ldap
** 위와 같이 바꾼후 해당 대몬 프로그램을 재시작해야 인증을 ldap 이용함. sshd 에서도 재시작하지 않는 경우 제대로 인증을 하지 못했음
**************** user 변경 프로그램
http://cpu.sourceforge.net/ 최신버전 다운로드
openldap-devel 필요함
./configure --prefix=/usr/local/cpu
make
make install
이제 /usr/local/cpu 에 프로그램이 설치가 된다.
grep isoc /usr/local/cpu/etc/cpu.conf
BIND_DN = cn=Manager,dc=isoc,dc=com
USER_BASE = ou=People,dc=isoc,dc=com
GROUP_BASE = ou=Group,dc=isoc,dc=com
위와 같이 dn을 바꾸어준다.
#HASH = "md5"
HASH = "crypt"
HASH 를 md5 에서 crypt 로 바꾸어준다.
여기서 sldapd.conf 의 root 비밀번호를 넣어주어야 한다.
BIND_PASS = xxxx
MAX_UIDNUMBER = 10000
MIN_UIDNUMBER = 1000
MAX_GIDNUMBER = 10000
MIN_GIDNUMBER = 1000
MIN_UIDNUMBER, MIN_GIDNUMBER 를 100에서 적절한 값으로 바꾼다.
# /usr/local/cpu/sbin/cpu useradd test
# /usr/local/cpu/sbin/cpu userdel test
$ /usr/local/cpu/sbin/cpu usermod -p test2
[root@localhost openldap]# id test
uid=1001(test) gid=1001(test) groups=1001(test)
[root@localhost openldap]# /usr/local/cpu/sbin/cpu groupmod -g 1005 test
Group test successfully modified!
[root@localhost openldap]# id test
uid=1001(test) gid=1001 groups=1001,1005(test)
[root@localhost openldap]# /usr/local/cpu/sbin/cpu groupmod -n test222 test
Group test222 successfully modified!
[root@localhost openldap]# id test
uid=1001(test) gid=1001 groups=1001,1005(test222)
**************** nfs, autofs 세팅
ㅇ nfs 서버 세팅
# cat /etc/exports
/tmp 192.168.0.0/255.255.255.0(rw,sync)
# /etc/init.d/nfs start
ㅇ autofs 세팅
auto.master 파일이 메인파일이며 여기에서 마운트 포인트와 세부 설정파일을 지정함.
아래에서는 /home 디렉토리에 접근하는 경우 /etc/auto.home 파일을 참고하며 auto.home 은 /home 의 모든 하위 디렉토리(*)에 접근하는 경우 nfs 192.168.0.24:/tmp 의 해당 디렉토리에 마운트함
# cat /etc/auto.master
/home /etc/auto.home --timeout=5
# cat /etc/auto.home
* -rw,soft,intr 192.168.0.24:/tmp/&
home 디렉토리 공유하기 위해 automount 세팅하기 (사전에 autofs 는 세팅을 해야함)
# cat auto.master.ldif
dn: ou=auto.master,dc=isoc,dc=com
objectClass: top
objectClass: automountMap
ou: auto.master
dn: cn=/home,ou=auto.master,dc=isoc,dc=com
objectClass: automount
cn: /home
automountInformation: ldap:ou=auto.home,dc=isoc,dc=com
# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f auto.master.ldif
Enter LDAP Password:
adding new entry "ou=auto.master,dc=isoc,dc=com"
adding new entry "cn=/home,ou=auto.master,dc=isoc,dc=com"
# cat auto.home.ldifc
dn: ou=auto.home,dc=isoc,dc=com
objectClass: top
objectClass: automountMap
ou: auto.home
dn: cn=/,ou=auto.home,dc=isoc,dc=com
objectClass: automount
cn: *
automountInformation: 192.168.0.24:/tmp/&
# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f auto.home.ldifc
Enter LDAP Password:
adding new entry "ou=auto.home,dc=isoc,dc=com"
adding new entry "cn=test,ou=auto.home,dc=isoc,dc=com"
이렇게 하는 경우 /etc/auto.master 를 ldap 에서 사용할 수 있도록 바꾸어 줄수 있음
# cat /etc/auto.master
#/home /etc/auto.home --timeout=5
/home ldap:192.168.0.23:ou=auto.home,dc=isoc,dc=com --timeout=5
ㅇ 특정 호스트에 접속가능한 사용자 제한하기
ou=hosts 가 먼저 있어야 한다.
# cat host.ldif
dn: ou=hosts, dc=isoc, dc=com
ou: hosts
objectclass: organizationalUnit
objectclass: domainRelatedObject
associatedDomain: isoc.com
# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f host.ldif
이제 특정 호스트와 사용자에 대한 정보를 입력한다. 아래에서는 cn을 linux 를 하였다.
# cat iphost.ldif
dn: cn=linux,ou=hosts,dc=isoc,dc=com
objectClass: ipHost
objectClass: device
objectClass: extensibleObject
ipHostNumber: 192.168.0.23
cn: linux.isoc.com
cn: linux
member: uid=test,ou=people,dc=isoc,dc=com
member: uid=test2,ou=people,dc=isoc,dc=com
# ldapadd -x -D 'cn=manager,dc=isoc,dc=com' -W -f iphost.ldif
위에서는 192.168.0.23 에 test, test2 계정만 접속가능하도록 설정하였다.
ldap에 위의 정보를 입력한 후 각 ldap client 에 위 기능을 사용할 수 있도록 설정해야 한다.
이는 /etc/ldap.conf 에 다음 항목을 추가한다. 위에서 사용한 dn을 넣어주어야 한다.
pam_groupdn cn=linux,ou=hostss,dc=isoc,dc=com
pam_member_attribute member
테스팅을 한 결과 /etc/ldap.conf 에 pam_groupdn 설정을 두개 넣으면 작동을 하지 않았다.
그렇지만 각 ldap client 쪽에 이 설정이 두가지 들어갈 일이 없으므로 문제가 되지는 않는다.
iphost.ldif 에 설정한 내용을 각 ldap client 별로 ldap에 넣어주고 이후에는 그 설정내용만 계속 수정하면 된다.
**************** ldap 에서 TLS 사용한 암호화 통신
/etc/openldap/slapd.conf 에서 TLS 관련한 부분을 활성화해줌
33 # The next three lines allow use of TLS for connections using a dummy test
34 # certificate, but you should generate a proper certificate by changing to
35 # /usr/share/ssl/certs, running "make slapd.pem", and fixing permissions on
36 # slapd.pem so that the ldap user or group can read it.
37 TLSCertificateFile /usr/share/ssl/certs/slapd.pem
38 TLSCertificateKeyFile /usr/share/ssl/certs/slapd.pem
39 TLSCACertificateFile /usr/share/ssl/certs/ca-bundle.crt
slapd.pem 파일은 openldap-servers 를 설치시 자동으로 생성하며 수동으로 생성시에는 /usr/share/ssl/certs 디렉토리에서 make slapd.pem 명령어를 이용하여 생성할 수 있음. make slapd.pem 을 실행하면 키 생성, CSR (SSL certificate signing requests), self-signed SSL test certificates 를 자동으로 처리해줌. 상세한 내용은 openssl 에서 참조함. 생성후에는 퍼미션과 사용자를 조정해주어야 함
# chown root.ldap slapd.pem
# chmod 640 slapd.pem
활성화해준 뒤에는 /etc/init.d/ldap restart 해줌
ldap client 에서는 authconfig 에서 Use TLS 를 체크하여주면 됨
이제부터는 ldap client 와 ldap server 간에 TLS를 이용하여 보안통신을 함.
*** 기타
위와 같이 사용하면 별도로 만든 로컬계정은 접속이 되지 않습니다.
이경우 /etc/pam.d/system-auth 에서 아래 행을 주석처리합니다.
account [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_ldap.so
ldap에 지정된 계정을 제외한 다른 사용자를 무시하도록 설정된 내용으로서 주석처리하면 로컬 계정 사용이 가능합니다.
x윈도우나 ssh등이 아닌 콘솔 로그인 상황에서 접속시 로그인에 문제가 있습니다.
다음의 항목을 주석처리해 주면 됩니다.
session required pam_limits.so