GitLabとLDAP（OpenLDAP）連携設定

※2019/10/09 Omnibus packageについて追記

LDAP内包Active Directory連携の記事はいくつかありましたが、OpenLDAP連携は見当たらなかったので設定でハマったところも含めて纏めました。
本稿ではGitLab Community EditionとOpenLDAPの連携設定を記載しています。※Enterprise Edition追加機能については取り扱いません。
#前提
GitLabのインストールが完了している事。※環境情報を含め[別稿](https://qiita.com/hiren/items/dbf7ee9b2fe651d1298f)参照

```console:GitLabバージョン
# gitlab-rake gitlab:env:info

GitLab information
Version:        11.5.3
Revision:       aa11737
```

#設定変更
GitLabの設定ファイルを編集します。
`gitlab.rb`を開くと以下のようなLDAP設定群があります。

```shell-session:/etc/gitlab/gitlab.rb&nbsp;設定変更前
### LDAP Settings
###! Docs: https://docs.gitlab.com/omnibus/settings/ldap.html
###! **Be careful not to break the indentation in the ldap_servers block. It is
###!   in yaml format and the spaces must be retained. Using tabs will not work.**

#  gitlab_rails['ldap_enabled'] = 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: '_your_ldap_server'
#     port: 389
#     uid: 'sAMAccountName'
#     encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
#     bind_dn: '_the_full_dn_of_the_user_you_will_bind_with'
#     password: '_the_password_of_the_bind_user'
#     active_directory: true
#     allow_username_or_email_login: false
#     lowercase_usernames: false
#     block_auto_created_users: false
#     base: ''
#     user_filter: ''
#     ## EE only
#     group_base: ''
#     admin_group: ''
#     sync_ssh_keys: false
#
#   secondary: # 'secondary' is the GitLab 'provider ID' of second LDAP server
#     label: 'LDAP'
#     host: '_your_ldap_server'
#     port: 389
#     uid: 'sAMAccountName'
#     bind_dn: '_the_full_dn_of_the_user_you_will_bind_with'
#     password: '_the_password_of_the_bind_user'
#     encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
#     verify_certificates: true
#     active_directory: true
#     allow_username_or_email_login: false
#     lowercase_usernames: false
#     block_auto_created_users: false
#     base: ''
#     user_filter: ''
#     ## EE only
#     group_base: ''
#     admin_group: ''
#     sync_ssh_keys: false
#   EOS
```

これを以下のように設定します。
`## EE only`以下の設定やセカンダリLDAPサーバはCommunity Editionでは使用できないのでコメントアウトしたまま設定は変更しません。
\*\*忘れないで\*\*とコメントあるように本ブロック最終行の`EOS`を忘れずにアンコメントします。

```shell-session:/etc/gitlab/gitlab.rb&nbsp;設定変更後
### LDAP Settings
###! Docs: https://docs.gitlab.com/omnibus/settings/ldap.html
###! **Be careful not to break the indentation in the ldap_servers block. It is
###!   in yaml format and the spaces must be retained. Using tabs will not work.**

gitlab_rails['ldap_enabled'] = true

###! **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 Account'
    host: '192.168.1.200'
    port: 389
    uid: 'uid'
    bind_dn: 'cn=gitlab-BaseDN,ou=People,dc=example,dc=co,dc=jp'
    password: 'p@ssw0rd'
    encryption: 'plain'
    verify_certificates: false
    active_directory: false
    allow_username_or_email_login: true
    lowercase_usernames: true
    block_auto_created_users: false
    base: 'dc=example,dc=co,dc=jp'
    user_filter: ''
#     ## EE only
#     group_base: ''
#     admin_group: ''
#     sync_ssh_keys: false
#
#   secondary: # 'secondary' is the GitLab 'provider ID' of second LDAP server
#     label: 'LDAP'
#     host: '_your_ldap_server'
#     port: 389
#     uid: 'sAMAccountName'
#     bind_dn: '_the_full_dn_of_the_user_you_will_bind_with'
#     password: '_the_password_of_the_bind_user'
#     encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
#     verify_certificates: true
#     active_directory: true
#     allow_username_or_email_login: false
#     lowercase_usernames: false
#     block_auto_created_users: false
#     base: ''
#     user_filter: ''
#     ## EE only
#     group_base: ''
#     admin_group: ''
#     sync_ssh_keys: false
EOS
```

本設定に用いたLDAP設定及びアカウント情報は下記画像の通りです。
![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/269716/ecd06508-ae62-0da5-f5a9-4d2a9e716cd6.jpeg)

##設定項目解説
|キー|説明|
|:-----------------|:------------------|
|gitlab_rails['ldap_enabled']|LDAPユーザ認証機能の有効化|
|label|サインインページの認証選択タブのラベル表示※後述1|
|host|LDAPサーバのホスト|
|port|LDAPサーバのポート|
|uid|LDAPアカウントの項目でGitLabユーザー名としたい属性を指定[^1]|
|bind_dn|接続先LDAPに存在する適当なアカウント[^2]の完全なDNを指定|
|password|bind_dnで設定したLDAPアカウントのパスワード|
|encryption|暗号化方法|
|verify_certificates|SSL暗号化を使用している場合のSSL証明書による検証の有効化|
|active_directory|LDAPサーバーがActive Directory LDAPサーバーであるかどうか|
|allow_username_or_email_login|有効化している場合はサインイン時のユーザ名入力項目で@以降の入力を無視する[^3],[^4]|
|lowercase_usernames|LDAPユーザー名の小文字を有効にする|
|block_auto_created_users|新規に作成されるユーザをブロック状態にする※後述2|
|base|GitLabがLDAPサーバからユーザを検索し始めるルート階層|
|user_filter|特定のLDAPユーザのみフィルタしたい場合にLDAPクエリを指定|

[^1]: デフォルト設定のまま変更していない方が多いのですが、OpenLDAPでは'uid'等に変更しないとLDAP連携に成功しませんでした。<br>公式ドキュメントには記載が無いですが、LDAPアカウントから取り込む際にGitLabのユーザ名となる属性名を指定するのかな？と考えています。
[^2]: LDAP管理者アカウントでなくても良い。
[^3]: 例えばjane.doe@example.comと入力した内容は ⇒ jane.doeとして認証される。
[^4]: uid項目の値が一意になるならtrueにしても大丈夫な筈です。

###後述1：label
解説の通りです。例えば以下のような設定にすれば画像のようになります。

```shell-session:/etc/gitlab/gitlab.rb
    label: 'えるだっぷ'
```
![8.JPG](https://qiita-image-store.s3.amazonaws.com/0/269716/cfe53650-b761-49e8-f0a5-cb24190ed388.jpeg)

###後述2：block_auto_created_users
GitLabユーザーに登録の無いユーザーがLDAPを用いて認証（サインイン）するとLDAP情報を参照し、自動でGitLabユーザーが作成されます。
ユーザー作成と同時にGitLabへサインインができるようになりますが、本項目をtrueにしておくと新規作成されたユーザーはデフォルトでブロック状態となり、画像のようにサインインできなくなります。（作成済みのユーザーは通常通りサインイン可能です。）
![9.png](https://qiita-image-store.s3.amazonaws.com/0/269716/58d872eb-69dc-9649-caff-b9104514835f.png)
サインインできるようにするにはGitLab管理者ユーザーでサインインして、管理領域 ＞ ユーザーの Blocked タブに新規作成されたユーザーが居るはずなので右の設定ボックスからUnblockをクリックします。
![10.JPG](https://qiita-image-store.s3.amazonaws.com/0/269716/fffaf6e6-017f-5a3c-5e51-fab5fa1b6267.jpeg)

#設定適用
以下コマンドで変更内容を適用します。完了まで１～２分程度かかります。

```console:
# gitlab-ctl reconfigure
Starting Chef Client, version 13.6.4
resolving cookbooks for run list: ["gitlab"]
Synchronizing Cookbooks:
  - package (0.1.0)

~~（中略）~~

Running handlers:
Running handlers complete
Chef Client finished, 7/586 resources updated in 43 seconds
gitlab Reconfigured!
```

#確認
LDAP連携設定ができているか確認します。
正しく連携設定ができていれば、以下コマンドで設定した接続先LDAPサーバにて見つかったアカウント情報を取得できます。
このコマンドで情報が取得できなかった場合は設定内容を見直してください。

```console:
# gitlab-rake gitlab:ldap:check RAILS_ENV=production
Checking LDAP ...

Server: ldapmain
LDAP authentication... Success
LDAP users with access to your GitLab server (only showing the first 100 results)
        DN: cn=hoge,ou=people,dc=example,dc=co,dc=jp  uid: hoge
        DN: cn=huga,ou=people,dc=example,dc=co,dc=jp  uid: huga
        DN: cn=piyo,ou=people,dc=example,dc=co,dc=jp  uid: piyo

~~（中略）~~

Checking LDAP ... Finished
```

コマンド結果問題なければブラウザからサインインページへアクセスしてください。
左端に設定したlabelでLDAPアカウント認証用のタブが追加されている筈です。
![11.JPG](https://qiita-image-store.s3.amazonaws.com/0/269716/56bf77f6-5dd3-919b-e71c-d99e9ea9399e.jpeg)

#LDAP以外のユーザー新規登録を制限したい場合
LDAP連携ができたのでLDAP以外の方法でユーザーの新規登録ができないようにしたい場合があると思います。
その場合はGitLab管理者ユーザーでサインインして、管理領域 ＞ 設定 ＞ サインアップの制限 スクロール内の「Sign-up enabled」項目のチェックを外した後にスクロール内の「Save changes」をクリックして変更を保存してください。
![13.jpg](https://qiita-image-store.s3.amazonaws.com/0/269716/fe04e261-c677-62b4-b637-1a982ff8b3e0.jpeg)
サインインページ認証項目右端のRegisterタブが消えている筈です。

#補足
設定ファイルは３つありますが、
`gitlab.rb`にてアンコメントした設定項目は再読み込み（設定適用）時に
`gitlab.yml`の同じ設定項目の値を上書きするので基本的に`gitlab.rb`を編集します。
※Omnibus package版ではないGitLabを利用している場合は、`gitlab.rb`が無いようですので`gitlab.yml`を修正してください。

```console:
/var/opt/gitlab/gitlab-rails/etc/gitlab.yml
/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
/etc/gitlab/gitlab.rb
```

#参考

[LDAP | GitLab Docs](https://docs.gitlab.com/ee/administration/auth/ldap.html)
[How to configure LDAP with GitLab CE | GitLab Docs](https://docs.gitlab.com/ee/administration/auth/how_to_configure_ldap_gitlab_ce/)
[Setting up LDAP sign-in | GitLab Docs](https://docs.gitlab.com/omnibus/settings/ldap.html)
[GitLabでLDAP連携するための設定](https://qiita.com/domokun70cm/items/924d94625140b0bd0d5e)
[GitLabでLDAP(ActiveDirectory)認証の設定をする](https://yoshinorin.net/2017/04/04/gitlab-ldap-authentication/)
[GitLabにLDAPでログインする](http://h-otter.hatenablog.jp/entry/2015/08/12/194849)
[authentication - GitLab & OpenLDAP: Invalid credentials - Server Fault](https://serverfault.com/questions/658632/gitlab-openldap-invalid-credentials)