GitBucketのユーザ認証をActiveDirectoryと連携する
GitBucketは驚きの超お手軽GitHubクローンです。
そのお手軽さたるや、落としてきたgitbucket.warファイルをTomcatにデプロイするかjarとして実行java -jar gitbucket.war
するかするだけで社内GitHubがもう構築完了。
あとはrootユーザ(初期パスワード root)でサインインして自分のパスワードを変えるだけでもう実使用可能な状態になっています。
そのGitBucket、社内の開発者全員分のユーザアカウントを各自に作ってもらうまでもなくActiveDirectoryの認証情報でサインインするように設定することが可能です。手探りでやってみて設定に成功したので、方法を解説します。
1. 社内のドメインコントローラのホスト名を確認します
システム部門に聞けばもちろん一発なのですが、ドメインに参加しているWindows端末なら手元ですぐ調べられます。
SET LOGONSERVER
この結果がcontroller.example.co.jpだったとして次に進みましょう。
社内のドメインはEXAMPLE.CO.JPです。
2. GitBucketにLDAP認証を設定します
rootでサインインしてSystem Settingsを開きます。LDAP認証のエリアに
- LDAP: ✓
- LDAP Host: controller.example.co.jp
- LDAP Port: 389
- Bind DN: 【任意のユーザ名】@example.co.jp
- Bind Password: 【そのユーザのパスワード】
- Base DN: DC=EXAMPLE,DC=CO,DC=JP
- User name attribute: sAMAccountName(もしくはuserPrincipalName)
- Full name attribute: displayName
- Mail address attribute: mail
と設定します。
【任意のユーザ名】【そのユーザのパスワード】を入力するとなっている「Bind DN」(バインド識別名)とは、どのドメインユーザの資格で問い合わせを行うか、を意味するものです。自分のユーザ名・パスワードでいいでしょう(うちの職場では個人パスワードが定期変更を義務付けられているのでメンテナンス用のユーザアカウントを使いました)。
「Base DN」は認証を要求するときにユーザを探す所属階層です。これで、「EXAMPLE.CO.JP社内の」という限定をしています。
「User name attribute」が大事で、この項目が認証の際のログインIDとして利用されます。ドメインコントローラが複数あるActiveDirectory環境ならuserPrincipalNameを指定することで"user@example.co.jp"のようなドメイン指定込みのログインIDでログインすることになりますし、ドメインコントローラ一台ならsAMAccountNameを指定することでドメイン指定なしの"user"のようなログインIDにもできます。ただし1.12以前のGitBucketではuserPrincipalNameを使うと誤作動しますのでご注意(ユーザー名として禁止文字のはずの'@'がユーザー名に採用されてしまう)。
「Mail address attribute」は得られたユーザ情報のうちどの属性を表示名・メールアドレスとして採用するかを指定するところです。
「Full name attribute」は1.10で追加された設定項目です。ここで指定した属性がユーザ表示名として採用されます。1.9以前は、User name attributeの設定内容がユーザ表示名の取得にも使われていました。無理言ってこの項目を追加してもらったのは僕です… takezoeさん対応ありがとうございました。
3. 実際にサインインしてみます
rootをサインアウトして、自分のアカウントでサインインしてみましょう。ユーザ名としては、自分の社内アドレスの@より左側だけを入力します。
成功したらおめでとう。
例外画面が出てしまった場合、これはもうWeb画面からは回復できません(たぶんrootもサインインできなくなっています)。Tomcatのホームディレクトリ下にgitbucket.confという設定ファイルがあるので、エディタでLDAP関連の設定行を全部消してください。
サインインできなかった場合。どこで引っかかっているのか診断する手がかりが必要です。ログファイルを探しに行くのが面倒だった僕はWiresharkでパケットキャプチャしてドメインコントローラとの通信内容を覗き見てエラーメッセージを読んでいました。どっちが面倒なんでしょうね。
もしActiveDirectoryにいるのと同名のユーザをローカルで作っちゃうと?
そのユーザは、ローカルパスワードでもActiveDirectoryパスワードでも、どちらでもログインできるユーザになります。