[클러스터] OpenLDAP을 이용한 통합 시스템 환경 구축하기 – 아랑

################################################################################################
#
#  OpenLdap 을 이용한 통합 시스템 환경 구축 하기
#
################################################################################################

작성일 : 2009년 10월 6일
작성자 : 서 진우 / 클루닉스 (
alang@clunix.com )

본 문서는 RHEL4.7 기반에서 설치되고, 테스트되었었습니다.
본 문서는 LDAP 에 대한 기본 계념을 이미 이해한 사람에 대해 실질적인 LDAP을 이용한 통합 시스템
환경 구축에 관련된 정보를 제공하고자 작성되었음 알려드립니다.
LDAP 계념에 대한 설명은 다른 관련 문서를 통해 참고하길 바랍니다.

– 주요 내용

1. OpenLdap 서버, 클라이언트  패키지 설치
2. OpenLdap 서버 기본 설정
3. 로컬 계정 정보 마이그레이션
4. OpenLdap 클라이언트 기본 설정
5. OpenLdap 클라이언트 상세 설정
6. OpenLdap DB 내용 수정
7. OpenLdap DB 내용 삭제
8. 단일 사용자, 그룹 추가
9. 사용자별 접근 호스트 제한
10. Change Password Utility를 이용한 사용자 계정 관리
11. 사용자 홈디렉토리 자동 생성
12. Autofs를 이용한 NFS 홈디렉토리 automount
13. OpenLdap 데이터 백업 및 복구
14. Replication을 이용한 LDAP 이중화
15. GUI를 통한 OpenLdap 관리
16. OpenLDAP 과 Samba 연동
17. TLS 인증을 통한 LDAP 관리 8. 단일 사용자, 그룹 추가

###############################################################################################

1. OpenLdap 서버, 클라이언트 패키지 설치

OpenLdap 환경 구성을 위해서는 아래 패키지가 사전에 설치 되어 있어야 한다.

openldap-servers-2.2.13-12.el4 (server)
openldap-2.2.13-12.el4 (server,client)
openldap-clients-2.2.13-12.el4 (server,client)
openldap-devel-2.2.13-12.el4 (server,client)
nss_ldap-253-5.el4 (server,client)
compat-openldap-2.1.30-12.el4 (server,client)

설치는 RPM 으로 설치하면 된다.

2. OpenLdap 서버 기본 설정

# vi /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

allow bind_v2

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args
loglevel        128

database        bdb
suffix          “dc=gridcenter,dc=hpc”
# suffix 는 OpenLDAP에서 사용하는 최상위 DN을 정의하는 것이다.

rootdn          “cn=root,dc=gridcenter,dc=hpc”   
# rootdn은  OpenLDAP 관리용 DN 으로 object 추가, 삭제 시 인증 DN으로 사용되어 진다.
# 아래의 rootpw 패스워드를 통해 해당 DN을 인증하게 된다.

rootpw                  {SSHA}qS6wijlC3JBTJOC5L1mbKCjT8Xk91ceN

# rootpw 는 평문암호로 지정할 수도 있고, 암호화된 암호로 지정할수도 있다.
# slappasswd 명령을 통해 암호화된 암호로 지정하는 것을 권장한다.

directory       /var/lib/ldap

index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

# 여기까지가 기본 설정이다. 기본 설정만으로 OpenLDAP 구동이 가능하다.
# 하지만 실제 사용을 위해서는 아래와 같이 보안 설정등의 추가 설정이 필요하다.

access to dn.subtree=”dc=gridcenter,dc=hpc” attrs=userPassword
       by self write
       by anonymous read
       by * auth
# 위 설정은 일반 사용자가 자기 계정의 패스워드 변경을 할 수 있게 보안을 허용하는
# 설정이다.

access to dn.subtree=”ou=People,dc=gridcenter,dc=hpc”
        by * read
# ou=People,dc=gridcenter,dc=hpc 의 Entry 값을 읽기 가능하게 허용한다.

access to dn.subtree=”ou=Group,dc=gridcenter,dc=hpc”
        by * read

# ou=Group,dc=gridcenter,dc=hpc 의 Entry 값을 읽기 가능하게 허용한다.

access to dn.subtree=”ou=Hosts,dc=gridcenter,dc=hpc”
        by * read
access to dn.subtree=”ou=Netgroup,dc=gridcenter,dc=hpc”
        by * read
# 호스트별 사용자 접근 제어를 할때 사용되는 OU 들이다. 해당 OU에 대한 Entry값을 읽기 허용한다.

access to *
       by self write
       by users read
       by anonymous auth

————————————————————————————————–

아래는 slapd.conf 설정의 rootpw 에 사용된 암호화된 암호를 생성하는 방법이다.

# slappasswd
New password:  <- rootpw 에 사용할 암호 입력
Re-enter new password: <- 재입력
{SSHA}T33/lGD7kC8x2oP1m2PwntyrOp7p2xfc

위 암호문을 slapd.conf 의 rootpw 설정에 입력하면 된다.

# /etc/rc.d/init.d/ldap start 
-> ldap 서버 데몬을 실행한다.

# ls /var/lib/ldap
__db.001  __db.002  __db.003  __db.004  __db.005  dn2id.bdb  id2entry.bdb  log.0000000001
-> ldap 기본 DB가 생성된것을 확인한다.

이제 아래의 방법으로 LDAP 내용을 검색해 본다.
openldap-client 를 설치하면 아래에서 사용하는 ldapsearch 와 같은 client 도구를 사용할 수 있다.

# ldapsearch -x -b ” -s base ‘(objectclass=*)’ namingContexts version: 2
———————————————————————————–
# extended LDIF
#
# LDAPv3
# base <> with scope base
# filter: (objectclass=*)
# requesting: namingContexts version: 2
#

# search result
search: 2
result: 0 Success

# numResponses: 1

# ldapsearch -x -b ‘dc=gridcenter,dc=com’
————————————————————————————-
# extended LDIF
#
# LDAPv3
# base <dc=gridcenter,dc=com> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

이것으로 LDAP 기본 설치 및 설정을 완료하였다. 다음으로는 초기 설정된 LDAP 환경에 계정 관련 DB를
생성하는 방법에 대해 알아보도록 하자.

최초의 계정 DB 생성은 기존 PAM 인증환경의 passwd 에 생성된 로컬 계정을 LDAP 계정으로 마이그레이션
시키는 방법으로 생성하면 된다.

3. 로컬 계정 정보 마이그레이션

/usr/share/openldap/migration 디렉토리로 가면, 다양한 데이터를 LDAP DB로 마이그레이션
해주는 perl scripts 가 존재 한다.

# cd /usr/share/openldap/migration/

위 migration 도구를 사용하기 위해서는 먼저 migrate_common.ph 파일의 설정을 변경해야 한다.

# vi migrate_common.ph
———————————————————————————————–
.
$DEFAULT_MAIL_DOMAIN = “gridcenter.hpc”;
$DEFAULT_BASE = “dc=gridcenter,dc=hpc”;
$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=gridcenter,dc=hpc 로 되어있는 root dn과 ou=People, ou=Goup인 세 부분만 남기고
나머지는 모두 지우자. ou=People은 passwd와 shadow 파일에 관련된 내용이 담기고 ou=Group에는 group에
관련된 내용이 담기게 된다. 그 내용은 다음과 같다.

# vi base.ldif
———————————————————————————————
dn: dc=gridcenter,dc=hpc
dc: gridcenter
objectClass: top
objectClass: domain
objectClass: domainRelatedObject
associatedDomain: gridcenter.hpc

dn: ou=People,dc=gridcenter,dc=hpc
ou: People
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: gridcenter.hpc

dn: ou=Group,dc=gridcenter,dc=hpc
ou: Group
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: gridcenter.hpc
——————————————————————————————–

