Snow Leopardからmod_dav_svnが標準で入たようで、WebDAVを用いたSubversion環境を作りやすくなったっぽいので挑戦してみたメモ。
/etc/apache2/httpd.conf
のLoadModuleの最後に以下を追加。
LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so
/etc/apache2/other/subversion.conf
でmod_dav_svnの設定をする。拡張子が.confならファイル名は何でもおk。
<IfModule dav_svn_module> <Location /svn-repos> # リポジトリにアクセスする際のURL(http://mysvn.info/svn-repos)の一部になる DAV svn SVNListParentPath on SVNParentPath /doko/soko/svn/repos # リポジトリの実際のパス </Location> </IfModule>
$ sudo chown -R _www:_www /doko/soko/svn/repos
ここまでで問題なく設定出来ていれば、apacheを再起動後、チェックアウトやブラウザからリポジトリの表示が出来るようになっているはず。
現段階では、Subversionサーバにアクセス出来る人なら誰でも、無制限でリポジトリを操作出来るので要注意。
subversion.conf
を再度開き、認証に必要なの設定を追加する。
<IfModule dav_svn_module> <Location /svn-repos> DAV svn SVNListParentPath on SVNParentPath /doko/soko/svn/repos Satisfy Any # 匿名ユーザーを許可 Require valid-user # 匿名ユーザーが許可されてない操作は正規ユーザーを要求 AuthType Basic # ベーシック認証を使う AuthName "Subversion Authorization" # 認証領域の設定。設定を忘れると500エラーで小一時間苦しむことになるので注意。 AuthUserFile /doko/soko/svn/htpasswd # ベーシック認証のユーザーとパスワードファイル AuthzSVNAccessFile /doko/soko/svn/authz # リポジトリのアクセス制御情報ファイル </Location> </IfModule>
AuthUserFile
で指定したファイルにベーシック認証ユーザーを追加する。
$ sudo htpasswd -c /doko/soko/svn/htpasswd Decomo New password: Re-type new password: Adding password for user Decomo
2人目以降、つまりhtpasswdが既にある場合は-cオプションは付けない。さもないと上書きされる。
AuthzSVNAccessFile
で指定したファイルにアクセス制御情報を書く。
[groups] admins = Decomo [/] * = r [Project1:/] @admins = rw [Project2:/] @admins = rw [secret:/] Decomo = rw * =
ここからSSLに関する設定。HTTPのままで良ければ以下は設定する必要はない。
sudoだと上手く行かなかったのでsuする。
$ cd /etc/apache2/other $ su # openssl genrsa -aes256 2048 > server.key Generating RSA private key, 2048 bit long modulus ..................................................................................................+++ ..............+++ e is 65537 (0x10001) Enter pass phrase: Verifying - Enter pass phrase:
# openssl req -new -key server.key >server.csr Enter pass phrase for server.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Kanagawa Locality Name (eg, city) []:Yokohama-shi Organization Name (eg, company) [Internet Widgits Pty Ltd]:PRODUCTION KusoGA Organizational Unit Name (eg, section) []:CA Common Name (eg, YOUR name) []:ホスト名 Email Address []:メールアドレス Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: 空白 An optional company name []: 空白
# # openssl x509 -in server.csr -days 3650 -req -signkey server.key > server.crt Signature ok subject=/C=JP/ST=Kanagawa/L=Yokohama-shi/O=PRODUCTION KusoGA/OU=CA/CN=ホスト名/emailAddress=メールアドレス Getting Private key Enter pass phrase for server.key:
上記方法で生成したキーだとApacheの起動時にパスワードの入力を求められるらしいが、Mac OS Xだと何それ美味しいの状態なのでパスワードを解除しておく。
# mv server.key server.key.bak # openssl rsa -in server.key.bak -out server.key Enter pass phrase for server.key.bak: writing RSA key
subversion.conf.incにリネームし、SSLRequireSSL
を追加する。
# mv subversion.conf subversion.conf.inc # emacs subversion.conf.inc <file> <IfModule dav_svn_module> <Location /svn-repos> DAV svn SVNListParentPath on SVNParentPath /doko/soko/svn/repos SSLRequireSSL # SSLを必須にする Satisfy Any # 匿名ユーザーを許可 Require valid-user # 匿名ユーザーが許可されてない操作は正規ユーザーを要求 AuthType Basic # ベーシック認証を使う AuthName "Subversion Authorization" # 認証領域の設定。設定を忘れると500エラーで小一時間苦しむことになるので注意。 AuthUserFile /doko/soko/svn/htpasswd # ベーシック認証のユーザーとパスワードファイル AuthzSVNAccessFile /doko/soko/svn/authz # リポジトリのアクセス制御情報ファイル </Location> </IfModule> </file>
/etc/apache2/extra/にmod_ssl用の設定サンプルがあるのでコピーしておく。
$ cd /etc/apache2/other $ sudo cp ../extra/httpd-ssl.conf ./ssl.conf $ sudo mv subversion.conf subversion.conf.inc
ssl.confで必要な箇所だけ抜粋。
SSLRandomSeed startup file:/dev/urandom 512 SSLRandomSeed connect file:/dev/urandom 512 Listen 443 AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLPassPhraseDialog builtin SSLSessionCache "shmcb:/private/var/run/ssl_scache(512000)" SSLSessionCacheTimeout 300 SSLMutex "file:/private/var/run/ssl_mutex" <VirtualHost *:443> DocumentRoot "/Library/WebServer/Documents" ServerName mysvn.info:443 ServerAdmin メールアドレス ErrorLog "/private/var/log/apache2/error_log" TransferLog "/private/var/log/apache2/access_log" SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile "/private/etc/apache2/other/server.crt" SSLCertificateKeyFile "/private/etc/apache2/other/server.key" <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory "/Library/WebServer/CGI-Executables"> SSLOptions +StdEnvVars </Directory> BrowserMatch ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 CustomLog "/private/var/log/apache2/ssl_request_log" \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" Include /private/etc/apache2/other/subversion.conf.inc </VirtualHost>
<VirtualHost>
の最後でsubversion.conf.incを取り込んでSSL接続時にBasic認証を有効にするとともに、非SSL時はリポジトリにアクセス出来ないようにする。