GitLab 의 LDAP 연동은 gitlab.rb 에 서버 정보를 넣고 gitlab-ctl reconfigure 로 적용하는 방식이다. Active Directory 도 LDAP 서버이므로 같은 설정 항목을 쓴다.
Community Edition 에서 되는 것과 안 되는 것을 먼저 구분해야 한다.
| 기능 | CE | EE |
|---|---|---|
| LDAP 계정으로 로그인 | 가능 | 가능 |
| 첫 로그인 때 사용자 자동 생성 | 가능 | 가능 |
user_filter 로 로그인 허용 범위 제한 |
가능 | 가능 |
| LDAP 그룹 → GitLab 그룹 · 권한 동기화 | 불가 | 가능 |
| 관리자 권한 자동 부여 | 불가 | 가능 |
"AD 그룹에 넣으면 GitLab 그룹에 자동으로 들어가게 해 달라"는 요구는 CE 에서 제품 기능으로 충족할 수 없다. 로그인 허용 여부만 그룹으로 통제하고, 그룹 구성은 별도 스크립트나 수동 관리로 간다.
# /etc/gitlab/gitlab.rb
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = {
'main' => {
'label' => 'AD',
'host' => 'ad.example.com',
'port' => 636,
'encryption' => 'simple_tls',
'uid' => 'sAMAccountName',
'bind_dn' => 'CN=svc-gitlab,OU=Service,DC=example,DC=com',
'password' => 'PASSWORD',
'active_directory' => true,
'base' => 'DC=example,DC=com',
'user_filter' => '(|(memberOf=CN=gitlab_users,OU=Groups,DC=example,DC=com)(memberOf=CN=gitlab_admins,OU=Groups,DC=example,DC=com))',
'allow_username_or_email_login' => false,
'block_auto_created_users' => false
}
}
| 항목 | 설명 |
|---|---|
uid |
로그인 아이디로 쓸 속성. AD 는 sAMAccountName, OpenLDAP 은 uid |
encryption |
plain(389) · start_tls(389) · simple_tls(636) |
active_directory |
AD 면 true. 계정 비활성 여부 판정 방식이 달라진다 |
base |
검색 시작 DN. 범위를 좁힐수록 조회가 빠르다 |
block_auto_created_users |
true 면 자동 생성된 계정을 관리자가 승인해야 쓸 수 있다 |
비밀번호는 파일에 평문으로 들어간다. gitlab.rb 는 root 만 읽도록 권한을 두고 형상 관리에 올리지 않는다.
gitlab-ctl reconfigure
# 연결 · 바인드 · 조회 확인
gitlab-rake gitlab:ldap:check
# 컨테이너로 운영한다면
docker exec -it gitlab gitlab-ctl reconfigure
docker exec -it gitlab gitlab-rake gitlab:ldap:check
Omnibus 이미지는 컨테이너 기동 때 GITLAB_OMNIBUS_CONFIG 환경변수를 반영해 자동으로 reconfigure 한다. 따라서 compose 파일의 설정을 바꿨으면 컨테이너를 다시 만들면 되고, 컨테이너 안에서 파일을 직접 고쳤다면 수동으로 reconfigure 해야 한다.
서버 쪽에서 필터가 맞는지 먼저 확인하면 시행착오가 줄어든다.
ldapsearch -x -H ldaps://ad.example.com \
-D "CN=svc-gitlab,OU=Service,DC=example,DC=com" -W \
-b "DC=example,DC=com" \
"(memberOf=CN=gitlab_users,OU=Groups,DC=example,DC=com)" sAMAccountName
user not found: base 범위 밖이거나 uid 속성이 다르다. AD 에서 UPN(user@example.com)으로 로그인시키려면 uid 를 userPrincipalName 으로 둔다.memberOf 는 직접 구성원만 본다. 확장 매칭 규칙을 쓴다.(memberOf:1.2.840.113556.1.4.1941:=CN=gitlab_users,OU=Groups,DC=example,DC=com)
/etc/gitlab/trusted-certs/ 에 넣고 reconfigure 한다. 시험 단계에서만 'verify_certificates' => false 를 쓰고 운영에는 남기지 않는다.CE 에서 우회하려면 LDAP 을 조회해 GitLab API 로 구성원을 맞추는 스크립트를 주기 실행한다.
# 그룹 구성원 조회
ldapsearch -x -H ldaps://ad.example.com -D "<bind_dn>" -w "${LDAP_PASSWORD}" \
-b "DC=example,DC=com" \
"(memberOf=CN=gitlab_users,OU=Groups,DC=example,DC=com)" sAMAccountName
# GitLab 그룹에 추가 (access_level 30=Developer, 40=Maintainer)
curl -sS --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
-X POST "https://gitlab.example.com/api/v4/groups/<group_id>/members" \
-d "user_id=<user_id>&access_level=30"
추가만 하고 제거를 빠뜨리면 퇴사자가 남는다. 동기화 스크립트는 AD 에 없는 사용자를 GitLab 그룹에서 빼는 것까지 포함해야 의미가 있다.