migration tool 을 통해 생성된 ldif 파일을 ldap db 에 입력한다.

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f base.ldif
Enter LDAP Password: <- rootpw 입력

adding new entry “dc=gridcenter,dc=hpc”
adding new entry “ou=People,dc=gridcenter,dc=hpc”
adding new entry “ou=Group,dc=gridcenter,dc=hpc”

입력된 DB를 확인한다.

# ldapsearch -x -b ‘dc=gridcenter,dc=hpc’
———————————————————————————————
# extended LDIF
#
# LDAPv3
# base <dc=gridcenter,dc=hpc> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#

# People, gridcenter.hpc
dn: ou=People,dc=gridcenter,dc=hpc
ou: People
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: gridcenter.hpc

# Group, gridcenter.hpc
dn: ou=Group,dc=gridcenter,dc=hpc
ou: Group
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: gridcenter.hpc

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntryes: 2
———————————————————————————————

아래와 같이 특정 dn 하위의 특정 항목만을 검색할 수도 있다.

# ldapsearch -x -b “dc=gridcenter,dc=hpc” “ou=People”
——————————————————————————————-
# People, gridcenter.hpc
dn: ou=People,dc=gridcenter,dc=hpc
ou: People
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: gridcenter.hpc

# ldapsearch -x -b “dc=gridcenter,dc=hpc” “ou=Group”
——————————————————————————————–
# Group, gridcenter.hpc
dn: ou=Group,dc=gridcenter,dc=hpc
ou: Group
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: gridcenter.hpc

위 절차를 통해  LDAP DB 에 gridcenter.hpc 도메인과 그 하위에  People 과 Group 이란 ou가 생성되었다.
이제 People 에는 /etc/passwd 정보를, Group 에는 /etc/group 정보를 입력해야 한다.

이제 아래 방법으로 group 정보를 마이그레이션 한다.

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

group.ldif 파일에 /etc/group 에 존재하는 모든 그룹 정보가 ldap 형태로 변환되어 있다.
GUID 가 1000 번 이하인 것은 모두 삭제 하도록 한다.

LDAP 서버로 계정 정보가 통합되면, root 와 같은 시스템 계정 역시 LDAP 에서 받아 오게 되므로,
긴급 사항에 시스템 계정의 접속 관련 문제가 발생할 수 있다.

LDAP으로 통합되는 계정 관련 정보는 순수 사용자 계정으로 제한하는 것을 권장한다.

# vi group.ldif
———————————————————————————————
dn: cn=admin,ou=Group,dc=gridcenter,dc=hpc
objectClass: posixGroup
objectClass: top
cn: admin
userPassword: {crypt}x
gidNumber: 1000

dn: cn=alang,ou=Group,dc=gridcenter,dc=hpc
objectClass: posixGroup
objectClass: top
cn: alang
userPassword: {crypt}x
gidNumber: 1001
.
.
——————————————————————————————–

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f group.ldif
Enter LDAP Password:
adding new entry “cn=admin,ou=Group,dc=gridcenter,dc=hpc”
adding new entry “cn=alang,ou=Group,dc=gridcenter,dc=hpc”
adding new entry “cn=user01,ou=Group,dc=gridcenter,dc=hpc”
adding new entry “cn=test,ou=Group,dc=gridcenter,dc=hpc”
adding new entry “cn=test01,ou=Group,dc=gridcenter,dc=hpc”
adding new entry “cn=test02,ou=Group,dc=gridcenter,dc=hpc”
adding new entry “cn=esiuser,ou=Group,dc=gridcenter,dc=hpc”

# ldapsearch -x -b ‘dc=gridcenter,dc=hpc’ ‘objectClass=posixGroup’
———————————————————————————————
.
# admin, Group, gridcenter.hpc
dn: cn=admin,ou=Group,dc=gridcenter,dc=hpc
objectClass: posixGroup
objectClass: top
cn: admin
userPassword:: e2NyeXB0fXg=
gidNumber: 1000

# alang, Group, gridcenter.hpc
dn: cn=alang,ou=Group,dc=gridcenter,dc=hpc
objectClass: posixGroup
objectClass: top
cn: alang
userPassword:: e2NyeXB0fXg=
gidNumber: 1001
.
———————————————————————————————-

이제 마지막으로 /etc/passwd 와 /etc/shadow 파일에 있는 계정 정보를 ou:People 에 입력하도록 하자

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

passwd.ldif 파일을 열어 UID 1000 번 이하인 항목은 모두 삭제 한다.

# vi passwd.ldif
———————————————————————————————
.
.
dn: uid=admin,ou=People,dc=gridcenter,dc=hpc
uid: admin
cn: admin
sn: admin
mail:
admin@gridcenter.hpc
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$85s.TkWw$Pxi/GRIBkWwAWWPRifTFM/
shadowLastChange: 14522
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/admin
.
————————————————————————————————

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f passwd.ldif
Enter LDAP Password:
adding new entry “uid=admin,ou=People,dc=gridcenter,dc=hpc”
adding new entry “uid=alang,ou=People,dc=gridcenter,dc=hpc”
adding new entry “uid=user01,ou=People,dc=gridcenter,dc=hpc”
adding new entry “uid=test,ou=People,dc=gridcenter,dc=hpc”
adding new entry “uid=test01,ou=People,dc=gridcenter,dc=hpc”
adding new entry “uid=test02,ou=People,dc=gridcenter,dc=hpc”
adding new entry “uid=esiuser,ou=People,dc=gridcenter,dc=hpc”

# ldapsearch -x -b ‘dc=gridcenter,dc=hpc’ ‘objectClass=person’
————————————————————————————————

.
# esiuser, People, gridcenter.hpc
dn: uid=esiuser,ou=People,dc=gridcenter,dc=hpc
uid: esiuser
cn: esiuser
sn: esiuser
mail:
esiuser@gridcenter.hpc
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQxJGpVRm1IU1pGJG4yeGdHRERhWEhWSVlHZExMUWtCbzA=
shadowLastChange: 14522
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1006
gidNumber: 1007
homeDirectory: /home/esiuser
# search result
search: 2
result: 0 Success

# numResponses: 8
# numEntryes: 7
———————————————————————————————–

4. OpenLdap 클라이언트 기본 설정

LDAP 클라이언트 설정에 필요한 설정 파일은 아래와 같다.

/etc/ldap.conf
/etc/nsswtch.conf
/etc/pam.d/system-auth
/etc/sysconfig/authconfig
/etc/ldap.secret

# vi /etc/ldap.conf
—————————————————————————————————
#uri
ldap://192.168.123.111
host 192.168.123.111
base dc=gridcenter,dc=hpc
ssl no
tls_cacertdir /etc/openldap/cacerts
#pam_password crypt
pam_password md5
nss_initgroups_ignoreusers root,ldap
————————————————————————————————–

LDAP Client 에서 ldap server를 지정하는 방법은 두가지가 있다. 하나는 host 설정을 이용하는 방법과
다른 하나는 uri 설정을 이용하는 방법이다.

host 설정을 이용할 경우 아래와 같은 /etc/ldap.secret 파일에 rootpw 값을 입력해야 한다.
ldap.secret 설정 시 주의해야 할점은 반드시 패스워드 줄 마지막에 <Enter>키로 다음줄까지
커서가 넘어가야 한다.

마지막열에 nss_initgroups_ignoreusers 설정에서 ldap 항목이 포함되지 않을 경우, 다음과 같은 문제가
발생할 수 있다.

LDAP 서버가 LDAP Client 역할도 할 경우 해당 설정이 누락될 경우, /etc/rc.d/init.d/ldap restart 시
slapd.conf 설정 점검 단계에서 계속 멈추는 문제가 발생된다. 당시 로그를 확인하면, 아래와 같다.

runuser: nss_ldap: failed to bind to LDAP server ldap://192.168.123.111: Can’t contact LDAP server

