株式会社 日立製作所 満充師
RHELやCentOSで環境構築をしていると、インストールしたソフトウェアが動かなくて時間をかけて調査した結果、SELinuxが原因だったってことはよくあります。今回、このようなことでせっかくのX'masパーティに間に合わなくなる不幸を少しでも減らすためのちょっとしたノウハウを提供します。
SELinuxの概要
SELinuxの素性については他所を検索してください。ここで覚えておいて欲しいのは、「SELinuxはRHELやCentOSでは標準で有効化されているもの」であることです。なお、最初からSELinuxが動作しないように設定されているクラウドサービスなどもあります。
さて、このSELinuxは、様々なタイミングでソフトウェアの動作に介入するため、ソフトウェアの動作の邪魔と思われていますが、邪魔しているわけではなくて、許可されていない動作を行えないように止めているというのが機能的に正しい解釈です。FW(ファイアーウォール)と同じで、SELinuxは原則としてホワイトリストに掲載されているものしか動作を許可しません。SELinuxでは、このホワイトリストをセキュリティポリシーと言い、コミュニティで作成されています。
ソフトウェアが動かない場合のSELinuxの確認方法
さて、冒頭のように長時間調査をした結果の原因がSELinuxだった、ということであれば、最初からSELinuxの調査をしておけばよいということになります。OSにデフォルトで組み込まれている機能なので、トラブルシュート時のチェック対象にSELinuxを入れておくことで時間の浪費は避けられます。自分は、インストールしたソフトウェアが動作しない場合、真っ先にSELinuxがソフトウェアの動作を阻害していないか確認をしています。ここではそのチェック方法を記載します。
(1)SELinuxが動作している状態を調べて、原因となりえるか確認する
下記コマンドを実行すると、SELinuxがどのような状態で動作しているか確認できます。
# getenforce
Enforcing or Permissive or Disabled
実行結果の説明:
Enforcing: SELinuxが動作しており、セキュリティポリシーに違反していたらソフトウェアの対象動作を拒否(停止)。
Permissive: SELinuxは検証モードで動作していて、セキュリティポリシーに違反していてもソフトウェアの対象動作は止めない。
Disabled: SELinuxは動いていません。
実行した結果、PermissiveかDisabledと表示された場合は、SELinuxが原因の可能性は低いため他の原因を調査してください。Enforcingの場合は、さらにSELinuxの調査を続けます。
(2)SELinuxの動作を変更して再度テストを実施する
先ほどの調査で、Enforcingとなっている場合は、SELinuxの動作を検証モードに変更してからソフトウェアを動作させてみます。
# sudo setenforce Permissive
この変更を行った結果、ソフトウェアが正常動作した、ということであればSELinuxが原因の可能性が高いです。それでも動作しない、ということであれば他の原因の調査が必要です。
※setenforce による動作の変更はOSをリブートすると消えるので、テスト時にリブートが必要な場合は上記設定を再度実行するか、/etc/selinux/config にSELinux=permissive を設定してください。
(3)SELinuxがソフトウェアの動作を拒否しているか確認する
下記コマンドを実行することで、SELinuxが動作を拒否したものを表示することができます。startを指定しているのは、過去の関係のないログが表示されるのを抑止するためです。さらに対象のソフトウェアのプロセス、サービス名がわかっている場合は、続けてgrepすると絞り込めます。
# ausearch -m AVC --start MM/DD/YY hh:mm:ss
この結果で対象のプロセスやソフトウェア、通信などが表示されていれば、SELinuxによる拒否が発生していて、ソフトウェアの動作を止めている、ということになります。
SELinuxが原因だとして、正常に動作させるためには、それらを許可する設定を行う必要があります。許可する方法については、簡単なものから奥が深いものまで状況により様々ですので、本アドベントカレンダーの記事や、インターネット上の多くの記事を参考にしてください。
トラブラないためのSELinux利用時のお作法
では次は、SELinuxが原因でトラブルを起こすことを少しでも減らすためのノウハウです。
残念ながら、ここではSELinuxをDisabledにするといった方法は案内しません。
これでトラブルが無くなるわけでないですが、基本は以下の3つです。読んでいただければ、SELinuxでソフトウェアが動作しない原因の概要がつかめると思います。
(1) SELinuxの動作を頻繁に切り替えない
SELinuxは、ファイルやディレクトリに「タイプ」、プロセスなどは「ドメイン」という別のラベル(タグといったほうがわかりやすいでしょうか)を付けています。そして、プロセスとファイルなどの「ドメイン」と「タイプ」の組み合わせでセキュリティポリシーができています。ちなみに、「タイプ」は、ls -Zと打つと表示されます。
SELinuxがPermissive/Enforcingで動作している場合は、ソフトウェアのインストール時などに自動的にこの「タイプ」をつけてくれますが、Disabledの場合は「タイプ」をつけてくれません。なので、SELinuxの動作をDisabledにしたり、Permissive/Enforcingにしたりをむやみに繰り返すと、「タイプ」の設定がぐちゃぐちゃになり、正常な動作ができなくなります。できるだけDisabledは利用せずに、Permissiveを活用してください。もちろん、Disabledを使うときの手順もありますがここでは割愛します。
(2) mvではなくて、cpを使う
mvについては、ファイルの「タイプ」もそのままmvします。つまり、mv先に必要な「タイプ」と不整合が起きる可能性があるということです。例えば、/tmpと/var/wwwは異なる「タイプ」を持っています。よって、/tmpで作成したhttpファイルなどを/var/www へmvすると、mvしたhttpファイルは異なる「タイプ」のままになっているためhttpdはアクセスできない、ということになります。この場合は、httpファイルのタイプをhttpdがアクセスできる「タイプ」に変更する必要があります。
また、OSSのインストール手順の中で、mvの指定があったとしても、cpを使うとコピーの際に「タイプ」を変換してくれるため、このようなトラブルを防ぐことができます。
(3)できるだけOSSのデフォルトのパス/ディレクトリ構成で利用する
意外と原因となるのがOSSの標準と異なるオリジナリティのあるディレクトリ構成です。(2)の内容と同様で、ディレクトリやファイルの「タイプ」がアクセス許可されている「タイプ」でない場合は、ソフトウェアはアクセスできません。例えば、httpd.confでルートパスの/var/wwwを/home/wwwとかで設定すると、標準のセキュリティポリシーには/home/wwwの「タイプ」へのアクセス許可の記載がないため、そのままでは動作しないという結果になります。この場合、/home/wwwの「タイプ」をhttpdがアクセスできる「タイプ」に変更する必要があります。
最後に
SELinuxについての調査方法の概要と、躓く原因となりそうな内容について記載しました。これが参考となり、楽しいクリスマスと年末年始を過ごせることを期待します。なにかあったら最初にSELinuxを調査、ということを忘れないでくださいね。