====== mod_dav_svn+mod_authz_svnでSubversionサーバの構築 ======
===== 本記事で出来るようになること =====
* httpベースでSubversionリポジトリにアクセス。
* httpベースでBASIC認証を用いてパスごとにSubversionリポジトリのアクセス制御。
* http+SSLでBASIC認証を用いてパスごとにSubversionリポジトリのアクセス制御。
===== 環境 =====
^使用ソフト | FreeBSD 9.0-BETA3 |
^::: | Apache 2.2.21 |
^::: | Subversion 1.7.0 |
^サーバ名|svnsvr|
^リポジトリパス | /doko/soko/svn/repos |
^認証系のファイル置き場 | /doko/soko/svn |
※Apache 2.4では一部変更点があるので[[#Apache 2.4 + Subversion 1.8対応]]を参照のこと。
===== インストール =====
==== Apache ====
$ sudo portinstall www/apache22
$ sudo echo 'apache22_enable="YES"' >> /etc/rc.conf
==== Subversion ====
$ sudo portinstall devel/subversion
オプションでMOD_DAV_SVNにチェックが入ってなければチェックする。
===== httpベースでSubversionリポジトリにアクセス =====
==== http.confの設定 ====
以下の記述があるか確認。無ければ追加。
LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so
==== mod_dav_svnの設定 ====
# リポジトリにアクセスする時のURL(http://svnsvr/svn-reposという風になる)
DAV svn
SVNListParentPath on
SVNParentPath /doko/soko/svn/repos # 実際のリポジトリのパス
=== 文法チェック ===
Apacheの設定を弄ったら起動前にチェックすると吉。
$ apachectl configtest
Syntax OK
==== リポジトリ所有者の変更 ====
$ sudo chown -R www:www /doko/soko/svn/repos
==== 確認 ====
Apacheを起動
$ sudo apacheclt start
して、ブラウザからリポジトリ(http://svnsvr/svn-repos/)にアクセスしてみる。設定に間違いがなければ、リポジトリのブラウズが出来るハズ。
閉じたネットワークで個人リポジトリとして使うなら、これだけでも十分かも(それならsvnserverでいいじゃん!っていうツッコミは無しで)。
===== BASIC認証を加える =====
==== subversion.confの設定 ====
必要な設定を追加する。
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 # リポジトリのアクセス制御情報ファイル
==== 正規ユーザーの追加 ====
''AuthUserFile''で指定したファイルにベーシック認証ユーザーを追加する。
$ sudo htpasswd -c /doko/soko/svn/htpasswd Decomo
New password:
Re-type new password:
Adding password for user Decomo
既にファイルがある場合、つまり2人目以降は-cオプションは付けない。さもないと新規作成扱いとなり、以前のユーザー情報が消えてしまう。
==== リポジトリへのアクセス制御設定 ====
''AuthzSVNAccessFile''で指定したファイルに、リポジトリへのアクセス制御設定を記述する。
[groups]
admins = Decomo
devels = dev1, dev2
testers = tester1, tester2
[/]
@admins = rw
* = r
[Project1:/]
@devels = rw
[Project2:/]
[Project2:/for_tester]
@tester = rw
[secret:/]
Decomo = rw
* =
この例では、
* adminsグループのメンバーはDecomo、develsグループのメンバーはdev1とdev2、testersグループのメンバーはtester1とtester2。
* 全リポジトリのデフォルト権限は、ゲストユーザーを含む全ての人が読み込み権限を、adminsグループは加えて書き込み権限を持つ。
* Project1リポジトリはdevelsグループも書き込み権限を持つ。
* Project2リポジトリの権限はデフォルトだが、/for_testerディレクトリ以下はtestersグループも書き込み可能。
* secretリポジトリはDecomoのみ読み書き可能。他人はアクセス不可。
という設定になる。
==== 確認 ====
ここまでの設定が上手くいっていれば、Apache再起動後、パスごとのアクセス制御が有効になる。
===== SSLを使うようにする =====
認証やリポジトリとのやりとりが平文で行われるのはセキュリティ上よろしくないので、SSLを用いて通信路を暗号化する。
個人用途のリポジトリなので自己証明書を使う。
==== 秘密鍵の生成 ====
秘密鍵は漏れてはならないので、ディレクトリのパーミッションに注意。
# cd /usr/local/etc/apache22/
# mkdir -m 0700 ssl.{key,crt}
# openssl genrsa -aes256 2048 > ssl.key/secret.key
Generating RSA private key, 2048 bit long modulus
.........................................+++
...............................................................+++
e is 65537 (0x10001)
Enter pass phrase:(パスワード)
Verifying - Enter pass phrase:(パスワード)
==== 証明書署名要求の生成 ====
# openssl req -new -key ssl.key/secret.key > ssl.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
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PRODUCTION KusoGA
Organizational Unit Name (eg, section) []:CA
Common Name (eg, YOUR name) []:svnsvr
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 ssl.key/server.csr -days 3650 -req -signkey ssl.key/secret.key > ssl.crt/server.crt
Signature ok
subject=/C=JP/ST=Kanagawa/L=Yokohama/O=PRODUCTION KusoGA/OU=CA/CN=svnsvr/emailAddress=メールアドレス
Getting Private key
Enter pass phrase for server.key:(秘密鍵で入力したパスワード)
==== 秘密鍵のパスワードの解除 ====
Apache起動時に秘密鍵のパスワード入力を解除する。
# openssl rsa -in ssl.key/secret.key -out ssl.key/server.nopasswd.key
Enter pass phrase for ssl.key/secret.key:(秘密鍵のパスワード)
writing RSA key
==== mod_sslの設定 ====
extraディレクトリに設定サンプルがあるのでコピー。
$ cd /usr/local/etc/apache22/Includes
$ 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:/var/run/ssl_scache(512000)"
SSLSessionCacheTimeout 300
SSLMutex "file:/var/run/ssl_mutex"
DocumentRoot "/usr/local/www/apache22/data"
ServerName svnsvr:443
ServerAdmin メールアドレス
ErrorLog "/var/log/httpd-error.log"
TransferLog "/var/log/httpd-access.log"
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl.crt/server.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl.key/server.key"
SSLOptions +StdEnvVars
SSLOptions +StdEnvVars
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/var/log/httpd-ssl_request.log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
Include /usr/local/etc/apache22/Includes/subversion.conf.inc
===== Apache 2.4 + Subversion 1.8対応 =====
Apache 2.4 + Subversion 1.8にしたら動かなくなったので修正点を殴り書き。
==== mod_dav_svn ====
/usr/ports/www/mod_dav_svn に分離されたので別途インストール。
==== httpd.conf ====
以下のモジュールが有効になっているか確認。
LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
LoadModule ssl_module libexec/apache24/mod_ssl.so
LoadModule dav_module libexec/apache24/mod_dav.so
LoadModule dav_fs_module libexec/apache24/mod_dav_fs.so
==== 220_subversion.conf ====
サードパーティ製モジュールの読み込みと設定は''/usr/local/etc/apache24/modules.d/''の中のコンフィグファイルで行うようになったっぽい。
Subversion関連の設定は''220_subversion.conf''をいじる。ファイルがなければ同じ階層にあるサンプルファイルをコピーする。
''dav_svn_module''の設定は''/usr/local/etc/apache24/Includes''の方で設定したものがそのまま使えるので、とりあえず''LoadModule''のコメントアウトを解除するだけでおk。
LoadModule dav_svn_module libexec/apache24/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache24/mod_authz_svn.so
LoadModule dontdothat_module libexec/apache24/mod_dontdothat.so
==== ssl.conf ====
**SSLMutex "file:/var/run/ssl_mutex"**を**Mutex sysvsem default**に書き換え。
~~DISCUSSION~~