[ Redmine index ]

Redmine/PassengerをSELinux下で動かす

セキュリティが必要な環境では、SELinuxを有効にして運用することが多くなっています。Redmineを少人数のグループでローカルに使っている間はそれほど必要性はないですが、業務システムとして運用する場合やインターネット上に公開する場合など、不特定多数にさらされる場合は、SELinuxを有効にしているサーバーでの運用を求められることがあります。

現在、RedmineはApache+Passengerで動かすことが一般的ですが、PassengerはSELinuxとどうも相性が悪く、SELinux有効下で動かすのは簡単ではありません(記載日:2012/05/26)。PassengerがSELinux的には行儀が悪く、単純な設定では解決できそうにありません。

本来は、Passenger開発側で、実装しているLinuxのリソースへのアクセスをSELinuxの設定として提供するのが理想です。しかし、現時点では提供されていないので、実際にPassengerを動かして監査ログ(audit.log)を採取し、監査ログから必要なSELinux設定を生成する「現状追認」を行います。

Redmineディレクトリをhttpdからアクセス許可する

SELinuxは、プロセスがどのリソースにアクセスできるかを許可リスト(ホワイトリスト)として定義し、この定義に存在しないアクセスを排除します。許可リスト上、プロセスはドメインという識別子、リソースはタイプという識別子で指定します。

Apache+PassengerでRedmineを動かす場合、プロセスはCentOSに標準搭載されるApache(httpd)となるので、CentOSデフォルトで用意されるドメイン識別子httpd_tで指定します。

ドメインhttpd_tのプロセスがアクセスできるリソースのタイプには複数ありますが、代表的なタイプはhttpd_sys_content_tがあります。httpd_tからアクセスするファイルには、基本このhttpd_sys_content_tを指定します。

# semanage -a -t httpd_sys_content_t "/var/lib/redmine-.*(/.*)
# semanage -f -l -a -t httpd_sys_content_t "/var/lib/redmine" 

これだけでは、ポリシー指定を追加しただけなので、ファイル・ディレクトリへのタイプ反映はされません。

# restorecon -RF /var/lib/redmine-2.0.2
# restorecon -F /var/lib/redmine

ただし、これだけではPassengerが動作しません。Passenger関係の機能が/var/lib/redmine以外のリソースをアクセスしているなどによるためです。

Passengerを動かし監査ログを採取する

SELinuxには、設定上許されないアクセスを排除する"Enforcing"と、監査(アクセスの監視)はするがアクセスは排除しない"Permissive"のモードがあります。

SELinuxの設定を"Permissive"にして、監査ログの採取を開始します。なお、古いログがあると邪魔なので、ログファイルを削除します。そして、httpdを再起動します。

 # setenforce 0
 # rm /var/log/audit/audit.log
 # service auditd restart
 # service httpd restart
   :

ここで、ブラウザでRedmineにアクセスし、ログインしていろいろ操作をします。この間に、現状noSELinux設定ではアクセス違反となる監査ログがどんどん生成されます。

Redmineに対する一通りの操作が完了したら、生成された監査ログからSELinux設定を作り出します。

 $ mkdir work
 # cd work
 # grep httpd /var/log/audit/audit.log | audit2allow -M passenger
 # ls
 passenger.pp   passenger.te
 # semodule -i passenger.pp

監査ログから、audit2allowでSELinux設定ファイルを生成します。生成したら、semoduleコマンドでSELinux設定に反映します。

反映したら、SELinuxを"Enforced"にモード変更します。httpdを再起動して、一通りRedmineを操作できるか確認します。

# setenforce 1
# service httpd restart

これで、「現状追認」によるPassenger起動に必要なSELinux設定ができました。

それでもエラーになったら

もしかすると、今後実行中にSELinuxによりアクセスが排除されるような事態が発生するかもしれません。

そのときは、そのアクセスを再度上述の手順で実施します。前回のaudit.logが残っていれば、再度 setenforce 0で”Permissive"モードにしてエラーを起こした手順を再実行します。

そして、手順のとおり再度audit2allowコマンドで設定ファイルを生成し、setmodule -i で反映します。 setmodule -iは、前回設定値を入れ替え(replace)します。

もし、audit.logを消してしまっていた場合、

でSELinux設定ができるかと思います。