ホスティングサービスのftpアカウントサービスのようなものを、ftpの代わりにWebDAVで実装できないかいろいろ試してみたところ、出来たのでまとめておく。
やりたいことは、「/webdav/{VirtualHost名}/」でサーバにアクセスすると、DBに保存してあるVirtualHostに対応したBasic認証のID/PWでログインでき、他のディレクトリは参照出来ないというもの。
厄介なのはmod_vhostsを使ってVirtualHost設定を自動化していたため、「%v」でVirtualHostが取れない点。
以下はCentOS5.5の環境で、mod_vhostsとmod_davとmod_auth_mysqlを組み合わせた場合の手順になります。
[code]
# yum install mod_auth_mysql
# vi /etc/httpd/conf.d/webdav.conf
<Location /webdav/>
Dav On
Order deny,allow
Deny from all
### 管理用サーバのIPからは、一覧表示を許可
Allow from 192.168.11.100
</Location>
<LocationMatch /webdav/*/>
### Basic認証もしくは、管理用サーバのIPからのみ許可。
Satisfy any
AuthName "Please enter your ID and password"
AuthType Basic
equire valid-user
AuthMySQLSocket /var/lib/mysql/mysql.sock
AuthMySQLUser apacheuser
AuthMySQLPassword apachepass
AuthMySQLDB auth
AuthMySQLNameField user_name
AuthMySQLPasswordField user_passwd
AuthMySQLUserTable users
AuthMySQLUserCondition "’%U’ REGEXP CONCAT(‘^/webdav/’,virtual_domain,’/’)"
AuthMySQLNoPasswd Off
AuthMySQLPwEncryption none
AuthMySQLEnable On
</LocationMatch>
[/code]
Apacheを再起動して設定を読み込み、後はユーザー情報を保存するDBを作成する。
[code]
# mysqladmin create auth -p
# mysql -u root -p auth
CREATE TABLE users (
user_name CHAR(30) NOT NULL,
user_passwd CHAR(20) NOT NULL,
virtual_domain CHAR(64) NOT NULL,
PRIMARY KEY (user_name, virtual_domain)
);
GRANT SELECT ON auth.users TO apacheuser IDENTIFIED BY ‘apachepass’;
GRANT SELECT ON auth.users TO <a href="mailto:’apacheuser’@’localhost’">’apacheuser’@’localhost'</a> IDENTIFIED BY ‘apachepass’;
FLUSH PRIVILEGES ;
[/code]
そして以下のようにして、アカウントを登録する。
[code]
INSERT INTO users (user_name, user_passwd, virtual_domain) VALUES (‘admin’, ‘testadmin’, ‘www.sample.com’);
INSERT INTO users (user_name, user_passwd, virtual_domain) VALUES (‘admin2’, ‘testadmin2’, ‘www2.sample.com’);
[/code]
動かないときは、my.cnfにlogオプションを追加し、実行されているクエリをしらべます。