RedmineのアカウントでSubversionの認証を行う


調査したものの実案件で使うことがなくなったので、ここにまとめておきます。

[2016-05-24 追記] mod_dav_svn の設定に不備がありました。元の内容ではsvnで接続した際に svn: E195019: Redirect cycle detected for URL 'http://...' というエラーとなってしまいます。

やりたいこと

  • CentOS7 に Redmine と Subversion をインストールする
  • Subversionの認証はRedmineのユーザーアカウントで行う

環境

  • CentOS Linux release 7.1.1503 (Core)
  • Redmine 3.2
  • Subversion
  • PostgreSQL

Redmineのインストール

Redmine 3.2をCentOS 7.1にインストールする手順 | Redmine.JP Blog を参考にインストールを完了しているものとします。

Redmineの使用するSMTPサーバーをGmailにする

/var/lib/redmine/config/configuration.yml
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "smtp.gmail.com"
      authentication: :plain
      user_name: "[email protected]"
      password: "********"

  rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf

Googleアカウントの ログインとセキュリティ > 接続済みのアプリとサイト安全性の低いアプリの許可 を有効にしないとメール送信できないかもしれません。

Subversionの設定

mod_dav_svn を使用すると、Apache を通して Subversion レポジトリにアクセスすることができます。

Subversion がインストール済みか確認する

おそらく、Redmineをインストールする過程で開発ツールをインストールしているので
Subversionもインストール済みだと思われます。

念のため確認しておきます。

# yum list installed | grep subversion
subversion.x86_64                  1.7.14-10.el7                       @base    
subversion-libs.x86_64             1.7.14-10.el7                       @base 

mod_dav_svn のインストールと設定

# yum install -y mod_dav_svn

設定ファイルを修正し、subversionのレポジトリを公開する設定を追加します。
とりあえず動作確認するために、認証なしでアクセスできるようにしておきます。

/etc/httpd/conf.modules.d/10-subversion.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
LoadModule dontdothat_module  modules/mod_dontdothat.so

#Alias /svn /var/www/svn
<Location /svn>
DAV svn
SVNParentPath /var/www/svn/
</Location>

[2016-05-24 追記] Aliasをコメントアウト

レポジトリの作成

/var/www/svn にレポジトリを作成します。

# mkdir /var/www/svn
# cd /var/www/svn
# svnadmin create repo
# chown apache:apache repo

httpdを再起動

設定を有効にするために、httpdを再起動します。

# systemctl restart httpd

ブラウザから http://localhost/svn/repo にアクセスします。
repo - Revision 0: / という表示がされれば、httpでsubversionのレポジトリにアクセスできています。

Redmineのアカウントでsubversionの認証を行うように設定する

Apache の /svn にアクセスする際に基本認証をかけ、
その認証に使用するアカウントは Redmine のデータベースから参照するように設定します。

Apacheが Redmine.pm という Perlモジュールを使用するので、 mod_perl と Perlからデータベースを参照するための Perlモジュールが必要です。

mod_perlとPerlモジュールのインストール

# yum install -y epel-release
# yum install -y mod_perl
# yum install -y perl-DBI perl-DBD-Pg perl-Digest-SHA

Redmine.pmの配置

mod_perl から見える場所に Redmine.pm のリンクを貼ります。

# mkdir -p /usr/lib64/perl5/vendor_perl/Apache/Authn
# ln -s /var/lib/redmine/extra/svn/Redmine.pm /usr/lib64/perl5/vendor_perl/Apache/Authn/Redmine.pm

subversion.confの変更

/svn にアクセスがきた場合は基本認証を行うように、設定を変更します。

/etc/httpd/conf.modules.d/10-subversion.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
LoadModule dontdothat_module  modules/mod_dontdothat.so

PerlLoadModule Apache::Authn::Redmine

#Alias /svn /var/www/svn
<Location /svn>
DAV svn
SVNParentPath /var/www/svn/
AuthType Basic
AuthName "SVN Repository"
AuthUserFile /dev/null
Require valid-user

PerlAuthenHandler Apache::Authn::Redmine::authen_handler

RedmineDSN "DBI:Pg:dbname=redmine;host=localhost"
RedmineDbUser "redmine"
RedmineDbPass "********"
</Location>

[2016-05-24 追記] Aliasをコメントアウト

設定を有効にするために、httpdを再起動します。

# systemctl restart httpd

Redmineにアカウント管理用のプロジェクトを作成する

認証時に使用されるアカウントは、Subversion のパッケージ名と一致する識別子を持つプロジェクトのメンバーです。

Redmineで識別子を repo とするプロジェクトを作成し、Subversionにアクセスするユーザーをメンバーに登録します。

ブラウザから http://localhost/svn/repo にアクセスします。
基本認証のダイアログが表示され、Redmineのアカウントで認証できることを確認します。

ssh化

mod_ssl のインストール

# yum install -y mod_ssl

サーバー証明書の作成

# cd /etc/pki/tls/certs
# sed -i 's/365/3650/g' Makefile
# make server.crt
# openssl rsa -in server.key -out server.key

make 時にパスフレーズの入力を求められるので、適切に設定します。
そのままサーバー証明書をSSLに使用すると、httpdを起動するたびにパスフレーズが求められますので、パスフレーズを解除しています。

ssl.confの修正

下記の3点を修正します。

/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/pki/tls/certs/server.crt     #サーバー用証明書を指定
SSLCertificateKeyFile /etc/pki/tls/certs/server.key  #サーバー用秘密鍵を指定
DocumentRoot "/var/www/html"                         #コメント解除

httpdを再起動しておきます。

# systemctl restart httpd

Firewalldの設定変更

https のみ許可するように設定を変更します。

# firewall-cmd --zone=public --add-service=https --permanent
success
# firewall-cmd --zone=public --remove-service=http --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --zone=public --list-services
dhcpv6-client https ssh

Redmineの設定変更

設定画面にて、https を使用するように変更します。


参考