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](http://blog.redmine.jp/articles/3_2/install/centos/) を参考にインストールを完了しているものとします。


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

```yaml:/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: "hogehoge@gmail.com"
      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のレポジトリを公開する設定を追加します。
とりあえず動作確認するために、認証なしでアクセスできるようにしておきます。

```conf:/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` にアクセスがきた場合は基本認証を行うように、設定を変更します。

```conf:/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点を修正します。

```conf:/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` を使用するように変更します。

![スクリーンショット 2016-05-23 18.24.04.png](https://qiita-image-store.s3.amazonaws.com/0/39362/03e571d1-094b-76a7-ef05-1ca15cb6256e.png "スクリーンショット 2016-05-23 18.24.04.png")



------

## 参考

* [Redmine 3.2をCentOS 7.1にインストールする手順 | Redmine.JP Blog](http://blog.redmine.jp/articles/3_2/install/centos/)
* [Redmineでメール通知が飛ばない時にやること | のぶろぐ](http://nob-log.info/2011/01/19/redmine%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5%E3%81%8C%E9%A3%9B%E3%81%B0%E3%81%AA%E3%81%84%E6%99%82%E3%81%AB%E3%82%84%E3%82%8B%E3%81%93%E3%81%A8/)
* [Install & Configure Apache Subversion (SVN) on CentOS 7](http://www.linuxtechi.com/install-apache-subversion-svn-centos-7/)
* [初めてRedmine環境を構築したらSCM連携で躓いた話](http://qiita.com/kota_na_/items/46faf25268953da5fd37)
* [RedmineのアカウントでSubversionリポジトリにアクセスする](http://qiita.com/n_slender/items/eb1244bbd3d6ed95ea9e)
* [Repositories access control with apache, mod_dav_svn and mod_perl](http://www.redmine.org/projects/redmine/wiki/Repositories_access_control_with_apache_mod_dav_svn_and_mod_perl)
* [PerlでPostgreSQLを使用するためにDBI,DBDをインストールする・CentOS](http://db.just4fun.biz/Perl/PostgreSQL%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%ABDBI,DBD%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%83%BBCentOS.html)
* [Webサーバー間通信内容暗号化(Apache+mod_SSL)](https://centossrv.com/apache-ssl.shtml)
* [CentOS 7.0 - ファイアウォール設定！](http://www.mk-mode.com/octopress/2014/08/09/centos-7-0-setting-of-firewall/)