코알못

5분 안에 구축하는 LDAP 본문

ETC

5분 안에 구축하는 LDAP

코린이s 2022. 4. 23. 19:17
728x90



Microsoft 에서 개발한 AD(Active Directory)는 디렉토리 서비스 공급자이며 윈도우OS 에서 디렉터리 안에 내용을 쉽게 검색 할 수 있도록 한다.

이런 공급자들이 쉽게 통신을 하기 위한 프로토콜이 LDAP(Lightweight Directory Access Protocol) 이다.

그렇다고 하면 AD 디렉터리에 원하는 데이터를 넣고 찾는 다는 점에서 데이터베이스를 사용하면 되는데 왜 AD를 사용할까? 라는 의문을 가질 수 있다.

사실상 아무 데이터나 넣고 찾는다고 하면 차이가 없을 지라도 AD는 '조직의 사용자나 주소록 정보를 관리' 에 특화 되어 만들어져 해당 데이터를 관리 하고자 한다면 AD 사용에 이점이 있다.

LDAP 은 비동기 프로토콜 이며 자체적으로 디렉토리 서비스를 제공 할 수 있으나 쓰기 작업이 많이 이뤄지면 AD 가 더 적합하며 윈도우 서버라면 AD, 그외 서버라면 LDAP 을 이용한다.

오픈 소스인 openldap 을 설치하여 실습을 진행해본다!

$ brew install openldap

우선 설정 파일을 생성해야 하며 샘플을 이용하여 복사하여 생성한다.

$ sudo cp /etc/openldap/slapd.conf.default /etc/openldap/slapd.conf

root 비밀번호를 수정해야 하며 string 으로 사용해도 되나 암호화된 값을 이용하는것이 더 안전하기에 slappasswd 명령어로 원하는 비밀번호를 입력하고 단방향 알고리즘 sha로 암호화한 패스워드를 가져온다.

$ slappasswd
New password:
Re-enter new password:
{SSHA}SV903h8h9mx4YGl8umVAjgefgNPMzyXz

slapd.conf 설정 파일을 열어 몇가지 수정한다.

$ sudo vi /etc/openldap/slapd.conf

용어 부터 우선 이해해야 한다.

  • DN (Distinguished Name) : 고유 명칭 (도메인)
  • CN (Canonical Name) : 정식 이름 (사용자 이름)
  • OU (Organizational Unit) : 조직 단위 (부서 이름)

용어를 간단하게 익혔다면 아래 설정값별 의미 하는 정보를 확인한다.

  • database : 데이터베이스 종류 (bdb)
  • suffix : 최상위 dc
  • rootdn : 관리용 DN, 사용자 추가 삭제 등 사용되는 DN
  • rootpw : DN 인증을 위한 패스워드
  • directory : 데이터베이스 위치

//기존

database        bdb
suffix          "dc=my-domain,dc=com"
rootdn          "cn=Manager,dc=my-domain,dc=com"
rootpw          secret
directory	/private/var/db/openldap/openldap-data

기본 패스워드인 'secret' 을 새 암호화된 패스워드로 수정하고, dc 를 원하는 명칭으로 수정 한다.

데이터베이스 데이터의 경우에는 새 디렉토리 'corin.com' 을 만들어 저장 하도록 한다.

database        bdb
suffix          "dc=corin,dc=com"
rootdn          "cn=Manager,dc=corin,dc=com"
rootpw          {SSHA}SV903h8h9mx4YGl8umVAjgefgNPMzyXz
directory	/private/var/db/openldap/corin.com

다음 ldap.conf 를 열어 몇가지 수정한다.

// 기존

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666

// 변경

BASE    dc=corin,dc=com
BINDDN  cn=Manager,dc=corin,dc=com
URI     ldap://localhost

시작 해보자!

정상적으로 slapd starting 이라는 문구와 함께 기동 되었다.

