<< 노땅 개발자가 가야할 길 | Home | API - 사용 편이성과 오용 어려움 >>

LDAP설치 및 설정부터 jenkins, gitlab, nexus 연동까지

Google이 3rd Party용 무료 이메일을 지원하지 않은 이유로 자체 LDAP(Open LDAP)기반의 메일 서버를 운영하는 스타트업이 있을 것입니다. 저희도 내부 시스템 정비 차원에서 LDAP을 도입했습니다.

LDAP은 앞서 설명한 메일(Postfix + Dovecot) 발송/수신 서버, gitlab(소스 저장소), jenkins(빌드), nexus 등의 시스템과 인증부분을 연동해서 사용하고 있습니다.
이후부터는 LDAP을 사용하기 위한 설치 및 설정 방법을 기술합니다.

OpenLDAP 설치

- 패키지를 설치
$ yum install openldap-servers openldap-clients

$ cp /usr/share/openldap-servers/DB_CONFIG.example 
  /var/lib/ldap/DB_CONFIG
$ cp /usr/share/openldap-servers/slapd.conf.obsolete 
  /etc/openldap/slapd.conf
$ chown -R ldap:ldap /var/lib/ldap/
$ vi /etc/openldap/slapd.conf
suffix      "dc=wiseeco,dc=local"
rootdn      "cn=manager,dc=wiseeco,dc=local"
rootpw      {SSHA}XzUYgQ32mglF6HzSTnqA1Dc4Qy/Q9oFz
access to dn.subtree="dc=mail,dc=wiseeco,dc=local" attrs=userPassword
    by self write
    by anonymous auth
    by * none
access to *
    by self write
    by * read

$ chmod 600 /var/lib/ldap/DB_CONFIG
$ chown -Rv ldap:ldap /var/lib/ldap /etc/openldap/slapd.d 
$ chkconfig slapd on
$ service slapd start
$ slaptest -f slapd.conf -F /etc/openldap/slapd.d/

- slapd.conf 의 rootpw에는 암호화된 문자열 생성 방법
$ slappasswd -h {SSHA} -s password
{SSHA}XzUYgQ32mglF6HzSTnqA1Dc4Qy/Q9oFz

- index의 재구성
$ service slapd stop
$ slapindex -v -b dc=wiseeco,dc=local -f slapd.conf
$ service slapd start
$ ldapsearch -x -b 'dc=mail,dc=wiseeco,dc=local'

스키마 정의(mail.schema)

$ cd /etc/openldap/schema
$ vi mail.schema
attributetype (1.1.2.1.1.1 NAME 'mailForward'
    DESC 'forward address'
    EQUALITY caseExactIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)

attributetype (1.1.2.1.1.2 NAME 'mailAlias'
    DESC 'alias address'
    EQUALITY caseExactIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)

attributetype (1.1.2.1.1.3 NAME 'accountActive'
    DESC 'active or not active'
    EQUALITY booleanMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE)

attributetype (1.1.2.1.1.4 NAME 'domainName'
    DESC 'domain name'
    EQUALITY caseIgnoreIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE)

attributetype (1.1.2.1.1.5 NAME 'transport'
    DESC 'transport'
    EQUALITY caseIgnoreIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)

attributetype (1.1.2.1.1.6 NAME 'mailQuota'
    DESC 'Mail Home Directory Max byte'
    EQUALITY integerMatch    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE)

attributetype (1.1.2.1.1.7 NAME 'mailDrop'
    DESC 'drop address'
    EQUALITY caseExactIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)

objectClass (1.1.2.2.1.1 NAME 'mailUser'
    DESC 'mail user Object'
    SUP inetOrgPerson
    MUST ( transport $ homeDirectory $ accountActive 
     $ domainName $ userPassword $ mailQuota )
    MAY  ( mailForward $ mailAlias ))

