C Sharpens you up

http://qiita.com/yuba に移しつつあります

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認証のエリアにf:id:Sampo:20140209205550p:plain

  • 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パスワードでも、どちらでもログインできるユーザになります。