만일 LDAP 서버와 클라이언트가 같은 시스템에 존재할 경우, 해당 시스템의 ldap.conf 설정엔 반드시
nss_initgroups_ignoreusers 설정을 포함하도록 한다.

# vi /etc/ldap.secret
—————————————————————————————————–
{SSHA}qS6wijlC3JBTJOC5L1mbKCjT8Xk91ceN

—————————————————————————————————–

# chmod 600 /etc/ldap.secret

# vi /etc/nsswitch.conf
—————————————————————————————————–
.
passwd:     files
shadow:     files
group:      files
.
위 항목을 ..
passwd:     files ldap
shadow:     files ldap
group:      files ldap

으로 변경 ..
——————————————————————————————————

# vi /etc/pam.d/system-auth
——————————————————————————————————

auth        required      /lib/security/$ISA/pam_env.so
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
auth        sufficient    /lib/security/$ISA/pam_ldap.so use_first_pass   <- 추가
.
.
——————————————————————————————————

# vi /etc/sysconfig/authconfig
——————————————————————————————————
USEMD5=no
USECRACKLIB=yes
USEDB=no
USEHESIOD=no
USELDAP=yes    <- 변경
USENIS=no
USEPASSWDQC=no
USEWINBIND=no
USEKERBEROS=no
USELDAPAUTH=yes  <- 변경
USESHADOW=yes
USESMBAUTH=no
USEWINBINDAUTH=no
USELOCAUTHORIZE=no
USEPAMACCESS=no
PASSWDALGORITHM=md5
——————————————————————————————————-

위 관련 설정 파일을 일괄적으로 적용하는 방법으로 authconfig 명령을 이용하는 방법이 있다.

# authconfig

lqqqqqqqqqqqqqqqqqqqqqu 인증 설정 tqqqqqqqqqqqqqqqqqqqqqk
x                                                       x
x  사용자 정보            인증                          x
x  [*] 캐시(Cache) 정보   [*] MD5 암호 사용             x
x  [ ] Hesiod 사용        [*] 섀도우 암호 사용          x
x  [*] LDAP 사용          [*] LDAP 인증 사용            x
x  [ ] NIS 사용           [ ] 커베로스 사용             x
x  [ ] Winbind 사용       [ ] SMB 인증 사용             x
x                         [ ] Winbind 인증 사용         x
x                         [ ] 로컬 인증으로 충분합니다  x
x                                                       x
x          lqqqqqqk                  lqqqqqqk           x
x          x 취소 x                  x 다음 x           x
x          mqqqqqqj                  mqqqqqqj           x
x                                                       x
x                                                       x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

lqqqqqqqqqqqqqqqqqqqu LDAP 설정 tqqqqqqqqqqqqqqqqqqqk
x                                                   x
x          [ ] TLS 사용                             x
x    서버: 192.168.123.111_________________________ x
x DN 기반: dc=gridcenter,dc=hpc____________________ x
x                                                   x
x         lqqqqqqk                lqqqqqqk          x
x         x 뒤로 x                x 확인 x          x
x         mqqqqqqj                mqqqqqqj          x
x                                                   x
x                                                   x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

이제 LDAP Client 에서 재대로 LDAP 정보를 가져 오는지를 확인한다.

# getent group
————————————————————————-
.
admin:x:1000:
alang:x:1001:
user01:x:1002:
test:x:1003:
test01:x:1004:
test02:x:1005:
esiuser:x:1007:

# getent passwd
————————————————————————–
.
admin:x:1000:1000:admin:/home/admin:/bin/bash
alang:x:1001:1001:alang:/home/alang:/engrid/ensge/bin/lx24-amd64/qtcsh
user01:x:1002:1002:user01:/home/user01:/bin/bash
test:x:1003:1003:test:/home/test:/bin/bash
test01:x:1004:1004:test01:/home/test01:/bin/bash
test02:x:1005:1005:test02:/home/test02:/bin/bash

이제 ldap client 로 ssh, ftp, telnet 등으로 접속을 해보도록 한다. 

참고 : LDAP에 추가된 사용자 계정은 실제 Home directory가 존재하지 않는다.
지금까지의 설명한 환경은 로컬 계정을 LDAP으로 마이그레이션 시키는 환경으로 사용자 홈디렉토리
가 이미 존재한다는것을 가정한 것이다.

사용자 홈디렉토리 환경을 자동으로 지정하는 방법은 아래 고급 설정에서 참고하길 바랍니다.
위 환경에서는 기본적으로 사용자 홈디렉토리가 공유 파일 서버 형태로 존재하는 것을 가정하고 있다.

5. OpenLdap 클라이언트 상세 설정

# vi /etc/ldap.conf
—————————————————————————————–
host 192.168.123.111
base dc=gridcenter,dc=hpc

# 위 두가지 항목 설정만으로 LDAP 접속은 가능하다.

pam_password md5
nss_initgroups_ignoreusers root,ldap
# nss_initgroups_ignoreusers 설정에 정의되는 계정은 로컬로 부터 계정 정보를 가져 온다.

timelimit 120
bind_timelimit 120
idle_timelimit 3600
# LDAP 접속 및 검색 시 시간 제한 설정

nss_base_passwd ou=People,dc=gridcenter,dc=hpc
nss_base_shadow ou=People,dc=gridcenter,dc=hpc
nss_base_group ou=Group,dc=gridcenter,dc=hpc
#nss_base_hosts ou=Hosts,dc=gridcenter,dc=hpc

# nss_base_??? 설정은 해당 dn에서 정보를 가져 올때 보다 빠르고, 자세한 정보를 참조할 수 있게
# 하는 설정이다. passwd, shadow 는 생략해도 되지만 group, hosts 는 설정하는 것을 권장한다.
# nss_base_hosts 는 이후 특정 hosts로의 접속을 제한할때 사용될 것이다.

pam_min_uid 1000
pam_max_uid 2000

# pam_min_uid, pam_max_uid 는 LDAP 으로 부터 인증을 허용할 계정 범위를 정의하는 것이다.

ssl no
tls_cacertdir /etc/openldap/cacerts

# pam_check_host_attr yes
# pam_check_host_attr 설정은 hosts 항목을 LDAP에 추가한 후 해당 hosts 접속하는 사용자를
# 정의할 때 사용되는 설정이다.

pam_member_attribute member
pam_filter objectclass=posixAccount
pam_login_attribute uid

# pam_filter 와 pam_login_attribute 를 이용하여, 사용자 검색 시 사용될 objectclass와
# login 속성을 정의하는 설정이다.

—————————————————————————————–

6. OpenLdap DB 내용 수정

LDAP의 특정 Entry를 수정하고자 할때 ldapmodify 명령을 사용하면 된다.

# ldapsearch -x -b ‘cn=gc002,ou=Hosts,dc=gridcenter,dc=hpc’
———————————————————————————–
# gc002, Hosts, gridcenter.hpc
dn: cn=gc002,ou=Hosts,dc=gridcenter,dc=hpc
objectClass: top
objectClass: ipHost
objectClass: device
objectClass: extensibleObject
ipHostNumber: 192.168.123.112
cn: gc002
member: uid=alang,ou=People,dc=gridcenter,dc=hpc
member: uid=admin,ou=People,dc=gridcenter,dc=hpc

아래 내용에 member로 muchun 을 추가해 보도록 하자.

# vi member_mod.ldif
—————————————————————————
dn: cn=gc002,ou=Hosts,dc=gridcenter,dc=hpc
changetype: modify
add: member
member: uid=muchun,ou=People,dc=gridcenter,dc=hpc
—————————————————————————

# ldapmodify -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f member_mod.ldif
—————————————————————————-
Enter LDAP Password:
modifying entry “cn=gc002,ou=Hosts,dc=gridcenter,dc=hpc”

