안녕하세요, 에디터 TN입니다. LDAP(Lightweight Directory Access Protocol)은 디렉터리 서비스에 접근하기 위한 경량화된 프로토콜로, 꽤 오래전 공개되었지만, 지금까지도 널리 사용되고 있습니다. LDAP 중 LDAPv1이 1993년에 RFC(Request for Comments) 1487로 제정되었고, 1997년에 발표된 LDAPv3은 2006년에 RFC 4511로 업데이트되었습니다. 관련한 내용을 [AI, 더 깊게]의 5월 콘텐츠로 준비하여 설명하여 드린 적이 있었습니다.
👉 AI Pub 개발자가 소개하는: 가볍고 빠른 프로토콜 LDAP
7월의 [AI, 더 깊게] 에서는 5월에 이야기한 LDAP의 이론에서 더 나아가 예제까지 다뤄보려 합니다. OpenLDAP을 사용하여 LDAP 서버와 클라이언트를 실행한 후 간단한 테스트까지 진행해 보는 과정으로 준비했는데요. MacOS에서 Homebrew를 사용하여 OpenLDAP 서버와 클라이언트를 설정하고 테스트하는 방법입니다.
OpenLDAP으로 서버, 클라이언트를 구성하는 예제는 MacOS의 M2 2022년 모델을 기준으로 하고 있습니다. 또한 OpenLDAP의 Quick-Start Guide 문서 내용을 기반으로 한 것이므로, 예제를 살펴보시기 전 참고하시기를 바랍니다.
[ OpenLDAP으로 서버 구성하기 ]
우선, OpenLDAP으로 서버를 설정해 보겠습니다. Homebrew를 사용하여 OpenLDAP 서버를 설치합니다.
```
$ brew install openldap
```
초기 설정 파일의 내용은 다음과 같습니다.
```shell
#######################################################################
# MDB database definitions
#######################################################################
database mdb
maxsize 1073741824
suffix "dc=my-domain,dc=com"
rootdn "cn=Manager,dc=my-domain,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
```
예제에 사용할 도메인과 관리자 정보를 바탕으로 slapd.conf 파일의 값을 설정하기 위해 다음과 같이 변경합니다.
```shell
#######################################################################
# MDB database definitions
#######################################################################
database mdb
maxsize 1073741824
suffix "dc=example,dc=com"
rootdn "cn=Manager,dc=example,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw your_password
```
`suffix` 값으로 도메인을 설정합니다. 예제에서는, `"dc=example,dc=com"`를 도메인으로 설정했습니다. 또한 관리자의 DN을 설정하기 위하여 `rootdn` 값을 `"cn=Manager,dc=example,dc=com"`으로 변경합니다. `rootpw`의 주석(your_password)을 제거하고 실제 비밀번호로 대체하면 관리자 비밀번호를 설정할 수 있습니다.
이어서, OpenLDAP 서버가 데이터를 저장할 디렉토리를 생성합니다. 이 디렉토리는 서버가 실행되는 동안 데이터베이스 파일을 저장하는 데 사용됩니다.
```shell
$ mkdir -p /opt/homebrew/var/openldap-data
```
slapd 명령어를 사용하여 OpenLDAP 서버를 실행합니다. `-d 1` 옵션은 디버그 모드로 실행하여 콘솔에 로그를 출력합니다.
```shell
$ /opt/homebrew/opt/openldap/libexec/slapd -d 1
```
[ OpenLDAP으로 클라이언트 구성하기 ]
서버에 이어 클라이언트를 구성해 보겠습니다. 우선, Homebrew를 사용하여 OpenLDAP 클라이언트 도구를 설치합니다.
```
brew install openldap-client
```
클라이언트의 초기 항목을 서버에 추가하기 위해서는 LDIF(LDAP Data Interchange Format) 파일을 사용해야 합니다. LDIF는 LDAP 디렉토리의 내용을 표현하는 일반 텍스트 형식입니다. `example.ldif` 파일을 생성하고 아래 내용을 추가하면 됩니다. 정보의 성격에 따라 엔트리를 구분하는데, 예제에서는 기업 및 팀을 기준으로 한 초기 항목 추가 상황을 가정하였습니다.
```shell
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example Company
dc: example
dn: cn=John Doe,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
cn: John Doe
sn: Doe
givenName: John
mail: johndoe@example.com
```
첫 번째 엔트리는 `example.com` 도메인을 나타내는 조직 엔트리입니다. 이어서 확인하실 수 있는 두 번째 엔트리는 `John Doe`라는 사용자를 나타내는 사람 엔트리입니다. 위의 예제와 같이 추가한 LDIF 파일의 항목은 ldapadd 명령어를 사용하여 서버에 추가할 수 있습니다.
```shell
$ ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f example.ldif
adding new entry "dc=example,dc=com"
adding new entry "cn=Manager,dc=example,dc=com"
```
위의 예제에서 확인할 수 있는 몇 가지 지정값이 있습니다. 이에 대한 상세 내용은 예제에서 입력된 순서대로, 아래와 같이 정리할 수 있습니다.
- `-x` 옵션은 단순 인증을 사용하도록 지정합니다.
- `-D` 옵션은 바인드 DN을 지정합니다.
- `-W` 옵션은 비밀번호를 프롬프트에서 입력받도록 합니다.
- `-f` 옵션은 LDIF 파일의 경로를 지정합니다.
이어서 검색 테스트가 필요합니다. 아래와 같이 입력하면, 테스트를 거쳐 결과를 확인할 수 있습니다. 이 때, 테스트의 기본 조건 및 제한 항목 등을 아래의 예제처럼 작성합니다. 클라이언트의 초기 항목을 서버에 추가하는 것과 유사한 항목으로 구성되어 있습니다.
```shell
$ ldapsearch -x -H ldap://localhost -b "dc=example,dc=com" "(objectclass=*)"
```
위의 예제에서 어떤 항목을 추가하는지, 아래의 지정값을 참고하여 읽을 수 있습니다.
- `-x` 옵션은 단순 인증을 사용하도록 지정합니다.
- `-H` 옵션은 LDAP 서버의 URI를 지정합니다.
- `-b` 옵션은 검색의 기준 DN을 지정합니다.
- `"(objectclass=*)"` 부분은 모든 객체 클래스를 가진 항목을 검색하는 필터입니다.
작성된 내용으로 얻은 테스트 검색 결과는 다음과 같이 출력됩니다.
```shell
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# example.com
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
o: Example Company
dc: example
# Manager, example.com
dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
```
앞서 보여드린 예제를 따라 서버에 저장한 세 개의 엔트리(`dc=example,dc=com`, `cn=Manager,dc=example,dc=com`, `cn=John Doe,dc=example,dc=com`)를 테스트의 결과로 확인한 것이 바로 위의 내용입니다. 테스트 진행을 위하여 작성한 내용에 따라 `dc=example,dc=com`을 기준으로 하위 트리 전체를 검색하고, 객체 클래스에 상관없이 모든 엔트리를 반환한 것입니다. 각 엔트리는 고유한 DN(Distinguished Name)과 속성(attribute)들로 구성되어 있습니다. 이처럼 LDAP의 검색 기능을 활용하면 다양한 조건을 지정하여 원하는 정보를 빠르게 찾을 수 있습니다.
[ AI Pub도 LDAP이 연동되어 있습니다 ]
덧붙여 텐의 인공지능 솔루션인 AI Pub의 LDAP을 기반으로 한 사용자 로그인 기능도 예시로 함께 소개해 볼까 합니다.
기업에 근무 중인 사용자가 이미 보유하고 있는 사내 계정으로 AI Pub에 로그인하면, AI Pub 사용자로 등록이 되는 방식입니다. 물론 중요 AI 프로젝트나 AI 서비스의 AI 인프라 리소스를 다루는 플랫폼이므로 관리자의 사용자 승인을 거쳐야 합니다. 관리자 승인을 받은 사용자 계정은 AI Pub 서비스를 이용할 수 있습니다. 최초로 AI Pub에 로그인할 경우, AI Pub의 로그인 화면은 위의 이미지와 같이 전환됩니다. 계정 생성 정보의 본인 확인 목적에서 위의 이미지와 같이 이름과 정보를 자동으로 노출하고 있는 모습입니다.
아, 물론, 언제나 더 나은, 더 편리한 플랫폼 이용을 추구하고 있는 만큼, 이미지에서 확인할 수 있는 AI Pub의 계정 등록 승인 대기 페이지는 언제든 UI를 변동할 여지가 있습니다. 따라서 LDAP 적용으로 인하여, 어떤 방식으로 사용자 계정이 생성되고, 본인 확인용 정보를 전달하는지만 참고해 주시면 되겠습니다.
지난 5월에 [AI, 더 깊게]에서 LDAP에 대하여 설명할 당시 말씀드렸듯이, LDAP의 경량화된 특징과 빠른 검색 속도는 대규모 디렉터리 서비스에 적합하지만 데이터 무결성과 대량 업데이트가 필요한 경우에는 주의가 필요합니다. 따라서 LDAP의 특징과 구성요소를 잘 이해하고 서비스의 요구사항에 맞게 활용해야 합니다. 효과적인 사용자 관리와 인증 체계를 구축하고자 한다면, LDAP을 고려해 보시기를 권해 드립니다. 지금까지 에디터 TN이었습니다.
- 7월의 [AI, 더 깊게] 콘텐츠는 TEN의 인공지능 플랫폼 개발팀 이용준 주임연구원의 도움으로 작성되었습니다.-
* 참고자료
1. RFC 4511 - Lightweight Directory Access Protocol (LDAP) The Protocol datatracker.ietf.org
: https://datatracker.ietf.org/doc/html/rfc4511
2. Basic LDAP Concepts - LDAP.com: https://ldap.com/basic-ldap-concepts/
3. Why Choose LDAP - LDAP.com: https://ldap.com/why-choose-ldap/
4. OpenLDAP Software 2.6 Administrator's Guide: A Quick-Start Guide
: https://www.openldap.org/doc/admin26/quickstart.html
'Tech & Product > AI, 더 깊게' 카테고리의 다른 글
AI Pub 개발자가 소개하는: Kubernetes Admission Controller (0) | 2024.06.26 |
---|---|
AI Pub 개발자가 소개하는: 디자인 시스템과 스토리북 (0) | 2024.05.30 |
AI Pub 개발자가 소개하는: 가볍고 빠른 프로토콜 LDAP (0) | 2024.05.24 |
RA:X 서비스 개발자의 인사이트: 혼합 정밀도와 GPU 성능 비교 (0) | 2024.04.01 |
AI Pub 프론트엔드 개발자가 소개하는: 웹 테스트 자동화 프레임워크 (0) | 2024.02.23 |