VirtualDomain別のWebDAV設定を自動化

ホスティングサービスの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オプションを追加し、実行されているクエリをしらべます。

カテゴリー: Technology タグ: , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)