LinuxでSubVersionを構築しEclipse Subversive から使うではSubversionの認証としてBasic認証を使ってましたが、Windowsドメインを建てているということで、ActiveDirectoryを使って認証してみました。
環境はApache2.2 , CentOS5.5で、ドメインコントローラはWindowsServer2003です。
SubversionはApacheコンポートネントとして動かしているため、普通のWEBサーバとしての認証でも使えるかと思います。
ActiveDirectoryとの認証方法はいくつかあるようですが、今回はLDAPでの認証を試しました。
(LDAPを使ってもAuthTypeはBasicでないといけないのでパスワードは平文で流れてしまいます。)
LDAPでActiveDirectoryの認証情報を使うには、下記のように設定ファイルを編集すればOKです。(認証部分のみ)
/etc/httpd/conf.d/subversion.conf
AuthType Basic
AuthName "Subversion Repositoryr"
AuthBasicProvider ldap (認証方式。LDAPを使う)
AuthLDAPUrl "ldap://hogesv01:389/OU=person,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN userhoge@hogedomain.jp
AuthLDAPBindPassword userhogeのパスワード
Require ldap-attribute objectClass=person
AuthLDAPUrlはLDAP URLと呼ばれるもので下記の書式になるようです。
ldap://host:port/basedn?attribute?scope?filter
host : これはドメインコントローラを指定します。
port : LDAPだと389になります。
basedn : 検索の起点となる識別名(DN)を指定します。
attribute : 検索対象の属性です。sAMAccountNameはWindowsのログイン名になります。
scope : 検索する深さを指定します。one(1階層のみ検索)またはsub(下位の階層も検索)です。
filter : 検索のLDAPフィルターです。(objectClass=*)となっているのでツリー上の全てのオブジェクトを検索します。
ここで一つ問題が出てきました。
basedn部分で、OUまで含めないとサーバエラーとなってしまう点です。つまり、OUは必ず指定しないといけません。
しかし、今回ドメイン直下には複数のOUがあり、それぞれにユーザアカウントオブジェクトがあるのです。
仮に下記のように試してみましたが、下の行の設定だけが有効になってしまう状態でした。
AuthLDAPUrl "ldap://hogesv01:389/OU=person,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPUrl "ldap://hogesv01:389/OU=devlop,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"
で、調査したところ、Trac と mod_pythonの中ほどに答えが。。。
portをActiveDirectoryのグローバルカタログ(ポート3268)にすれば、basednでOUを指定しなくてもディレクトリ全体が検索範囲になることが分かりました。(グローバルカタログはフォレスト内の全ドメインの全オブジェクトから、ひんぱんに利用する属性のみを抽出したものです。)
AuthLDAPUrlは下記のようになります。
AuthLDAPUrl "ldap://hogesv01:3268/dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDNはActiveDirectoryにアクセスするためのユーザ名です。管理者権限持ってなくもActiveDirectory内のユーザで有ればどれでもいいようです。
AuthLDAPBindPasswordで、AuthLDAPBindDNで指定したユーザのパスワードを指定します。
Requireでどのユーザに対してアクセスを許可するか設定します。(特定のユーザや特定のグループだけならAuthLDAPUrlのフィルタで設定してしまう方法も有ります)
下記にいくつかの設定例を紹介します。
Require valid-user
LDAPディレクトリ内のtest01 test02ユーザだけ許可する
Require ldap-user test01 test02
LDAPディレクトリ内のグループdev supportグループに属するユーザだけ許可する
AuthLDAPGroupAttribute member
AuthLDAPGroupAttributeIsDN on
Require ldap-group CN=dev,CN=Users,DC=hogedomain,DC=jp
Require ldap-group CN=support,CN=Users,DC=hogedomain,DC=jp
グループの識別名(DN)を取得するには、ADSI Edit が有用です。
ADSI Edit については、(ADSI)ActiveDirectoryのオブジェクトの属性をのぞきたいが参考になります。
参考:
開発リソース/Unix/Apache2でmod_auth_ldapを利用したActiveDirectoryベースの認証
The auth_ldap Module for Apache
今回はLDAPを使ってApacheからActiveDirecotryへの認証を行いましたが、KERBEROS認証やNTLM認証(winbind+samba)、SSPI、SPNEGO認証を用いる方法があるようです。(方法によってはシングルサインオンできそうですね。)
とりあえず参考になりそうなページだけリンクはっておきます。
●KERBEROS認証
Apache/認証にActiveDirectoryを使う方法
mod_auth_kerb で Basic認証を有効にする (Active Directory を使ったシングルサインオン)
●NTLM認証
Apache(Linux)に、Windowsドメイン認証を利用して、シングルサインオンを実現する詳細手順 - RX-7乗りの適当な日々
ActiveDirectoryとSUSE11.3(LINUX)上のapacheでシングルサインオンを利用する
●SSPI
ドメイン認証(mod_sspi) - なんとなく ~学習もかねて~
●SPNEGO認証