# ldapsearch -x -b ‘cn=gc002,ou=Hosts,dc=gridcenter,dc=hpc’
—————————————————————————-
.
dn: cn=gc002,ou=Hosts,dc=gridcenter,dc=hpc
objectClass: top
objectClass: ipHost
objectClass: device
objectClass: extensibleObject
ipHostNumber: 192.168.123.112
cn: gc002
member: uid=alang,ou=People,dc=gridcenter,dc=hpc
member: uid=admin,ou=People,dc=gridcenter,dc=hpc
member: uid=muchun,ou=People,dc=gridcenter,dc=hpc
—————————————————————————

7. OpenLdap DB 내용 삭제

# ldapdelete -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W ‘uid=esiuser,ou=People,dc=gridcenter,dc=hpc’
Enter LDAP Password:

# ldapsearch -x -b ‘dc=gridcenter,dc=hpc’ ‘uid’
————————————————————————————————
.
# test01, People, gridcenter.hpc
dn: uid=test01,ou=People,dc=gridcenter,dc=hpc
uid: test01

# test02, People, gridcenter.hpc
dn: uid=test02,ou=People,dc=gridcenter,dc=hpc
uid: test02

-> esiuser 삭제됨..
————————————————————————————————–

ldapdelete 를 통한 삭제는 최상위 DN(dc=gridcenter,dc=hpc) 이하의 항목만 삭제 가능하며, 최상위 subtree까지
모두 삭제 하기 위해서는 /var/lib/ldap 밑에 db 파일을 모두 삭제한 후 새로 LDAP DB를 생성하면 된다.

이것으로 LDAP 계정 통합에 대한 기본 설정이 완료 되었다.
이제 LDAP Client 설정을 진행해 보자

8. 단일 사용자, 그룹 추가

# vi ldap_group.ldif
——————————————————————
dn: cn=lab1,ou=Group,dc=gridcenter,dc=hpc
objectClass: posixGroup
objectClass: top
cn: lab1
userPassword: {crypt}x
gidNumber: 2000
memberUid: admin,alang
—————————————————————–
# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f ldap_group.ldif

# vi ldap_user.ldif
—————————————————————–
ㅎdn: uid=admin,ou=People,dc=gridcenter,dc=hpc
uid: admin
cn: admin
sn: admin
mail:
admin@gridcenter.hpc
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$85s.TkWw$Pxi/GRIBkWwAWWPRifTFM/
shadowLastChange: 14522
shadowMin:-1
shadowMax: 99999
shadowWarning: 7
shadowInactive:-1
shadowExpire:-1
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/admin
——————————————————————–

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f ldap_user.ldif


9. 사용자별 접근 호스트 제한

특정 Hosts에 사용자 계정별로 접근을 제한하는 방법은 세가지가 있다.

첫째 : LDAP 사용자 추가 시 접근 호스트 등록 방법
둘째 : LDAP Hosts 추가 시 접근 사용자 등록 방법
셋째 : LDAP Netgroup 등록 후 NIS 및 PAM 을 이용한 접근 제어 방법

9.1 LDAP 사용자 추가 시 접근 호스트 등록 방법

첫째 방법인  사용자 추가 시 접근 호스트를 지정하는 방법을 알아보자

# vi users.ldif
——————————————————————-
dn: uid=alang,ou=People,dc=gridcenter,dc=hpc
uid: alang
cn: alang
sn: alang
mail:
alang@gridcenter.hpc
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: extensibleObject  -> 추가
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$85s.TkWw$Pxi/GRIBkWwAWWPRifTFM/
shadowLastChange: 14522
shadowMin: -1
shadowMax: 99999
shadowWarning: 7
shadowInactive: -1
shadowExpire: -1
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/alang
host: gc001   -> 추가
host: gc002   -> 추가
———————————————————————-

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f user.ldif

사용자 추가가 완료된 후 /etc/ldap.conf 에 pam_check_host_attr 설정을 추가해야 한다.

# vi /etc/ldap.conf
———————————————————————-
.
pam_check_host_attr yes
.
———————————————————————-

그럼 alang 계정은 gc001, gc002 호스트에만 접속이 가능하다.
만일 모든 서버에 pam_check_host_attr yes설정이 되어 있지 않으면, 해당 서버로는
접속이 가능하게 된다. 또한 모든 서버에 pam_check_host_attr yes설정이 되어있다면,
사용자 추가 시 해당 계정이 접속 가능한 모든 host 정보를 기록해야 한다.
그렇지 않으면 해당 계정은 아무 서버에도 접근하지 못하게 된다.

9.2 LDAP Hosts 추가 시 접근 사용자 등록 방법

다음은 두번째 방법인 Hosts 등록 시 접근 사용자를 등록하는 방법에 대해 알아보자.

먼저 Host 항목을 LDAP 에 추가 한다.

# vi ldap_hosts.ldif
————————————————————————-
dn: ou=Hosts,dc=gridcenter,dc=hpc
ou: Hosts
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: gridcenter.hpc
————————————————————————-

# vi hosts.ldif
————————————————————————
dn: cn=localhost.localdomain,ou=Hosts,dc=gridcenter,dc=hpc
objectClass: top
objectClass: ipHost
objectClass: device
ipHostNumber: 127.0.0.1
cn: localhost.localdomain
cn: localhost

dn: cn=gc001,ou=Hosts,dc=gridcenter,dc=hpc
objectClass: top
objectClass: ipHost
objectClass: device
objectClass: extensibleObject -> 추가
ipHostNumber: 192.168.123.111
cn: gc001
cn: abaquslm
cn: gridcenter.hpc
cn: pamlm
member: uid=admin,ou=People,dc=gridcenter,dc=hpc -> 추가
member: uid=alang,ou=People,dc=gridcenter,dc=hpc -> 추가
—————————————————————————

만일 /etc/hosts 파일을 모두 LDAP 에 저장하고자 할 경우 아래와 같이 마이그레이션 한다.

# ./migrate_hosts.pl /etc/hosts > hosts.ldif

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f ldap_hosts.ldif
# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f hosts.ldif

Hosts 등록 후 /etc/ldap.conf 파일에 아래 설정을 추가 한다.

# vi /etc/ldap.conf
—————————————————————————

pam_groupdn cn=gc002,ou=Hosts,dc=gridcenter,dc=hpc
pam_member_attribute member

—————————————————————————

# vi /etc/nsswitch.conf
—————————————————————————
.
hosts:      files dns ldap
.
—————————————————————————

위 방법은 서버 추가 시 해당 서버의 Hosts 정보를 모두 LDAP에 저장하고, 이때 해당 노드에
접속 가능한 사용자 정보를 입력하는 방법이다. 위와 같은 방법으로 특정노드에 사용자 접속
제한을 할 경우 각 노드별로 ldap.conf 설정에 pam_groupdn 설정을 개별적으로 해 줘야 한다.

즉 gc002 서버에서는 “pam_groupdn cn=gc002,ou=Hosts,dc=gridcenter,dc=hpc” 설정이, 필요하고,
gc003 서버에서는 “pam_groupdn cn=gc003,ou=Hosts,dc=gridcenter,dc=hpc” 설정이 필요하다.

/etc/ldap.conf 에 pam_groupdn 설정이 두개 이상 추가될 경우 접속이 안되는 문제가 발생한다.

위 두가지 방법은 각기 장단점이 있기 때문에 상황에 적절한 방법을 선택해야 한다.
일반적으로 보았을때 두번째 방법은 모든 LDAP 클라이언트 서버에 개별 설정이 포함되어, 설정
관리상 불편함이 보인다. 또한 개별 서버마다 중북되는 사용자 계정 정보를 반복적으로 추가
해야하기 때문에 관리가 복잡해 질수 있는 단점이 있다. 첫번째 방법의 경우 사용자 추가 시
해당 사용자가 접속 가능한 노드를 지정하는 방법임으로 두번째 방법보다는 조금 더 직관적인
관리가 가능해 보인다. 하지만 신규 노드 추가 시 모든 계정에 해당 노드의 정보를 추가해야
하는 불편함이 존재한다.

