사내 웹서비스들은 무조건 ldap으로 연동해서 사용해야하는데 로컬에서 간편하게 구성해서 쓸 수 있는 도커 이미지가 있어 정리해본다.
사내 개발망에서 ldap 과 연동해서 바로 테스트해볼 수도 있지만 사용하고자 하는 앱마다 서비스 등록을 해야하고 토큰 발급에 결재 등등 시일이 걸려, 빠르고 간편한게 로컬에서 테스트 해보는 용도로 참고하면 좋을 것 같다.
예전에는 한땀한땀 slapd
를 설치해서 썼었는데 osixia/openldap
이미지에서 파라미터로 세세한 설정도 할 수 있어서 잘하면 운영 용도로도 쓸 수 있을 것 같다. KEEP_EXISTING_CONFIG: "true"
값과 설정 파일들을 docker volume 으로 지정하면 두고두고 재사용할 수 있어서 한번 구성해두면 계속 사용할 수 있다.
openldap 설치
다음과 같이 osixia
에서 제공하는 openldap
과 phpldapadmin
을 같이 묶어서 docker-compose.yml
설정을 하고
version: '3.3'
services:
openldap:
image: osixia/openldap:1.5.0
container_name: openldap
environment:
LDAP_LOG_LEVEL: "256"
LDAP_ORGANISATION: "oboki.net"
LDAP_DOMAIN: "auth.oboki.net"
LDAP_BASE_DN: ""
LDAP_ADMIN_PASSWORD: "admin"
LDAP_CONFIG_PASSWORD: "config"
LDAP_RFC2307BIS_SCHEMA: "false"
LDAP_BACKEND: "mdb"
LDAP_TLS_ENFORCE: "false"
LDAP_TLS_CIPHER_SUITE: "SECURE256:-VERS-SSL3.0"
LDAP_TLS_PROTOCOL_MIN: "3.1"
LDAP_TLS_VERIFY_CLIENT: "demand"
KEEP_EXISTING_CONFIG: "true"
LDAP_REMOVE_CONFIG_AFTER_SETUP: "true"
LDAP_SSL_HELPER_PREFIX: "ldap"
tty: true
stdin_open: true
volumes:
- ./mnt/openldap/ldap:/var/lib/ldap
- ./mnt/openldap/slapd.d:/etc/ldap/slapd.d
ports:
- "389:389"
- "636:636"
domainname: "auth.oboki.net" # important: same as hostname
hostname: "auth.oboki.net"
phpldapadmin:
image: osixia/phpldapadmin:latest
container_name: phpldapadmin
environment:
PHPLDAPADMIN_LDAP_HOSTS: "auth.oboki.net"
PHPLDAPADMIN_HTTPS: "false"
ports:
- "8080:80"
depends_on:
- openldap
실행만 해주면 설치 끝.
# docker-compose up -d
Creating openldap ... done
Creating phpldapadmin ... done
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07618182a576 osixia/phpldapadmin:latest "/container/tool/run" 5 seconds ago Up 3 seconds 443/tcp, 0.0.0.0:8080->80/tcp phpldapadmin
e026882e1794 osixia/openldap:1.5.0 "/container/tool/run" 6 seconds ago Up 5 seconds 0.0.0.0:389->389/tcp, 0.0.0.0:636->636/tcp openldap
사용자 설정
Organisation Unit
으로 조직 구분과 사용자 내역을 관리하는 기본적인(?) 구성으로 설정한다.
로그인
아이디만 적으면 안되고 도메인을 포함한 DN
으로 적어야 하는데 auth.oboki.net
으로 호스트를 설정한 경우 다음과 같이 로그인할 수 있다.
- Login DN:
cn=admin,dc=auth,dc=oboki,dc=net
- Password:
admin
왼쪽 탭에서 계층구조를 확인할 수 있는데 다음과 같이 호스트를 선택하고 Create a child entry
를 눌러 OU
정의를 진행한다.
Generic: Organisational Unit
템플릿에서
groups
를 입력한 뒤 Create object
-> Commit
을 눌러 생성할 수 있고
같은 방식으로 ou=users
도 생성해준다.
이어서 ou=groups
에 실제 그룹 엔트리를 추가해주건데 ldap 을 연동한 앱에서 구현한 방식에 따라 다르겠지만 이 그룹을 어떻게 지정하는지에 따라 앱에서 바로 role을 부여할 수도 있다.
여기에서는 간단히 admin
과 developer
를 추가한다.
ou=groups
에서 Create a child entry
를 선택하고
Generic: Posix Group
을 선택한 뒤
admin
이라고 적어주고 Create object -> Commit 을 눌러 생성한다.
같은 방식으로 developer
도 추가한다.
이어서 ou=users
에 사용자 엔트리를 추가한다.
Custom Template 을 정의해서 이메일이나 주소, 전화번호 등의 필요한 속성들만 예쁘게 관리할 수도 있는 것 같은데 여기서는 phpldapadmin 에서 제공하는 기본 템플릿을 이용한다.
default
템플릿을 선택하고
ObjectClass
는 inetOrgPerson
을 선택해준다.
RDN
으로는 User Name (uid)
를 선택한다.
cn
, sn
, password
, User Name
값을 채워넣는다. 여기 User Name
값이 다른 서비스에서 로그인할때 사용될 id 로 보통 사용되므로 주의해서 꼭 채워놓도록 한다. 값을 올바르게 다 적었으면 Create object
-> Commit
을 눌러 마무리한다.
이어서 방금 추가한 사용자 uid=oboki
를 관리자 그룹 cn=admin
에 등록한다.
Add new attribute
를 선택하고
memberUid 속성을 선택한 뒤
이전 사용자 추가에서 User Name
속성에 채워넣었던 oboki
를 채워넣고 Update Object
를 눌러 속성을 추가하면 끝.
여기까지 완료됐으면 다음과 같이 ldapsearch 명령으로 조회했을때
docker-compose exec openldap ldapsearch -x \
-D "cn=admin,dc=auth,dc=oboki,dc=net" \
-w "admin" \
-H ldapi:/// \
-b "ou=users,dc=auth,dc=oboki,dc=net"
다음과 같이 cn=admin
그룹에 포함된 사용자 레코드를 조회할 수 있다.
# extended LDIF
#
# LDAPv3
# base <ou=users,dc=auth,dc=oboki,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# users, auth.oboki.net
dn: ou=users,dc=auth,dc=oboki,dc=net
ou: users
objectClass: organizationalUnit
objectClass: top
# oboki, users, auth.oboki.net
dn: uid=oboki,ou=users,dc=auth,dc=oboki,dc=net
cn: dongil
objectClass: inetOrgPerson
objectClass: top
userPassword:: e01ENX1YMDNNTzFxblpkWWRneWZldUlMUG1RPT0=
sn: kim
uid: oboki
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
gitlab 연동 해보기
앞서 설정한 ldap 으로 인증이 잘 되는지 gitlab-ce 컨테이너를 기동해서 확인해본다.
version: '3.6'
services:
web:
image: 'gitlab/gitlab-ce:13.12.0-ce.0'
restart: always
hostname: 'localhost'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://host.docker.internal:5000'
ports:
- '5000:5000'
volumes:
- './mnt/gitlab/config:/etc/gitlab'
- './mnt/gitlab/logs:/var/log/gitlab'
- './mnt/gitlab/data:/var/opt/gitlab'
shm_size: '256m'
networks:
- openldap
networks:
openldap:
external: true
위와 같이 깃랩 컨테이너를 기동한 뒤 gitlab.rb
파일에 다음과 같이 설정하고 재기동해주면
gitlab_rails['ldap_enabled'] = true
# gitlab_rails['prevent_ldap_sign_in'] = false
###! **remember to close this block with 'EOS' below**
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main: # 'main' is the GitLab 'provider ID' of this LDAP server
label: 'LDAP'
host: 'auth.oboki.net'
port: 389
uid: 'uid'
method: 'plain'
bind_dn: 'cn=admin,dc=auth,dc=oboki,dc=net'
password: 'admin'
active_directory: false
allow_username_or_email_login: true
block_auto_created_users: false
base: 'ou=users,dc=auth,dc=oboki,dc=net'
user_filter: ''
attributes:
username: ['uid']
name: 'cn'
last_name: 'sn'
EOS
로그인 화면에서 ldap 옵션이 나타나고 설정한 계정으로 로그인할 수 있다.