objectClass (1.1.2.2.1.2 NAME 'mailGroup'
   DESC 'ML Group Account Object'
   SUP inetOrgPerson
   MUST ( accountActive $ domainName $ mailDrop ))

mail.schema 설명

- 스키마의 데이터 속성(attributetype)
속성 이름설명참조
transportSMTP의 transport 설정Postfix
domainName도메인 이름Postfix
accountActive계정의 활성화/비활성화를 TRUE/FALSE로 지정Dovecot
mailQuota사서함 용량Dovecot
mailForward포워딩 메일 주소Postfix
mailAlias이메일 별칭Postfix

- 객체 클래스
objectClass 이름설명
mailUser사용자 이메일 계정

- OpenLDAP 설정
OpenLDAP의 slapd.conf에서 mail.schema의 include함
$ vi slapd.conf
include  /etc/openldap/schema/mail.schema

데이터 준비

- TOP 트리 데이터 작성(top.ldif)
dn: dc=wiseeco,dc=local
dc: wiseeco
objectClass: dcObject
objectClass: organization
o: wiseeco

dn: dc=mail,dc=wiseeco,dc=local
objectClass: dcObject
objectClass: organization
dc: mail
o: mail

- 도메인의 데이터 작성(domain.ldif)
dn: ou=wiseeco.com,dc=mail,dc=wiseeco,dc=local
ou: wiseeco.com
objectClass: organizationalUnit

dn: ou=mimul.com,dc=mail,dc=wiseeco,dc=local
ou: mimul.com
objectClass: organizationalUnit

- 사용자 데이터 작성(user.ldif)
속성 이름설명값 예
cn전체 이름홍길동
sn
uid사용자 IDmimul
userPassword패스워드{SSHA}kb5KrdmDd0ZREoIIfz6BAe94pJvBuQeG
homeDirectory사용자 홈 디렉토리/home/mailbox/wiseeco.com/mimul
mail사용자의 이메일 주소mimul@wiseeco.com
mailForword이메일 포워딩 주소hahojin@gmail.com
mailAlias이메일 별칭webmaster@wiseeco.com
accountActive계정의 활성화/비활성화를 TRUE/FALSE로 지정TRUE
domainName소속 도메인 이름(dn의 dc값)wiseeco.com
mailQuota메일 Quota 용량 설정(M단위)100
transporttransport 기본적으로 dovecot 고정dovecot
mobile핸드폰 번호010-222-3333

$ vi user.ldif
dn: uid=mimul@wiseeco.com,ou=wiseeco.com,dc=mail,dc=wiseeco,dc=local
objectClass: mailUser
cn:하호진
sn:하
uid: mimul
userPassword: {SSHA}GO+oB9xnedb2CiOB741ZlNO6Rm/VCs+k
homeDirectory: /home/mailbox/wiseeco.com/mimul
mail: mimul@wiseeco.com
mailAlias: webmaster@wiseeco.com
accountActive: TRUE
domainName: wiseeco.com
mailQuota: 200
transport: dovecot
mobile: 010-222-3333

dn: uid=sjune@wiseeco.com,ou=wiseeco.com,dc=mail,dc=wiseeco,dc=local
objectClass: mailUser
cn:김선준
sn:김
uid: sjune
userPassword: {SSHA}zpZayqcyHJCzEUCtzbDhuSwQPOeDpbra
homeDirectory: /home/mailbox/wiseeco.com/sjune
mail: sjune@wiseeco.com
accountActive: TRUE
domainName: wiseeco.com
mailQuota: 100
transport: dovecot
mobile: 010-222-3333

dn: uid=pepsi@mimul.com,ou=mimul.com,dc=mail,dc=wiseeco,dc=local
objectClass: mailUser
cn:미물
sn:하
uid: pepsi
userPassword: {SSHA}4aHUI5Q3vCyKTOM8xxYya7/XFMVNJSv4
homeDirectory: /home/mailbox/mimul.com/pepsi
mail: pepsi@mimul.com
accountActive: TRUE
domainName: mimul.com
mailQuota: 100
transport: dovecot
mobile: 010-222-3333