마지막으로 소개할 내용은 LDAP의 Netgroup을 이용한 방법이다.
이 방법은 LDAP에 Netgroup으로 사용자 그룹, 호스트 그룹을 정의하고, TCP래퍼나 PAM이
access.conf(/etc/security/access.conf)에 해당 그룹을 등록하여 접근을 그룹별로 제한하는
방법이다. 위 방법은 LDAP에서 정의된 그룹을 시스템에서 제공하는 접근 제한 기능에 연동
하는 방법으로 초기 시스템 설정을 완료한 후에는 LDAP의 Netgroup 설정만 변경하여 관리
할수 있는 방법이다. 이 방법을 도입할 경우 많은 사용자와 많은 접근 호스트로 구성된
환경에서는 위 두가지 방법보다 더 유연한 접근 제어 환경을 운영할 수 있을 것이다.

9.3 LDAP Netgroup 등록 후 NIS 및 PAM 을 이용한 접근 제어 방법

먼저 LDAP 에 Netgroup OU 항목을 등록한다.

# vi netgroup.ldif
——————————————————————————-
dn: ou=Netgroup,dc=gridcenter,dc=hpc
ou: Netgroup
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: gridcenter.hpc
——————————————————————————–

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f netgroup.ldif

생성된 ou=Netgroup 에 cn으로 사용자 계정들과 호스트 그룹을 등록한다.
먼저 NIS 의 netgroup 표기법에 대해 간단히 알아 보자.

“netgroup_name (호스트,사용자,도메인) (호스트,사용자,도메인)”

이제 위 표기법에 맞게 NIS의 Netgroup 설정을 한다.

# vi /etc/netgroup
——————————————————————————–
gc_users1 (-,alang,-) (-,admin,-)
gc_hosts1 (gc001,-,-) (gc002,-,-)
——————————————————————————–

해당 netgroup에 정의된 그룹은 TCP-Wrapper, NFS, NIS, PAM 등에 사용될 수 있다.
여기서는 NIS의 Netgroup 사용법에 대해서는 다루진 않는다.

이제 위 netgroup 파일을 LDAP 형태의 LDIF 파일로 마이그레이션 한다.

# ./migrate_netgroup.pl /etc/netgroup > netgroup.ldif
# vi netgroup.ldif
——————————————————————————–
dn: cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc
objectClass: nisNetgroup
objectClass: top
cn: gc_users1
nisNetgroupTriple: (-,admin,-)
nisNetgroupTriple: (-,alang,-)

dn: cn=gc_hosts1,ou=Netgroup,dc=gridcenter,dc=hpc
objectClass: nisNetgroup
objectClass: top
cn: gc_hosts1
nisNetgroupTriple: (gc001,-,-)
nisNetgroupTriple: (gc002,-,-)
——————————————————————————–

ou=Netgroup에 위 cn을 등록한다.

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f netgroup.ldif
Enter LDAP Password:
adding new entry “cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc”
adding new entry “cn=gc_hosts1,ou=Netgroup,dc=gridcenter,dc=hpc”

# ldapsearch -x -b ‘ou=Netgroup,dc=gridcenter,dc=hpc’
——————————————————————————–
.
# gc_users1, Netgroup, gridcenter.hpc
dn: cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc
objectClass: nisNetgroup
objectClass: top
cn: gc_users1
nisNetgroupTriple: (-,admin,-)
nisNetgroupTriple: (-,alang,-)

# gc_hosts1, Netgroup, gridcenter.hpc
dn: cn=gc_hosts1,ou=Netgroup,dc=gridcenter,dc=hpc
objectClass: nisNetgroup
objectClass: top
cn: gc_hosts1
nisNetgroupTriple: (gc001,-,-)
nisNetgroupTriple: (gc002,-,-)

# search result
search: 2
result: 0 Success
———————————————————————————

/etc/ldap.conf 설정에 아래 내용을 추가한다.

# vi /etc/ldap.conf
———————————————————————————
.
nss_base_netgroup ou=Netgroup,dc=gridcenter,dc=hpc

———————————————————————————

이제 LDAP 서버에 정보가 재대로 등록되었는지 확인한다.

# getent netgroup gc_users1
gc_users1             (-, admin, -) (-, alang, -)
# getent netgroup gc_hosts1
gc_hosts1             (gc001, -, -) (gc002, -, -)

이것으로 LDAP 에 netgroup 등록이 완료되었다. 이제 TCP-Wrapper를 이용하여 접근 제어를 해보도록 한다.

# vi /etc/hosts.deny
sshd: ALL
# vi /etc/hosts.allow
sshd: @gc_hosts1

이제 해당 노드에는 gc_hosts1 그룹에 포함된 gc001, gc002 서버에서만 ssh 접근이 가능하다.
TCP-Wrapper는 IP 기반에서 접근 가능한 서버를 지정하는 것으로 사용자 계정에 따른 접근을 제어할 수는
없다. 사용자 계정에 대한 접근을 제어하기 위해서는 PAM 기반의 access.conf 설정을 이용해야 한다.

PAM 기반의 access.conf를 통한 접근 제어방법은 아래와 같다.

# vi /etc/security/access.conf
———————————————————————————
.
+:@gc_users1:ALL
-:ALL:ALL
———————————————————————————

위 설정을 통해 해당 서버에는 admin, alang 계정만이 접속 가능하게 된다.
이제 이 설정이 적용되도록 PAM 설정에 pam_access.so 모듈을 적용하도록 한다.
주요 접속 서비스 대상은 login, sshd, rlogin, gdm 등이다.

# vi /etc/pam.d/sshd
——————————————————————————–
auth       required     pam_stack.so service=system-auth
auth       required     pam_nologin.so
account    required     pam_access.so
.

# vi /ec/pam.d/rshd
——————————————————————————–
auth       required     pam_nologin.so
auth       required     pam_securetty.so
auth       required     pam_env.so
auth       required     pam_rhosts_auth.so
account    required     pam_access.so
.

# vi /etc/pam.d/login
——————————————————————————-
auth       required     pam_securetty.so
auth       required     pam_stack.so service=system-auth
auth       required     pam_nologin.so
account    required     pam_access.so
.

# vi /etc/pam.d/rlogin
——————————————————————————-
auth       required     pam_nologin.so
auth       required     pam_securetty.so
auth       required     pam_env.so
auth       sufficient   pam_rhosts_auth.so
auth       required     pam_stack.so service=system-auth
account    required     pam_access.so
.

위와같이 PAM 설정에 pam_access 모듈을 추가하면, ssh, rsh, telnet, gdm 등을 통한 접속 시 admin, alang
계정만이 접속 가능하게 되는 것이다.

9.4 실무 적용 정책 구현

이제 위 방법을 통해 조금 실무적인 정책을 수립하고, 운영 하는 방법을 알아보도록 하자.
일단 통제 대상 서비스는 rsh, ssh 이다.

접근 제한 정책은 다음과 같다.

– A부서에는 admin, alang 이란 사용자가 존재한다.
– B부서에는 muchun, muchun1 이란 사용자가 존재한다.
– A부서에서 사용 가능한 서버는 gc001, gc002 서버이다.
– B부서에서 사용 가능한 서버는 gc003, gc004 서버이다.

위 정책을 반영한 설정을 구현해 보도록 하자.

먼저 앞서 설정한  netgroup을 A 부서에 대한 설정으로 유지한  상태에서
추가로 B부서에 대한  netgroup cn을 등록한다.

# vi netgroup1.ldif
——————————————————————————
dn: cn=gc_users2,ou=Netgroup,dc=gridcenter,dc=hpc
objectClass: nisNetgroup
objectClass: top
cn: gc_users2
nisNetgroupTriple: (-,muchun,-)
nisNetgroupTriple: (-,muchun1,-)

