LearnRun
Synology DSM 7, LDAP 인증 서버 구축 본문
◈ Contents

도입 이유
컨테이너 수가 점차 늘어나면서, 많은 웹 서버들에 대해 유저 관리를 하는 데 부하가 발생하였습니다.
이에, 중앙 집중화하여 유저를 관리하기 위해 도입했습니다.
나아가, 추후 개발하게 될 서비스들을 감안해도 훨씬 소요가 줄어 선택했습니다.
LDAP ?
Lightweight Directory Access Protocol은 디렉터리 서비스에 접근하기 위한 프로토콜입니다.
디렉터리 서비스는 조직, 사용자, 장치, 권한 정보 등을 계층적으로 저장하고 관리하는 데이터베이스입니다.
LDAP은 이 데이터베이스에 쉽게 접근하고 데이터를 검색 및 수정할 수 있는 경량화된 프로토콜입니다.
계층적 데이터 구조
- LDAP은 데이터를 트리 구조로 저장하며, 각 노드는 개체(user, computer, group 등)를 나타냅니다.
- 조직의 사용자, 부서, 위치 정보 등을 계층적으로 표현하는 등, 정보의 분류와 접근이 간편해집니다.
경량 프로토콜
- LDAP은 X.500 디렉터리 서비스 표준에서 파생된 경량 프로토콜입니다.
- X.500은 복잡하고 무거웠던 반면, LDAP은 가벼워서 리소스를 적게 소모, 빠른 성능을 제공합니다.
중앙 집중식 관리
- LDAP은 조직 내 여러 시스템의 사용자 정보, 권한, 정책 등을 중앙에서 관리할 수 있도록 합니다.
- 여러 시스템이 각각 별도의 사용자 데이터를 관리하는 것보다 훨씬 효율적이고 안전합니다.
플랫폼 독립성
- LDAP은 다양한 운영체제와 응용 프로그램에서 사용할 수 있습니다.
- 표준화된 프로토콜이므로 서로 다른 시스템 간의 상호운용성이 뛰어납니다.
보안 통신
- LDAP은 기본적으로 평문 통신을 하지만, SSL/TLS를 사용하여 데이터를 암호화할 수 있습니다.
보안 통신 파트에서 볼 수 있듯,
본 문서에서는 SSL/TLS를 사용하여 "ldaps" 프로토콜을 활용합니다.
Synology LDAP Server

패키지를 설치한 후, 실행합니다.
FQDN과 패스워드를 작성하여, 연결을 진행합니다.
FQDN은 NAS가 가지고 있는 도메인에 서브도메인을 추가하여 작성했습니다.
예시)
NAS 주소 : nas.synology.me
FQDN : ldap.nas.synology.me

정보 입력과 함께 연결이 진행되면, 인증 정보가 드러납니다.
이제 제어판의 "도메인/LDAP"으로 이동합니다.

사실 웹 서버의 인증 대리로만 사용할 것이라면 이전 단계로도 충분하지만,
보안적 측면에서 그룹별/사용자별 권한을 제한할 필요가 있어 추가하였습니다.
이전 인증정보에서 보았던 BindDN, BaseDN을 옮겨적어넣습니다.
암호화는 SSL/TLS를 선택하여 ldaps를 쓸 준비를 마칩니다.
이후 연결하면 성공적으로 마칠 수 있습니다.
입맛에 맞게, 유저그룹 권한이나 유저 권한을 제한할 수 있습니다.
네트워크 설정
공유기에서 NAS IP 측의 636 포트를 개방해야 합니다.
파이썬을 통한 인증 예시
from ldap3 import Server, Connection, ALL, SIMPLE, SYNC, ALL_ATTRIBUTES
from ldap3.core.exceptions import LDAPException
def authenticate_user(server_address, user_dn, user_password):
try:
server = Server(server_address, get_info=ALL)
conn = Connection(server, user=user_dn, password=user_password, authentication=SIMPLE, client_strategy=SYNC)
if not conn.bind():
return False, "Authentication failed", None
conn.search(search_base=user_dn,
search_filter='(objectClass=*)',
search_scope='BASE',
attributes=ALL_ATTRIBUTES)
user_attributes = conn.entries[0].entry_to_json() if conn.entries else "{}"
return True, "Authentication successful", user_attributes
except LDAPException as e:
return False, str(e), None
finally:
if conn:
conn.unbind()
ldap_server = 'ldaps://<<주소>>'
user_dn = '인증 정보의 bindDN에서 ID만 변경'
user_password = '패스워드'
success, message, attributes = authenticate_user(ldap_server, user_dn, user_password)
print("Success:", success)
print("Message:", message)
print("Attributes:", attributes)
- 위 코드를 통해, 서버가 인증 작업을 수행하는지 확인할 수 있습니다.

위와 같이, 생성한 유저의 ID와 패스워드로 NAS 측에 인증이 이뤄짐을 확인할 수 있습니다.