작성 데이터 등록

데이터 등록은 ldapadd 커맨드를 통해 진행한다.
$ ldapadd -x -h localhost -D "cn=manager,dc=wiseeco,dc=local" 
 -w password -f top.ldif
adding new entry "dc=wiseeco,dc=local "

adding new entry "dc=mail,dc=wiseeco,dc=local"

$ ldapadd -x -h localhost -D "cn=Manager,dc=wiseeco,dc=local" 
 -w password -f domain.ldif
adding new entry "ou=wiseeco.com,dc=mail,dc=wiseeco,dc=local"

adding new entry "ou=mimul.com,dc=mail,dc=wiseeco,dc=local"

$ ldapadd -x -h localhost -D "cn=Manager,dc=wiseeco,dc=local" 
 -w password -f user.ldif
adding new entry "uid=mimul,ou=wiseeco.com,dc=mail,dc=wiseeco,dc=local"

adding new entry "uid=sjune,ou=wiseeco.com,dc=mail,dc=wiseeco,dc=local"

adding new entry "uid=pepsi,ou=mimul.com,dc=mail,dc=wiseeco,dc=local"

등록 데이터 검색

- ldap 커맨드에 의핸 사용자 조회
$ ldapsearch -p 389 -h 127.0.0.1 -D "cn=manager,dc=wiseeco,dc=local" 
  -w password -b "ou=mimul.com,dc=mail,dc=wiseeco,dc=local" -x "uid=pepsi"
# extended LDIF
#
# LDAPv3
# base  with scope subtree
# filter: uid=pepsi
# requesting: ALL
#

# pepsi, mimul.com, mail.wiseeco.local
dn: uid=pepsi,ou=mimul.com,dc=mail,dc=wiseeco,dc=local
objectClass: mailUser
cn:: 7ZWY7Zi47KeE
sn:: 7ZWY
userPassword:: e1NTSEF9NGFIVUk1UTN2Q3lLVE9NOHh4WXlhNy9YRk1WTkpTdjQ=
homeDirectory: /home/mailbox/mimul.com/pepsi
mail: pepsi@mimul.com
accountActive: TRUE
domainName: mimul.com
mailQuota: 100
transport: dovecot
uid: pepsi
mobile: 010-222-3333

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

- Apache LDAP Studio 툴로 조회
LDAP툴은 Apache Directory Studio™제일 좋아 보이니 다운받아서 사용하세요. 맥용, 윈도우용 다 있습니다.



외부 시스템 연동

- gitlab LDAP 연동(gitlab.yml)
  ldap:
    enabled: true
    host: 'localhost'
    base: 'ou=wiseeco.com,dc=mail,dc=wiseeco,dc=local'
    port: 389
    uid: 'uid'
    method: 'plain' # "ssl" or "plain"
    bind_dn: 'cn=manager,dc=wiseeco,dc=local'
    password: 'password'
    allow_username_or_email_login: true

- jenkins LDAP 연동
Configure Global Security>Access Control>Security Realm>LDAP 선택하고 설정 정보는 아래와 같다.
서버 : ldap://localhost
root DN : dc=wiseeco,dc=local
User search filter : uid={0}
Manager DN : cn=manager,dc=wiseeco,dc=local
Manager Password : password
Display Name LDAP attribute : cn
Email Address LDAP attribute : mail

- nexus LDAP 연동


Tags :


Re: LDAP설치 및 설정부터 jenkins, gitlab, nexus 연동까지

 정말 저한테 도움이 많이 된 글입니다. 스타트업에 종사하고 있고 개발 환경 구축하는데 있어서 인증 통합이 제일 어려웠는데, 스키마며 잘 참고해서 만들수가 있었습니다. 감사해요.


Add a comment Send a TrackBack