dn: cn=gc_hosts2,ou=Netgroup,dc=gridcenter,dc=hpc
objectClass: nisNetgroup
objectClass: top
cn: gc_hosts2
nisNetgroupTriple: (gc003,-,-)
nisNetgroupTriple: (gc004,-,-)
—————————————————————————–

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f netgroup1.ldif

그런 후  access.conf 파일을 설정을 아래와 같이 한다.

# vi /etc/security/access.conf
———————————————————————————-
+:root:gc001
+:@gc_users1@@gc_hosts1:ALL
+:@gc_users2@@gc_hosts2:ALL
-:ALL:ALL
———————————————————————————-

통합 대상 서버에 위 pam 관련 설정과 access.conf 설정을 동기화 시킨다.
access.conf 설정의 의미를 차례로 살펴보면..

이제 모든 서버에 root 로 직접 접속하기 위해서는 gc001 서버만 접근을 해야한다. (gc001 -> masternode)
gc001, gc002 서버에는 alang, admin 계정만 접속 가능하다.
gc003, gc004 서버에는 muchun, muchun1 계정만 접속 가능하다.
위 3개 정책에 허용되지 않는 조건의 접속을 모두 차단한다.

두번째 행의 설정을 보면 해당 노드에 상관이 없는 설정이라도, 전체 정책을 반영한 설정을
일괄적으로 설정 한뒤, 전체 노드에 access.conf 파일을 동기화 해 두면, 이후 설정 변경을 할 필요가
없게 된다. 즉 자신에게 상관없는 설정은 무시하고, 자신에게 적용되는 설정은 알아서 반영하게 될것이다.
위 설정이 기능 없다면, 서버별로 access.conf 파일을 개별 설정해야 함으로 관리가 불편해 질수 있다.

마지막으로 B 부서의 muchun 이란 사람이 A부서로 소속이 변경되었다거나, A부서에서 일정기간 파견근무를
해야 한다고 가정할 경우 운영 방법에 대해 알아 보자

일반적으로 LDAP 의 netgroup 에 등록된 gc_users1 의 nisNetgroupTriple 값에 muchun 을 추가하면 될듯 한데,
문제가 발생한다.

# vi netgroup_add.ldif
————————————————————————–
cn: cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc
changetype: modify
add: nisNetgroupTriple
nisNetgroupTriple: (-,muchun,-)
————————————————————————–

# ldapmodify -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f netgroup_add.ldif
Enter LDAP Password:
modifying entry “cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc”
ldap_modify: Inappropriate matching (18)
        additional info: modify/add: nisNetgroupTriple: no equality matching rule

nisNetgroupTriple이 한개만 있을 경우에는 수정이나 삭제가 가능한데, 두개 이상 있을 경우에는 수정이
안되는 문제가 발생한다.

이경우에는 기존 설정을 ldapsearch로 검색한 정보로 수정할 ldif 파일을 생성한 후 해당 cn을 삭제하고,
추가해 줘야 하는 번거로움이 있다.

# ldapsearch -x -b ‘cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc’
——————————————————————————–
.
# gc_users1, Netgroup, gridcenter.hpc
dn: cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc
objectClass: nisNetgroup
objectClass: top
cn: gc_users1
nisNetgroupTriple: (-,admin,-)
nisNetgroupTriple: (-,alang,-)
.
———————————————————————————

# vi gc_usrs1.ldif
———————————————————————————
# gc_users1, Netgroup, gridcenter.hpc
dn: cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc
objectClass: nisNetgroup
objectClass: top
cn: gc_users1
nisNetgroupTriple: (-,admin,-)
nisNetgroupTriple: (-,alang,-)
nisNetgroupTriple: (-,muchun,-)
———————————————————————————

# ldapdelete -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W ‘cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc’
Enter LDAP Password:

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f gc_usrs1.ldif
Enter LDAP Password:
adding new entry “cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc”

# ldapsearch -x -b ‘cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc’
———————————————————————————-
.
# gc_users1, Netgroup, gridcenter.hpc
dn: cn=gc_users1,ou=Netgroup,dc=gridcenter,dc=hpc
objectClass: nisNetgroup
objectClass: top
cn: gc_users1
nisNetgroupTriple: (-,admin,-)
nisNetgroupTriple: (-,alang,-)
nisNetgroupTriple: (-,muchun,-)
.
———————————————————————————-

이제 muchun 사용자도 gc001, gc002 서버에 접속이 가능하게 된다.

10. Change Password Utility를 이용한 사용자 계정 관리

LDAP 상에 계정을 추가하거나 계정 설정을 변경하기 위해서는 매번 ldif 파일을 수정해서
적용해야 하는 번거로움이 존재한다. 별도의 LDAP GUI를 이용해도 되지만, 운영체제 상에서
직접적인 제어가 안되면, 관리자 입장에서 불편함이 많을 것이다.

이것을 해결하기 위해 CPU(Change Password Utility)란 프로그램을 이용할 수 있다.
먼저
http://cpu.sourceforge.net 에서 해당 소스를 다운 받는다.
LDAP 서버에 cpu 프로그램을 설치한다.

# tar xzvf cpu-1.4.3.tar.gz
# cd cpu-1.4.3
# ./configure
# make
# make install

아래 설정을 변경한다.

# vi /usr/local/etc/cpu.conf
———————————————————————–
.
CRACKLIB_DICTIONARY = /usr/lib/cracklib_dict.pwd
.
BIND_DN         = cn=root,dc=gridcenter,dc=hpc
BIND_PASS       = xxxxxx
USER_BASE       = ou=People,dc=gridcenter,dc=hpc
GROUP_BASE      = ou=Group,dc=gridcenter,dc=hpc
.
.
MAX_UIDNUMBER = 2000
MIN_UIDNUMBER = 1000
MAX_GIDNUMBER = 2000
MIN_GIDNUMBER = 1000
.

———————————————————————–

cpu 명령 사용 방법은 cpu 명령 뒤에 user{add,mod,del}, group{add,mod,del} 명령을 이용하여
사용이 가능하다. user{add,mod,del}, group{add,mod,del} 의 사용방법은 운영체제 명령과 거의
동일하다.

이제 cpu를 통해 계정을 생성해 보자

# cpu useradd test002
User test002 successfully added!

# ldapsearch -x -b ‘uid=test002,ou=People,dc=gridcenter,dc=hpc’
———————————————————————–
.
# test002, People, gridcenter.hpc
dn: uid=test002,ou=People,dc=gridcenter,dc=hpc
cn: test002
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
objectClass: top
uid: test002
uidNumber: 1006
gidNumber: 1006
userPassword:: e2NyeXB0fSo=
homeDirectory: /home/test002
loginShell: /bin/bash
shadowLastChange: 11192
shadowMin: -1
shadowMax: 99999
shadowWarning: 7
shadowInactive: -1
shadowExpire: -1
shadowFlag: 134538308
.
————————————————————————

생성된 계정의 패스워드를 등록해 보자

# cpu usermod -p test002
Please enter desired user password:
User test002 successfully modified!

존재하는 계정을 삭제해 보자

# cpu userdel -r test002
# cpu groupdel test002

계정을 삭제할 경우 반드시 groupdel을 통해 group 도 삭제해야 한다.

그룹을 생성해 보자

# cpu groupadd -g 1100 lab1

사용자 생성 시 lab1 그룹에 포함시켜 보자

# cpu useradd -g lab1 test003
# su – test003
$ id
uid=1006(test003) gid=1100(lab1) groups=1100(lab1)

cpu를 이용하여 현재 LDAP 상에 설정된 계정과 그룹 정보를 확인 하는 방법은 아래와 같다.

