立ちはだかるSELinuxの壁。。
Linuxを始めた人が最初にぶち当たる壁、SELinux。
インターネットで調べると、とりあえず
setenforce permissive
コマンドを実行して無効化しておけば良い、というような解説も見当たったりするのですが、当然何かの理由があって存在するしろもの。わかんないからとりあえず無効化しておけば良い、というものではないはずです。
それでは、SELinuxとはそもそも何なのでしょうか。
SELinux
SELinuxはSecurity-Enhanced Linuxの省略形で、Linuxに搭載されたアクセス制御機能のことです。
セキュリティに関わる機能なのですね。
セキュリティ機能といえばLinuxではお馴染みの『パーミッション設定』があります。 これはユーザや、ユーザが所属するグループに対して、アクセスできるファイルの権限を設定するものです。
一方でSELinuxは、動作するプロセス(プログラム)に対して、アクセスできるファイルの権限を設定します。
SELinuxの設定手順
正しく設定しているはずなのに、プログラムが動かない。それはひょっとしたらSELinuxによってアクセスが制限されているからかもしれません。
そんなときは次の手順で必要なアクセス許可を設定しましょう。
-
SELinuxの状態を知る
getenforceコマンドを実行します。 戻り値が”enforcing”なら SELinuxは有効状態です。 それ以外の値の場合はSELinuxは無効状態ですので、プログラムが動作しない原因とSELinuxは無関係です。aa -
SELinuxを一時的に無効にしてみる
下記コマンドでSELinuxを一時的に無効することで、プログラムが動作するか確認します。 setenforce permissive 一時的に無効にしても、プログラムが動作しない場合は、その原因とSELinuxは無関係です。 下記コマンドを実行して、SELinuxを有効に戻しておきましょう。 setenforce enforcing これでプログラムが動作するようになれば、プログラムの動作を妨げているのはSELinuxです。 一時的に無効にしたまま、次の工程に移ります。 -
audit.logを確認する
SELinuxのアクセス制御結果は /var/log/audit/audit.logに出力されます。 プログラムを動作させてみて、audit.logにどのようなログが出力されているか確認しましょう。 もしtelnetやsshで接続していて2窓開けることができるのであれば、片方で tailf /var/log/audit/audit.log コマンドを実行した状態で、もう一方の窓でプログラムを動作させるとわかりやすいかもしれません。 ログの例: type=AVC msg=audit(1474171675.373:45152): avc: denied { open } for pid=29938 comm=”httpd” path=”/etc/httpd/conf/.h tdigest” dev=”dm-0″ ino=403956464 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_tmp_t:s0 tclass=file -
ログから許可する内容を確認する
上記のログの内容のうち、次に着目します。 denied { open } ファイルのオープンを拒否された。 path=”/etc/httpd/conf/.htdigest” アクセスを拒否されたファイル scontext=system_u:system_r:httpd_t:s0 httpd_tドメイン (プロセスが所属するドメイングループ) tcontext=unconfined_u:object_r:user_tmp_t:s0 user_tmp_tタイプ (ファイルが所属するタイプグループ) tclass=file ファイルクラスfile この場合、httpd_tドメインはuser_tmp_tタイプにアクセスすることを許可されていないのでエラーが発生している状態となる。 そのため、.htdigestファイルのタイプを変更することにする。 -
ファイルタイプの変更
chcon -t httpd_sys_content_t /etc/httpd/conf/.htdigest