RedmineをCentOSにSELinux(Enforcing)で

Redmine3をCentOS7にSELinux(Enforcing)でインストールしたときに非常にてこずったのでメモを残しておきます。ApacheとPassengerを使用しています。

## 基本

Redmine 3.0をCentOS 7.0にインストールする手順 | Redmine.JP Blog
http://blog.redmine.jp/articles/3_0/installation_centos/

などを参考にインストールします。でもこれはSELinuxをDisableにしたインストールです。私はどうしてもSELinuxが有効の状態でインストールしたいので、いろいろ検索しました。

私はCentOSにもSELinuxにも素人です。あまり理解していません。なので、既に常識だったり、間違ったりしているところがあるかもしれません。特にSELinuxについてはとりあえず動いたということで、正式なやり方でできていなかったりすると思います。とにかくご注意のほどよろしくお願いいたします。

## 先人の知恵

SELinuxが有効な状態でRedmineを動かす - 開発メモ
http://seeku.hateblo.jp/entry/2013/05/31/093124
SELinux 有効（enforcing）で VirtualHost を /var/www/html 配下以外でも動作させる 〜 CentOS6 | EasyRamble
http://easyramble.com/setup-virtualhost-with-selinux.html
SELinux 有効（enforcing）で Apache + Passenger のもと Rails で Redmine を動作させる 〜 CentOS6 | EasyRamble
http://easyramble.com/setup-redmine-with-selinux-on-apache-passenger.html
AmazonEC2 上に、Redmine 2.6.5 を構築したメモ(AMI有) - 謎言語使いの徒然
http://white-azalea.hatenablog.jp/entry/2015/07/04/161705

検索するとたとえば上記のようなサイトを見つけることができます。非常に参考になり、ありがたいことです。でもそれだけじゃ動かなかったんです。

## setroubleshoot-serverの導入

いろいろ探したら「setroubleshoot-server」というものをインストールするとよさそうだということに気付きました。これはSELinux Enforcingの状態で動作しなかった場合、```/var/log/messages```に「ここが引っかかっているよ」と教えてくれる便利ツールです。これをインストールすれば終わりといえば終わりなのですが、もうちょっと書いてみます。

```shell-session
# yum install setroubleshoot-server
```

## そう言えばpassengerを5.0.13にしておきます

Passengerのログ出力エージェントがSELinux(Enforcing)下では起動に失敗するようなので、passengerを5.0.13にしておきます。

```shell-session
# gem install passenger --version 5.0.13
# passenger-install-apache2-module
# vi /etc/httpd/conf.d/redmine.conf
# chcon -R -h -t httpd_sys_content_t /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.13
# chcon -R -h -t httpd_sys_script_exec_t /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.13/buildout
# setenforce 1
# service httpd restart
```

私は上記の順番ではやっていません。でも上記のようなことをやらなければならないのだと思います。

理解していない手順として

```shell-session
# export ORIG_PATH="$PATH"
# sudo -s -E
# export PATH="$ORIG_PATH"
# /usr/local/bin/ruby /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.13/bin/passenger-config --detect-apache2
```

などということもやっています。```sudo -s -E``` の-Eオプションがいまだに理解できていません。rootで作業しているのなら必要ないのかもしれません。

## あとは簡単です

Redmineにアクセスして、動作しないのであれば```/var/log/messages```を見て、その通りにSELinuxを設定するだけです。

たとえば

```shell-session
SELinux is preventing /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.13/buildout/support-binaries/PassengerAgent from block_suspend access on the capability2 Unknown.

*****  Plugin catchall (100. confidence) suggests   **************************

If you believe that PassengerAgent should be allowed block_suspend access on the Unknown capability2 by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep PassengerAgent /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
```

などという出力が出てきます。ここでは```PassengerAgent```がSELinuxに引っかかっているようなので、新しくポリシーを作ってインストールしてあげればいいことになります。作業ディレクトリを作って、```mypol```は適宜```passengeragent```などにしておくほうがいいと思います。

## 結局

```shell-session
# grep PassengerAgent /var/log/audit/audit.log | audit2allow -M passengeragent
# semodule -i passengeragent.pp
# grep ruby /var/log/audit/audit.log | audit2allow -M ruby
# semodule -i ruby.pp
# grep utils.rb:108 /var/log/audit/audit.log | audit2allow -M utils
# semodule -i utils.pp
```

で私の環境では動くようになりました。他の環境では違うかもしれないので、上記のコマンドをただ打つのではなく```/var/log/messages```への警告を参考にやってみて下さい。もちろん「先人の知恵」での```httpd```  のポリシーのインストールはやった上での話です。

## あとがき

後始末などもやっておけばいいかと思うのですが、特に何もしていません。 ```setroubleshoot-server```もそのまま残しています。

とにかくSELinuxはよくわかっていないままですので、このやり方でうまくいかなかったという方はコメントを下さると幸いです。間違いのご指摘も歓迎いたします。勉強させていただきたいと思います。