# cpu cat
————————————————————————-
User Accounts
user01:x:1002:1002::/home/user01:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
test01:x:1004:1004::/home/test01:/bin/bash
test02:x:1005:1005::/home/test02:/bin/bash
admin:x:1000:1000::/home/admin:/bin/bash
alang:x:1001:1001::/home/alang:/engrid/ensge/bin/lx24-amd64/qtcsh
test002:x:1006:1006::/home/test002:/bin/bash

Group Entries
admin:x:1000:
alang:x:1001:
user01:x:1002:
test:x:1003:
test01:x:1004:
test02:x:1005:
test002:x:1006:

11. 사용자 홈디렉토리 자동 생성

LDAP에서만 계정 정보를 추가하면, 접속은 가능하나 계정별 홈디렉토리가 없는 문제가
발생한다. 아래 방법으로 간단히 해결 가능하다.

# vi /etc/pam.d/system-auth
———————————————————————————
.
session     optional      /lib/security/$ISA/pam_mkhomedir.so skel=/etc/skel umask=0022
———————————————————————————

12. Autofs를 이용한 NFS 홈디렉토리 automount

보통 통합 시스템 환경에서는 사용자의 홈디렉토리 공간을 공유 파일 서버(NFS)를 통해 제공하는데,
이때 사용자가 접속 시 자동으로 NFS 서버의 홈디렉토리로 mount 시켜주는 automount 환경이 있으면,
관리가 편리하게 된다. 이때 LDAP 통합 계정 관리 환경에 NFS와  autofs를 연동해서홈디렉토리까지
통합하는 효과를 볼수 있다.

단 사용자가 많은 경우 하나의 NFS 서버에 사용자 별로 nfs session이 맺어 지면, NFS 연결 상에
문제가 발생하는 경우가 있다. 이때는 autofs를 통해 필요시 자동 mount 되는 방식 보다는 서버대 서버로
hard mount 를 거는 방법이 성능상 더 좋을 수 있다.

일단 구현 방법에 대해 알아 보자. 본 환경을 구축하기 위해서는 먼전 NFS 서버와 autofs 환경
구현을 먼저 완료하도록 한다.

우선 NFS Server 설정을 한다.

# vi /etc/exports
———————————————————————————–
/data           *(rw,no_root_squash,async)

# /etc/rc.d/init.d/nfs restart

autofs 설정 (클라이언트 서버에 설정함.)

# vi /etc/auto.master
———————————————————————————
/data   /etc/auto.home  –timeout=5

# vi /etc/auto.home
———————————————————————————
*       -rw,soft,intr   gc001:/data/&

# /etc/rc.d/init.d/autofs restart

사용자 계정 생성

# cpu useradd -d /data/test03 test03
# cpu usermod -p test03

automount 환경에서는 사용자가 생성될때 사용자 홈디렉토리도 반드시 만들어 주어야 한다.
automount 설정에서 mount 연결 대상 디렉토리는 사전에 존재하고 있어야 하는 제약이 있다.

autofs 설정이 되어 있는 클라이언트 서버로 접속하면 자동으로 홈디렉토리가 mount 되는
것을 확인 할 수 있다.

# ssh test03@gc002
————————————————————————————
test03@gc002’s password:
Last login: Wed Oct  7 15:26:02 2009 from gc001
$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              5036284    734820   4045632  16% /
gc001:/data/test03     5036288    580064   4200384  13% /data/test03

이제 본격적으로 LDAP 에 autofs 관련 정보를 등록하도록 하자.

우선 /etc/openldap/slapd.conf 설정에 autofs 스키마를 추가 한다.

# vi /etc/openldap/slapd.conf
———————————————————————————–
.
include         /etc/openldap/schema/redhat/autofs.schema
———————————————————————————–

# grep automount /etc/nsswitch.conf
———————————————————————————–
automount:  files ldap

# /etc/rc.d/init.d/ldap restart

그런 후 automount 관련 정보를 LDAP 에 추가한다.

# vi auto.master.ldif
————————————————————————————
dn: nisMapName=auto.master,dc=gridcenter,dc=hpc
objectClass: top
objectClass: nisMap
nisMapName: auto.master

dn: cn=/data,nisMapName=auto.master,dc=gridcenter,dc=hpc
objectClass: nisObject
cn: /data
nisMapEntry: /etc/auto.home –timeout=5
nisMapName: auto.master
————————————————————————————

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f auto.master.ldif

# vi auto.home.ldif
————————————————————————————
dn: nisMapName=auto.home,dc=gridcenter,dc=hpc
objectClass: top
objectClass: nisMap
nisMapName: auto.home

dn: cn=*,nisMapName=auto.home,dc=gridcenter,dc=hpc
objectClass: nisObject
cn: *
nisMapEntry: -rw,soft,intr gc001:/data/&
nisMapName: auto.home
————————————————————————————-

# ldapadd -x -D ‘cn=root,dc=gridcenter,dc=hpc’ -W -f auto.home.ldif

클라이언트 서버에 auto.master 설정을 아래와 같이 한다.

# vi /etc/auto.master
————————————————————————————-
/data   ldap:gc001:nisMapName=auto.home,dc=gridcenter,dc=hpc     –timeout=5

# /etc/rc.d/init.d/autofs restart

이제 test03 계정으로 클라이언트 서버로 접속한다.
그럼 자동으로 /data/test03 홈디렉토리로 mount 되어 진다.

13. OpenLdap 데이터 백업 및 복구

백업 방법은 아래와 같다.

# slapcat -b ‘dc=gridcenter,dc=hpc’ -l gridcenter.hpc.ldif

복구 방법은 아래와 같다.

# slapadd -l gridcenter.hpc.ldif

백업 파일로 복구가 정상적으로 되는지 확인 해 보자
우선 모든 LDAP DB 파일을 삭제 한다.

# /etc/rc.d/init.d/ldap stop
# rm -rf /var/lib/ldap/*
# /etc/rc.d/init.d/ldap start
# ldapsearch -x -b ‘dc=gridcenter,dc=hpc’
——————————————————————————
# extended LDIF
#
# LDAPv3
# base <dc=gridcenter,dc=hpc> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1
. 아주 깨끗이 지워졌음
——————————————————————————-

# /etc/rc.d/init.d/ldap stop

복구 함.

# slapadd -l gridcenter.hpc.ldif
# /etc/rc.d/init.d/ldap start
# ldapsearch -x -b ‘dc=gridcenter,dc=hpc’
——————————————————————————-
.
.
# auto.home, gridcenter.hpc
dn: nisMapName=auto.home,dc=gridcenter,dc=hpc
objectClass: top
objectClass: nisMap
nisMapName: auto.home

# *, auto.home, gridcenter.hpc
dn: cn=*,nisMapName=auto.home,dc=gridcenter,dc=hpc
objectClass: nisObject
cn: *
nisMapEntry: -rw,soft,intr gc001:/data/&
nisMapName: auto.home

# search result
search: 2
result: 0 Success
——————————————————————————

14. Replication을 이용한 LDAP 이중화

OpenLDAP 의 master server의 내용을 자동으로 slave 서버로 동기화 시키는 기술이다.
계정서버는 통합 시스템의 접근을 제어하는 서버로 장애 발생 시 모든 서버의 접근에 문제가 발생할 수
있다. 그러므로 반드시 이중화 구성이 필요하다. 이 기능을 통해 Master serve 장애 발생 시 자동으로
slave sever 에서 계정 정보를 받아 올수 있게 된다.

구현 방법은 아래와 같다.

* master 서버의 slapd 데몬 down

# /etc/rc.d/init.d/ldap stop

* master 서버의 slapd.conf 수정

# vi /etc/openldap/slapd.conf
——————————————————————————
.
.
replogfile /var/lib/ldap/openldap-master-replog
replica host=”gc002:389″
        suffix=”dc=gridcenter,dc=hpc”
        binddn=”cn=root,dc=gridcenter,dc=hpc”
        credentials=root///
        bindmethod=simple
        tls=yes
