3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

Subversion(Apache,Linux)で認証にActiveDirectoryを使う

LinuxでSubVersionを構築しEclipse Subversive から使うではSubversionの認証としてBasic認証を使ってましたが、Windowsドメインを建てているということで、ActiveDirectoryを使って認証してみました。

環境はApache2.2 , CentOS5.5で、ドメインコントローラはWindowsServer2003です。

SubversionApacheコンポートネントとして動かしているため、普通の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のフィルタで設定してしまう方法も有ります)

下記にいくつかの設定例を紹介します。

LDAPディレクトリ内の全ユーザに許可する

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ベースの認証

LDAPによるApacheの認証と認可

The auth_ldap Module for Apache

今回はLDAPを使ってApacheからActiveDirecotryへの認証を行いましたが、KERBEROS認証やNTLM認証(winbind+samba)、SSPI、SPNEGO認証を用いる方法があるようです。(方法によってはシングルサインオンできそうですね。)

とりあえず参考になりそうなページだけリンクはっておきます。

●KERBEROS認証

Apache/認証にActiveDirectoryを使う方法

ActiveDirectoryでApacheの認証を

mod_auth_kerb で Basic認証を有効にする (Active Directory を使ったシングルサインオン)

●NTLM認証

Apache(Linux)に、Windowsドメイン認証を利用して、シングルサインオンを実現する詳細手順 - RX-7乗りの適当な日々

ActiveDirectoryとSUSE11.3(LINUX)上のapacheでシングルサインオンを利用する

Apacheで統合Windows認証を使う

●SSPI

ドメイン認証(mod_sspi) - なんとなく ~学習もかねて~

2008/01/28 日記: Microsoft セキュリティ サポート プロバイダ インターフェイス / Microsoft Security Support Providers Interface (SSPI)

Apache ベースのサーバ

●SPNEGO認証

Subversion にも SPNEGO 認証:お試しlog4

SPNEGO