新しいサーバが来て開発環境を始めとした社内インフラの構築がかなり進みだして楽しいのですが、いろんなサービスが立ち上がりはじめて、このままではアカウントの管理的にかなりめんどくさいことになりそうなので手始めに立てたばかりのGitLabをADと連携することにしました。

環境


  • GitLab CE 9.0.2
  • ActiveDirectory(以下AD)

会社ではADと連携してますが、OpenLDAPとかでも一緒のハズです。

設定


gitlab.rbに記述します。私の場合は公式のDockerイメージを使用しておりgitlab.rbをGitLabコンテナの/etc/gitlabディレクトリにマウントしてます。もちろん、Dockerを使用しようがしまいが設定は同じです。

公式のドキュメントはこちらです。

デフォルトのLDAP設定

gitlab.rbの140行目くらいに下記のような記述があります。実際はいろいろコメントやEE用の設定や複数のLDAPサーバの設定が記述してありますが、下記はそのあたりを削除して載せてます。なお、複数のLDAPはEEでしか使用できません。

1
gitlab_rails['ldap_enabled'] = false
2
3
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
4
main:
5
     label: 'LDAP'
6
     host: '_your_ldap_server'
7
     port: 389
8
     uid: 'sAMAccountName'
9
     method: 'plain'
10
     bind_dn: '_the_full_dn_of_the_user_you_will_bind_with'
11
     password: '_the_password_of_the_bind_user'
12
     active_directory: true
13
     allow_username_or_email_login: false
14
     block_auto_created_users: false
15
     base: ''
16
     user_filter: ''
17
     attributes:
18
      username: ['uid', 'userid', 'sAMAccountName']
19
      email:    ['mail', 'email', 'userPrincipalName']
20
      name:       'cn'
21
      first_name: 'givenName'
22
      last_name:  'sn'
23
EOS

設定を書く

こいつをActive Directory Explorerあたりを使って属性と値を見ながらいい具合に書き換えます。具体的には下記のような感じになると思います。

1
gitlab_rails['ldap_enabled'] = true
2
3
###! **remember to close this block with 'EOS' below**
4
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
5
main:
6
     label: 'LDAP'
7
     host: 'example.local'
8
     port: 389
9
     uid: 'sAMAccountName'
10
     method: 'plain'
11
     bind_dn: 'CN=user01,OU=example,DC=example,DC=local'
12
     password: 'user01のパスワード'
13
     active_directory: true
14
     allow_username_or_email_login: true
15
     block_auto_created_users: false
16
     base: 'DC=example,DC=local'
17
     user_filter: ''
18
     attributes:
19
      username: ['uid', 'userid', 'sAMAccountName']
20
      email:    ['mail', 'email', 'userPrincipalName']
21
      name:       'displayName'
22
      first_name: 'givenName'
23
      last_name:  'sn'
24
EOS

以下、項目に対する補足です。attributes部分は後述。

キー説明
hostもちろんIPでもよい
uid値が一意になる属性を指定
methodplainかtlsかssl
bind_dnADに接続するユーザのdistinguishedName
ADのユーザなら誰でもいい(AD管理者じゃなくてもよい)
passwordbind_dnで設定したユーザのパスワード
active_directoryADの場合はtrue
allow_username_or_email_loginuidキーで使用している属性の値が一意になるならtrueにしてよいハズ
block_auto_created_usersたぶんドキュメントみた感じでは勝手にユーザを作成させない的なものだと思われる
baseユーザを探し始めるルート。特に指定する必要がないならいらんハズ
user_filterユーザの絞り込みに使用。LDAPクエリを指定。絞り込まない場合はいらない

attributesについて

  • email

    • おそらく前から順に属性を探して、属性がが存在すればその値を使用するようだ
    • 例えGitLab管理者でも後から変更はできない(LDAPの値が絶対適用される)
    • 非LDAP認証で先にGitLabアカウントを作成していて、そのユーザがLDAPで存在するメールアドレスを使用している場合に、後からLDAP認証すると既に作成しているユーザの情報を引き継ぐ
      • 何書いてるかわかんね~が、要するに既に作成しているユーザでも、後からLDAP認証に変更できる
  • username

    • おそらく前から順に属性を探して、属性がが存在すればその値を使用するようだ
    • gitlab.example.com/username/project」とか「@username」で使用される
    • ユーザ間での重複は不可。一意になるようにしないといけない
    • LDAPによさそうな属性(値)がなくてもGitLab管理者が「Admin Area」で後から変更できる
  • name

    • usernameと紛らわしいが、画面上に表示されるユーザ名
  • first_nameとlast_name

    • どこで使用しているかわからなかった

設定後にLDAP認証でログインして上手く値が設定されていなかったとしても、GitLab管理者でユーザ削除後に設定変更して再度LDAP認証でログインすれば同じユーザを使って何度でも確認できます。

再起動する


設定後にsudo gitlab-ctl restartでGitLabを再起動します。Dockerの場合はコンテナを再起動すればよろし。

ログインしてみる


GitLabにアクセスすると、ログイン画面でLDAPのタブが増えているのでそちらでログインします。

以上です。お疲れ様でした。