Active DirectoryとHudson/Javaの統合

Active DirectoryとJavaのお寒い関係について、またHudsonがcom4jを使うことでどうやってゼロ・コンフィグレーションのActive Directory統合を実現したのか、以前に書きました。これはWindows上でHudsonを使っているユーザーには大変便利だったのですが、一方、その後、Active Directoryで管理されているドメインの中で動いているUnixマシン上でもHudsonを使っている人が意外に多いことが分かりました。UnixではCOMは使えないのでまったく異なるアプローチを実装する必要がありましたが、先日ようやっとHudsonのActive DirectoryプラグインUnixでも動くようにして公開することができました。こちらは残念ながらゼロ・コンフィグレーションではないのですが、入力するフィールドはActive Directoryドメイン名の一つだけです。


グーグル先生によると、様々なアプリケーションで未だにActive Directoryを統合するのに苦労している人達が多くいるようです。これらに共通の症状は、汎用のLDAPもしくはJNDI認証を使おうとして、設定項目の多さのあまりにどこかで間違える、というパターンです。これは、HTTPがTCP/IPを使っているからといってHTTPコマンドを手で入力するような、一般のユーザーにとっては、根本的に間違ったアプローチです。


そこで、JavaからActive Directoryで認証を行うためのプログラムがより多く書かれるようにと、その手順をまとめてみました。

その1:LDAPサーバを発見する

まず、「_ldap._tcp.DOMAINNAME.」に対してDNS SRVレコードを取得してドメイン内のLDAPサーバを発見しましょう。Active Directory内のDNSがもっているこの手の追加エントリに関してはこのMSDN記事を参照してください。また、JavaSEのドキュメントにはJNDI経由でDNSと対話する方法が書かれています。


これにより、ユーザーはLDAPサーバーをハードコードする必要がなくなります。ドメインコントローラが追加されたり退役したりしても大丈夫ですし、障害対策に複数のLDAPサーバが動いているような環境でも正しくフェイルオーバーが行えます。

その2:認証する

LDAPサーバのホスト名とポート番号がわかったら、LDAPサーバとやりとりをする時間です。これにも、JNDIが使えます。LDAPでは、パスワードが正しいかどうかは、そのパスワードを使ってLDAPサーバに接続を試みることで行われます。ところが残念な事に、汎用のLDAP認証コネクタ(これとか)は、かなり回りくどい方法を使ってこれをします。まず初めに一度LDAPと接続して、これから認証しようとしているユーザーの一意な名前を得ます(CN=Kohsuke Kawaguchi,DN=sun,DN=comみたいな)。それから今度はこのユーザー名とパスワードを使って接続をしなおします。これが成功すればパスワードはあっているので認証が成功したと見なし、失敗すればパスワードは間違っているので認証は失敗です。これが必要なのはLDAPサーバにとってのユーザー名はこの一意な名前である必要があって、いわゆるUnixユーザーIDのような形式は使えないからです。


Active Directoryにとっては、しかし、この方法は非常に悪いやり方です。というのも、Active Directoryはディフォルトでは匿名での接続をサポートしていないので、認証を行うプログラムは少なくとも一つの有効なユーザー名・パスワードを持っていないと、最初の「ユーザーの一意な名前を得る」ステップができないのです。このため、認証するアプリケーションにユーザー名とパスワードを設定してやる必要があります。悪ですね。しかし、Active DirectoryLDAPサーバは別の方法で認証が可能です。ユーザーの一意な名前を得るかわりに、単に「kohsuke@sun.com」のように完全修飾されたユーザー名とパスワードだけで接続できてしまうのです。Active Directory専用にコードを書けば、このように認証することで、いわゆる「マネージャーDN/password」と呼ばれるハードコードされたパスワードが必要なくなります。


さて、LDAP接続に一旦成功したら、ユーザー・グループメンバーシップの情報や、電子メールアドレスなど、使える情報がいっぱいです。どのような情報があるかの詳細は、MSDNの記事が詳しいです。また、何らかのLDAPブラウザがあると開発に便利です。

まとめ

より詳細で具体的な方法については、ソースコードを参照してください。もし、あなたのお使いのツールがLDAP接続を設定してActive Directoryと統合せよ、と書いてあったら、よりよい統合を要求しましょう。


セキュリティ関係の次なる目標は、Integrated Windows Authenticationのサポートです。これができれば、HudsonはWindowsのシングル・サインオンに対応できることになります。この機能はHudson以外のウェブアプリケーションにとっても大変有用でしょう。