====== 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~~