——————————————————————————
replogfile 에 지정된 파일에는 master 서버에서 변화된 정보를 기록하는 파일이다.
이곳에 기록된 로그 파일은 slurpd 데몬이 읽어서 slave 서버로 내용을 동기화 시키게 된다.

replica host 는 slave 서버의 주소와 서비스 포트를 지정하는 곳이다.

* master 서버의 LDAP DB 백업

# slapcat -b ‘dc=gridcenter,dc=hpc’ -l gridcenter.ldif

백업된 gridcenter.ldif 파일을 slave 서버로 복사한다.

* slaver 서버의 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
allow bind_v2

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args
loglevel        128
database        bdb
suffix          “dc=gridcenter,dc=hpc”
rootdn          “cn=root,dc=gridcenter,dc=hpc”
rootpw                  {SSHA}qS6wijlC3JBTJOC5L1mbKCjT8Xk91ceN
directory       /var/lib/ldap
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub
cachesize 2000
access to dn.subtree=”dc=gridcenter,dc=hpc” attrs=userPassword
       by self write
       by anonymous read
       by * auth
access to dn.subtree=”ou=People,dc=gridcenter,dc=hpc”
        by * read
access to dn.subtree=”ou=Group,dc=gridcenter,dc=hpc”
        by * read
access to dn.subtree=”ou=Hosts,dc=gridcenter,dc=hpc”
        by * read
access to dn.subtree=”ou=Netgroup,dc=gridcenter,dc=hpc”
        by * read
access to *
       by * read
       by dn=”cn=root,dc=gridcenter,dc=hpc” write
       by self write
       by users read
       by anonymous auth
       by * none
# 위 내용은 master와 동일

updatedn        “cn=root,dc=gridcenter,dc=hpc”
updateref      
ldap://gc001

# 위 두행 추가
————————————————————————————–

* slvae 서버에 master LDAP 백업 파일 복구

# slapadd -l gridcenter.ldif
# /etc/rc.d/init.d/ldap start

* master 서버의 slapd 데몬 시작

# /etc/rc.d/init.d/ldap start

간혹 ldap 백업 및 복구 과정에서 /var/lib/ldap/ 밑에 있는 DB 파일의 소유권이 root 로 변경되는
경우가 있다. 이때 slapd 데몬을 재 시작하면 아래와 같은 메세지가 나타난다.

/var/lib/ldap/ou.bdb is not owned by “ldap”                [WARNING]
/var/lib/ldap/uid.bdb is not owned by “ldap”               [WARNING]
/var/lib/ldap/cn.bdb is not owned by “ldap”                [WARNING]
/var/lib/ldap/sn.bdb is not owned by “ldap”                [WARNING]
/var/lib/ldap/mail.bdb is not owned by “ldap”              [WARNING]
/var/lib/ldap/objectClass.bdb is not owned by “ldap”       [WARNING]
/var/lib/ldap/nisMapEntry.bdb is not owned by “ldap”       [WARNING]
/var/lib/ldap/nisMapName.bdb is not owned by “ldap”        [WARNING]
/var/lib/ldap/uidNumber.bdb is not owned by “ldap”         [WARNING]
/var/lib/ldap/loginShell.bdb is not owned by “ldap”        [WARNING]
/var/lib/ldap/gidNumber.bdb is not owned by “ldap”         [WARNING]

이때는 /var/lib/ldap/* 의 소유권을 모두 ldap 으로 변경하고 데몬을 재시작 한다.

* ldap.conf 파일 수정

# vi /etc/ldap.conf
———————————————————————————–
host 192.168.123.111 192.168.123.112

수정된 ldap.conf 파일을 모든 통합 대상 서버에 동기화 한다.
이것으로 모든 설정이 완료되었다. 이제 정상적인 replication 이 일어나는지를 확인해 보자

* slave 서버에서 ldapsearch 로 LDAP DB 내용 검색

# ldapsearch -h gc001 -x -b ‘ou=People,dc=gridcenter,dc=hpc’ <- master 서버 내용
# ldapsearch -h gc002 -x -b ‘ou=People,dc=gridcenter,dc=hpc’ <- slaver 서버 내용

* master 서버에 새로운  계정을 새로 추가 한다.

# cpu useradd test06
User test06 successfully added!

* 동기화 확인
# ldapsearch -h gc001 -x -b ‘uid=test06,ou=People,dc=gridcenter,dc=hpc’
———————————————————————————-
cn: test06
.
homeDirectory: /home/test06
.
———————————————————————————-
# ldapsearch -h gc002 -x -b ‘uid=test06,ou=People,dc=gridcenter,dc=hpc’
———————————————————————————-
cn: test06
.
homeDirectory: /home/test06
.
———————————————————————————-

* master 에서 DB 내용 수정

# cpu usermod -d /data/test06 test06

* 동기화 확인
# ldapsearch -h gc001 -x -b ‘uid=test06,ou=People,dc=gridcenter,dc=hpc’
———————————————————————————-
cn: test06
.
homeDirectory: /data/test06
.
———————————————————————————-
# ldapsearch -h gc002 -x -b ‘uid=test06,ou=People,dc=gridcenter,dc=hpc’
———————————————————————————-
cn: test06
.
homeDirectory: /data/test06
.
———————————————————————————-

* master 서버 중지
[root@gc001 ~]# /etc/rc.d/init.d/ldap stop
Stopping slapd:                                            [  OK  ]
Stopping slurpd:                                           [  OK  ]

test06 계정으로 ssh 접속 시도 ..

# ssh test06@gc003
test06@gc003’s password:
[test06@gc003 ~]$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              5036284    732688   4047764  16% /
gc001:/data/test06     5036288    582848   4197600  13% /data/test06

* slave 서버에서 정보 수정

??? 마스터가 죽은 상태에서 통합 서버에 접속 후 패스워드 변경
마스터가 살아난 상태에서 적용되는지 확인?

-> 안된다. LDAP의 구조는 원래 single master 형태로 slave 서버는 master 서버의 정보를
동기화만 시키고, read 서비스만 제공하는 구조로 되어 있는듯 함.
updateref 를 통해 slave에 변경된 정보를 master로 전달하는 기능이 있어 보이는데, 의미가
없어보임. 이 조건에 성립되기 위해서는 master와 slave가 모두 살아 있어야 하는데, 이런 경우라면
master에서 정보를 받기 때문에 별 다른 의미는 없어보임.

15. GUI를 통한 OpenLdap 관리

http://ldapadmin.sourceforge.net 에서 다운 받는다.

16. OpenLDAP 과 Samba 연동

대표적으로 구현하는 방법은 두가지가 있다.
하나는 PAM 인증을 이용하여 LDAP에 연동하는 방법이다. 기존의 samba passwd 와 운영체제의 passwd
를 연동하는 방법과 유사하다.

다른 하나는 smbldap-tools 을 이용하는 방법이 있다.

# rpm -Uvh smbldap-tools-0.9.5-1.noarch
perl(Crypt::SmbHash) is needed by smbldap-tools-0.9.5-1.noarch
perl(Unicode::MapUTF8) is needed by smbldap-tools-0.9.5-1.noarch

CPAN 으로 perl module 설치

# cd /usr/include
# h2ph *.h sys/*.h asm/*.h
# perl -MCPAN -e shell

cpan> install Crypt::SmbHash
cpan> install Unicode::MapUTF8

# rpm -Uvh smbldap-tools-0.9.5-1.noarch

만일 smbpasswd 를 그대로 이용할 경우 별도 연동은 필요없다. 대신 LDAP 계정을 추가할 때 smbpasswd -a 를 통해
samba 계정도 추가 되는 자동 스크립터를 만들어 관리하면 될듯 하다.

17. TLS 인증을 통한 LDAP 관리

서진우

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

You may also like...

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