よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

LDAP or File による認証 + AuthzSVNAccessFileによる認可

ApacheLDAP認証を使われている方は多いかと思います。
一般的にはLDAP認証だけ有効にしておけばよいパターンがほとんどかと思いますが、LDAPサーバもしくはActiveDirectoryにユーザが登録されていなかったり(登録できなかったり)、システム運用の都合で認証を許可したいアドレスもしくはユーザ(URL監視で利用など)が必要だったりとLDAP認証オンリーでは対応できない場合もあるかと思います。

こんな場合、どのような対応をすればよいでしょうか。

私が最初に思いついた方法は、システム運用で利用する場合ならば、ユーザ認証とアドレスによるアクセス制限のどちらかを満たすことでアクセスを許可するSatisfyディレクティブを利用し、アクセスがあるサーバのIPアドレスをAllowしておく方法です。
しかしこれではユーザ認証が必須となる場合には対応できませんね。
なおかつ、私が試した限りでは、AuthzSVNAccessFileによる認可を設定しているとSatisfyディレクティブは正常に動作しませんでした。

検証で利用したミドルウェアのバージョンは以下の通りです。

#導入時にconfigureで指定したオプションはSuvbersionとapacheの組み合わせで気をつけておくことApache2.2.9のインストールおよびSubversion1.5.2のインストールを参照してください。

apachehttpd.confに以下の設定を追記し、LDAP認証 + AuthzSVNAccessFileによる認可が正常に動作していたとします。
#ActiveDirectoryでLDAP認証を行うために、AuthLDAPBindDNディレクティブにて、ActiveDirectoryのPrincipal nameを指定しています。


DAV svn
SVNPath /var/svn/repos/test_repos

AuthType Basic
AuthName "Subversion Server for test_repos"

# Subversion認可
AuthzSVNAccessFile /var/svn/config/authorization/test_repos.authz

# LDAP認証
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPBindDN [アカウント]@hoge.jp
AuthLDAPBindPassword [パスワード]
AuthLDAPURL "ldap://[ADのアドレス]:[ポート番号]/DC=ldap,DC=hoge,DC=jp?sAMAccountName?sub"

Require valid-user

上記の設定を以下のようにSatisfyディレクティブを追加した設定にし、192.168.1.0/24からのアクセスもしくはLDAP認証をパスした場合にアクセスを許可するようにします。
太字で強調した部分を追記します。


DAV svn
SVNPath /var/svn/repos/test_repos

AuthType Basic
AuthName "Subversion Server for test_repos"

# Subversion認可
AuthzSVNAccessFile /var/svn/config/authorization/test_repos.authz

# LDAP認証
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPBindDN [アカウント]@hoge.jp
AuthLDAPBindPassword [パスワード]
AuthLDAPURL "ldap://[ADのアドレス]:[ポート番号]/DC=ldap,DC=hoge,DC=jp?sAMAccountName?sub"

Require valid-user

Allow From 192.168.1

Satisfy Any

この設定で、192.168.1.1 からアクセスしても『401 Authorization Required』が返ってき、アクセスできませんでした。

どちらにしろ、ユーザ認証が必須となる場合には対応できないので、他の方法を試してみました。
続いて試したのはタイトルにもあるとおり、LDAP認証とFile認証のマルチ認証 + AuthzSVNAccessFileによる認可です。
これは、Fileで認証を行い、Fileにユーザが登録されていない場合にLDAPサーバに問い合わせて認証を行うというものです。
#逆のパターンも可能なようです。

マルチ認証を行う前に、まずはapacheに標準で付属しているhtpasswdコマンドを利用して、ユーザーIDとパスワードを保管するファイルを生成します。
今回は、test_fileというファイルを/var/svn/config以下に生成します。ユーザID、パスワードを共にtestに設定しておきます。
ファイル生成の際にはパスワードを2回入力する必要があります。

[server]$ cd /var/svn/config
[server]$ /usr/local/apache2.2/bin/htpasswd -c ./test_file test
New password: test
Re-type new password: test
Adding password for user test

それではマルチ認証を実現するために太字で強調した部分を追記します。


DAV svn
SVNPath /var/svn/repos/test_repos

AuthType Basic
AuthName "Subversion Server for test_repos"
AuthBasicProvider file ldap

# Subversion認可
AuthzSVNAccessFile /var/svn/config/authorization/test_repos.authz

# File認証
AuthUserFile /var/svn/config/test_file

# LDAP認証
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPBindDN [アカウント]@hoge.jp
AuthLDAPBindPassword [パスワード]
AuthLDAPURL "ldap://[ADのアドレス]:[ポート番号]/DC=ldap,DC=hoge,DC=jp?sAMAccountName?sub"

Require valid-user

これでActiveDirectoryに登録されているユーザ + test ユーザで認証をパスしてアクセスできるようになります。
ちなみにテストをされる場合は、curlコマンドを利用するとブラウザを開く必要もありません。

ActiveDirectoryに登録されており、なおかつリポジトリへのアクセスも許可しているユーザであるinteruで試した結果は以下の通りです。


[server]$ curl -u test:test http://localhost/test_repos/

test_repos - Revision 2: /

test_repos - Revision 2: /
test01


Powered by Subversion version 1.5.2 (r32768).


続いて、ActiveDirectoryに登録されておらず、Fileに登録されたユーザで、なおかつリポジトリへのアクセスを許可していないユーザであるtestで試した結果は以下の通りです。

[server]$ curl -u test:test http://localhost/test_repos/



403 Forbidden

Forbidden

You don't have permission to access /test_repos/
on this server.


認証はパスしていますが、リポジトリにアクセスする権限がないと言われています。
もちろんですが、testユーザにtest_reposリポジトリにアクセスできる権限をtest_repos.authzにて与えてあげることでinteruユーザでアクセス結果と同様のものを得ることができることは確認しています。

長くなりましたが、以上のような設定にすることで LDAP or File による認証 + AuthzSVNAccessFileによる認可 を実現することができますので、一度お試しあれ。


参考