ASP.NETとSELinuxの関係
ASP.NET再び
ファイアウォールの設定方法が間違っていて、再起動で元に戻ってしまう状況にあったので、HTTP接続を改めてみると、今度はASP.NETが起動不能に。 次から次へとトラブルが続出します…。
あ、ちなみに「wiz-code.private」というドメインはLAN内のプライベートDNSサーバーに設定してます。 Windowsの場合、%windir%\System32\drivers\etc\hosts ファイルに、IPアドレスとホスト名のペアを登録することで、同様のアクセス方法が可能になります。
ASP.NETが起動しない原因はすぐに見当がつきました。 SELinuxです。 setenforceコマンドで停止させて接続してみると、ちゃんと動作します。
# setenforce 0
SELinuxとは
正式には"Security-Enhanced Linux"という名称。 Linuxには、ファイルごとのアクセス権限(パーミッション)があります。 しかし、root権限を取られてしまうとすべてのファイルにアクセスが可能になってしまいます。 そこで、プロセスレベルでアクセスを制限する手段として、SELinuxが開発・導入されたようです。 wiz.も正確に理解できていませんが、おおまかにまとめると「プロセスごとにアクセスできるリソース(ファイルやネットワークなど)を制限する」ということのようです。
PHPはSELinuxの影響を受けずに動作しています。 恐らく、PHPはApacheのプロセス内で処理されているからでしょう。 対するASP.NETは、XSPという別プロセス(外部モジュール?)で処理されているため、SELinuxの制限に引っかかっているのだと考えられます。
SELinuxは先ほどの「setenforce」コマンドで停止させることができますが、再起動すると元の稼働状態に戻ります。 このままだと、システムを再起動するたびにsetenforceコマンドを実行しなければならないので、なんとかしないといけません。 方法としては2つ。
- SELinuxを完全無効化(再起動しても稼働しないように)する
- ASP.NETに関わる部分をSELinuxの制限から除外する
SELinuxを完全に無効化させてしまうのは、セキュリティを下げることになるので、今回はSELinuxの制御を部分的に除外して、ASP.NETが稼働できるようにする方法で解決を目指します。
SELinuxで特定の制限を解除
アプリケーションの「諸ツール」の中に、「SELinux Troubleshooter」というGUIアプリケーションがあったので起動。 "mono-sgen"が通知されています。
さらに「トラブルシュート」というボタンを押すと問題を解決する方法を教えてくれます。 自動翻訳のためか、日本語が若干乱れていますが、setsebootコマンドでhttpd_execmemの設定を変更する方法が提示されています。
setseboolコマンドは、SELinuxの制限方法を決める規則「ポリシー」のON/OFFを切り替えるコマンドだそうです。
httpd_execmemについては、Red Hatの公式ドキュメントに説明がありました。
- httpd_execmem
- このブール値を有効にすると、 httpd が実行可能かつ書き込み可能なメモリーアドレスを必要とするプログラムを実行できるようになります。 バッファのオーバーフローに対する保護が低下するため、安全面からはこのブール値の有効化は推奨されません。 ただし、特定のモジュールやアプリケーションではこの権限を必要とするものもあります (Java や Mono アプリケーションなど)。
どんぴしゃでMonoアプリケーションが例として挙げられていますね。 「安全面からはこのブール値の有効化は推奨されません。」と言われましても、これを有効にしないとASP.NETが動かないのならば仕方ありません。 というわけで、setsebootコマンドを実行してみましょう。 その前に、無効化してしまったSELinuxの設定を元に戻します。
# setenforce 1 # setsebool -P httpd_execmem 1 # getenforce Enforcing
SELinuxが有効な状態であることを確認。 ブラウザでASP.NETのページを開いてみます。
今度はエラー無く表示されました。
影響の範囲は…
今回はASP.NETでSELinuxの影響が発生しましたが、FTPやXMailなど、他のサービスにも影響があると思われます。 特に、XMailはSELinuxのような機構が組み込まれる前のソフトウェアですから、顕著に現れるかもしれません。
パーミッションやソフトウェアの設定が正しく、それでもファイルやネットワークのアクセスに失敗するときは、SELinuxの影響を疑ってみる必要がありそうです。
この章のまとめ
- SELinuxはプロセス単位にリソースへのアクセスを制限する。
- SELinux Troubleshootは、制限されたアクセスを解決する方法を提示してくれる。
- setseboolコマンド:SELinuxポリシーの有効・無効を設定する。