사내 시스템을 구성하기 위해 Docker로 여러개의 컨테이너를 이용중인데
현재는 Git, MinIO, 메일서버, ERP, 관리자 등 여러 서비스에서 각각의 계정을 만들어주어야 하기 때문에
인증정보 통합의 필요성을 느껴 LDAP서버를 사용하기로 했다.
LDAP란 Lightweight Directory Access Protocol의 약자로, 분산 디렉터리 서비스에서 사용자, 시스템, 네트워크, 서비스, 앱 등의 정보를 공유하기 위한 프로토콜이다.
자세한 내용은
참조
쉽게말해 네트워크 기반 데이터베이스라고 볼 수 있는데, 생소한 개념이라 그런지 조금 어렵다 😅
복잡하게 갈 필요 없이 openldap를 이용했다.
해당 이미지를 올려서 LDAP 서버로 사용하면 시놀로지 SMB 서비스 이용이 불가합니다.
(DB에 저장해놓고 OAuth와 같은 SSO를 구현하거나, 시놀로지에서 지원하는 LDAP 또는 SSO서버를 이용할 수도 있지만 직접 만들어보고 싶었다.)
Docker에 컨테이너 생성
$ sudo docker pull osixia/openldap:latest
$ sudo docker run -p 389:389 -p 636:636 \
--env LDAP_ORGANISATION="Company Name" \
--env LDAP_DOMAIN="testcompany.com" \
--env LDAP_ADMIN_PASSWORD="<PASSWORD>" \
--name ldap-server \
--network web-server-network \
--detach osixia/openldap:latest
테스트
$ sudo docker exec ldap-server ldapsearch -x -H ldap://testcompany.com -b dc=testcompany,dc=com -D "cn=admin,dc=testcompany,dc=com" -w "<PASSWORD>"
출력결과
# extended LDIF
#
# LDAPv3
# base <dc=testcompany,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# testcompany.com
dn: dc=testcompany,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Company Name
dc: testcompany
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
LDAP 관리를 위한 관리자 컨테이너 생성
$ sudo docker pull osixia/phpldapadmin:latest
$ sudo docker run -p 8443:443 \
--env PHPLDAPADMIN_LDAPHOSTS=testcompany.com \
--name ldap-server-admin \
--network web-server-network \
--detach osixia/phpldapadmin:latest
LDIF 작성
# Distinguished Name
dn: dc=testcompany,dc=com
dc: testcompany
o: testcompany
objectclass: top
objectclass: dcObject
objectclass: organization
# Entry - Groups
cn=groups,dc=testcompany,dc=com
cn: groups
objectclass: organizationalRole
objectclass: top
# Entry - Groups: admin
dn: cn=admin,cn=groups,dc=testcompany,dc=com
cn: admin
gidnumber: 1000
objectclass: posixGroup
objectclass: top
# Entry - Groups: userlist
dn: cn=userlist,cn=groups,dc=testcompany,dc=com
cn: userlist
gidnumber: 1001
objectclass: posixGroup
objectclass: top
# Entry - User: superadmin
dn: cn=superadmin,cn=admin,cn=groups,dc=testcompany,dc=com
cn: superadmin
gidnumber: 1000
givenname: super
homedirectory: /home/sadmin
loginshell: /usr/sbin/nologin
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: admin
uid: sadmin
uidnumber: 1000
userpassword: {SSHA}IyThfNXL+vePA7xYD8mebKud6bhn0p2U
# Entry - User: jade
dn: cn=jade,cn=userlist,cn=groups,dc=testcompany,dc=com
cn: jade
gidnumber: 1001
givenname: jade
homedirectory: /home/jade
loginshell: /usr/sbin/nologin
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: jade
uid: jade
uidnumber: 1001
userpassword: {SSHA}w8gyqYeTaOZerh/aI0UfKpHV5Bifmaz5
userpassword는 slappasswd 명령어로 만들 수 있다.
https://ip-addr:8443/으로 접속
Login DN: cn=admin,dc=testcompany,dc=com
Password: 컨테이너 생성 시 작성한 비밀번호
좌측 메뉴 상단의 import 클릭 후 위에 작성한 LDIF 입력, Proceed >> 클릭
시놀로지 연결 테스트
중간에 Samba가 지원되지 않는다고 나온다.
심각한 오류는 아니므로 자세히 보기를 눌러 체크박스 체크 후 적용하면 된다.
메일플러스 서버 - 서비스 - 프로토콜 탭에서 "로컬 사용자"를 "LDAP 사용자"로 바꿔주고, 계정 탭에서 만들어둔 계정을 활성화하면 된다.
메일플러스에 로그인 할 때는 LDAP URL을 @과 함께 뒤에 붙여주어야 한다.
References