$ sudo /usr/libexec/slapd -h ldap://localhost -d 50
623ff757 @(#) $OpenLDAP: slapd 2.4.28 (Jun  5 2020 21:19:19) $
	root@osx400.sd.apple.com:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Binaries/OpenLDAP/install/TempContent/Objects/servers/slapd
623ff757 daemon: SLAP_SOCK_INIT: dtblsize=256
623ff758 main: Enabling TLS failed; continuing with TLS disabled.
623ff758 bdb_db_open: warning - no DB_CONFIG file found in directory /private/var/db/openldap/openldap-data: (2).
Expect poor performance for suffix "dc=corin,dc=com".
623ff758 bdb_monitor_db_open: monitoring disabled; configure monitor database to enable
623ff758 slapd starting
623ff758 daemon: posting com.apple.slapd.startup notification

비어있던 corin.com 디렉토리에 DB 관련 파일이 생성되었다.

$ cd /private/var/db/openldap/corin.com
(base) hongyoolee@hateyou corin.com % ls
__db.001	__db.004	alock		log.0000000001
__db.002	__db.005	dn2id.bdb
__db.003	__db.006	id2entry.bdb
$ ls -all
total 23384
drwxr-xr-x  12 root  wheel       384  3 27 15:10 .
drwxr-xr-x   5 root  wheel       160  3 27 15:07 ..
-rw-------   1 root  wheel     24576  3 27 15:10 __db.001
-rw-------   1 root  wheel    245760  3 27 15:10 __db.002
-rw-------   1 root  wheel    270336  3 27 15:10 __db.003
-rw-------   1 root  wheel     98304  3 27 15:10 __db.004
-rw-------   1 root  wheel    761856  3 27 15:10 __db.005
-rw-------   1 root  wheel     40960  3 27 15:10 __db.006
-rw-r--r--   1 root  wheel      2048  3 27 15:10 alock
-rw-------   1 root  wheel      8192  3 27 15:10 dn2id.bdb
-rw-------   1 root  wheel     32768  3 27 15:10 id2entry.bdb
-rw-------   1 root  wheel  10485760  3 27 15:10 log.0000000001

 

ldap 은 정상적으로 띄웠으면 최상위 DN 을 생성해야 한다.

ldif 파일에 끝 부분에 공백, 탭이 있으면 syntex 오류 발생하니 주의한다.

// create-suffix-dn.ldif
dn: dc=corin,dc=com
ObjectClass: dcObject
ObjectClass: organization
dc: corin
o: Example
// create-suffix-dn.sh
sudo ldapadd -x -D "cn=Manager,dc=corin,dc=com" -W -f create-suffix-dn.ldif

위 만든 스크립트를 실행시켜 생성한다.

$ ./create-suffix-dn.sh

확인 하면 생성한 정보가 나온다.

$ ldapsearch -x -b dc=corin,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=corin,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# corin.com
dn: dc=corin,dc=com
objectClass: dcObject
objectClass: organization
dc: corin
o: Example

# group-01, corin.com
dn: ou=group-01,dc=corin,dc=com
ou: group-01
objectClass: organizationalUnit
objectClass: top

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

이제 부서 생성 요청이나 계정 생성 요청시 어떻게 처리할지 알아본다!

console 창에서 계정을 관리하는것은 다소 운영하기 어렵기에 편리하게 툴을 사용하도록 하며 여러 툴중에 저자는 apache-directory-studio를 설치하도록 한다.

$ brew install apache-directory-studio
############ 100.0%
==> Installing Cask apache-directory-studio
==> Moving App 'ApacheDirectoryStudio.app' to '/Applications
🍺  apache-directory-studio was successfully installed!

설치가 완료 되어 application 디렉토리로 move 했다는 안내문구가 나오며 이동하여 확인 하도록 한다.

이제 그룹 group-01, group-02 를 추가한다.

 

top class 가 자동으로 추가됐다.

group-02도 위와 같이 추가한다.

이제 그룹에 유저를 넣는다.

- group-01 : hongyoolee, kimsasa

- group-02 : kimhaha

organizationalPerson 추가시 필요한 class 도 자동으로 추가된다.

mail 은 기본적으로 제공하는 속성이 아니기에 아래와 같은 오류 발생한다.

현재 꼭 필요한 속성은 아니므로 추후에 커스텀 속성 만드는 방법을 알아보도록 하고(하단 참고 부분 1번에 정리 완료) 우선 mail 속성을 제외 하고 생성한다.

모두 만들었으면 아래와 같이 볼 수 있다.

이제 검색 기능을 알아보도록한다.

툴의 search 부분에 오른쪽 클릭하여 생성한다.

적당한 검색 명칭과, 찾을 DN, 필터를 선택하고 생성한다.

저자의 경우 gorup-01 의 모든 데이터를 가져온다.

위 검색 조건대로 정상적으로 나온것을 볼 수 있다.

전체 그룹에서 kim 성을 가진 사용자를 찾는다고 하면 아래와 같이 필터를 만들 수 있다.

filter의 경우에는 문법을 알아야 사용가능하니 구글링하여 원하는 필터를 넣는다.

아래와 같이 정상적으로 검색되는것을 볼 수있다.

다음 시간에는 다른 서비스에서 ldap 을 연동하는 것을 실습해본다!

끝!

# 참고 사항

1. mail 옵션을 추가하고 싶다면 아래 표기한 클래스 추가

ldap_modify: Object class violation (65)
additional info: attribute 'mail' not allowed

1. apache directory studio 가이드 : https://nightlies.apache.org/directory/studio/2.0.0.v20210717-M17/userguide/ldap_browser/gettingstarted_create_connection.html

728x90

'ETC' 카테고리의 다른 글

[Shell] scp/ssh 명령어 no/yes 문구 비활성화 (배치 등록시 필요)  (0) 2022.07.16
[Docker] 명령어 정리  (0) 2022.07.16
[Docker] 로그  (0) 2022.03.26
[Docker] 볼륨  (0) 2022.03.26
[Docker] 네트워크  (0) 2022.03.26
Comments