SELinuxはSecurity-Enhanced Linuxの略で、Linuxのセキュリティモジュール(セキュリティ強化用のプログラム)です。
しかし、効果や使い方が分かりづらいからか、まず最初にSELinuxを無効化するような解説記事が多いです。
このサイトの記事はSELinuxを使う前提の解説を行っていますが、ここで一度SELinuxの意義や仕組みについて説明したいと思います。
この記事で行うこと
1. SELinuxの意義
セキュリティ強化と聞くと多くの人が思い浮かべるのは「外部からの侵入を阻止する」「ウィルスを検知して隔離・削除する」というものかと思います。
前者はファイアウォールですし、後者はアンチウィルスソフト(ウィルス対策ソフト)ですね。
SELinuxはこのどちらでもありません。
SELinuxが行うのは万が一侵入された際に侵入者が動き回れる範囲を制限するものです。
要塞で例えると、ファイアウォールは出入り口の検問、アンチウィルスソフトは要塞の巡回、SELinuxは隔壁といったところです。
これによってサーバに侵入された場合でも被害を最小限に留めることが出来ます。
2. SELinuxの仕組み
ではどうやってSELinuxは侵入者の行動を制限出来るのかというと、これは厳密な権限管理を行うことで実現しています。
Linuxの権限管理と言えば、ファイルやディレクトリごとに所有者と所有グループが決められていて所有者・所有グループ・その他でそれぞれファイルのアクセス権限が割り振られている形です。
しかし、例えばroot権限で動かしているWebサーバ(nginxなど)が乗っ取られた場合そのWebサーバを改変することでサーバが完全に掌握されかねません。(そもそもWebサーバをrootで動かすなという話ではありますが)
しかし、SELinuxが動いているとroot権限で動いていてもWebサーバの実行に関係のないもの、例えばメールにアクセスしようとするとSELinuxが止めてくれます。
これによってWebサーバが乗っ取られても被害はWebサーバだけに抑えられるのです。
まあ、SELinuxが動いていてもrootでSSHにアクセスされてしまうとどうしようも無いのですが……
3. コンテキストとは
では、SELinuxはどうやってプログラムとファイルの関係を見分けているのでしょうか。
これにはコンテキストというものが関わってきます。
コンテキストは日本語に訳すと文脈や状況といった言葉になります。
SELinuxではプロセス(プログラム)やユーザ、ポート、ファイルといったあらゆるものにコンテキストという情報を付与します。
コンテキストにはユーザ・ロール・タイプという3つの種類があります。ただ、デフォルトに近い設定では、使われるのはほぼタイプのみです。
そして、そのコンテキストに基づいてプロセスがファイルにアクセス出来るかといった判断を行います。
例えば、Webサーバであるnginxは httpd_t
というタイプが付与されています。この httpd_t
はWebサーバに付与されるタイプです。
nginxは httpd_t
というタイプを持つため httpd_sys_content_t
というタイプを持つファイルを読み取る事が出来ます。
httpd_sys_content_t
は静的なWebコンテンツ(Webサーバによって書き換えられる事のないWebコンテンツ)のファイルやディレクトリに付与されるタイプです。Webサーバによって書き換えられる事の無いファイルなのでnginxはこのファイルを書き換えることは出来ません。
また、 mail_spool_t
というメールの受信箱や受信メールに付与されるタイプが存在しますが、当然Webサーバとメールには何の関連性も無いので、 http_t
のタイプを持つnginxは mail_spool_t
のタイプを持つファイルやディレクトリには全くアクセス出来ません。
このように、SELinuxは主にプロセスとプロセスがアクセスしようとするファイル・ディレクトリのタイプを比べてアクセスの可否を判断しています。
4. SELinux設定変更の考え方
SELinuxによって妨げられている動作を行えるようにするためには以下の4つの方法があります。
- ファイルのコンテキストを変更する
そのファイルにアクセスしたいプロセスに合わせてファイルやディレクトリなどのコンテキストを変更する方法です。よく用いられる方法となります。 - プロセスのコンテキストを変更する
アクセスしたいファイルに合わせてプロセス側のコンテキストを変更する方法です。自分でビルドしたソフトウェアなどでは用いることもありますが、dnfなどで管理しているソフトウェアの場合は別の不都合を生じる可能性があるので他の方法を検討するのが賢明です。 - ファイルとコンテキストのルールを変更する
例えば、前述のWebサーバのタイプhttpd_t
が本来は静的なコンテンツでWebサーバは書き換え不可能なhttpd_sys_content_t
タイプを書き換えられるようにするといった具合にルールを追加する方法です。しかし、この方法はツールをインストールする必要があるなど面倒な上に、変更した部分を把握しておかないと後々に躓く原因となりかねません。これは最後の手段と言うべきでしょう。 - ブール値を変更する
SELinuxにはよく使われる設定を簡単にオンオフできるようにされています。例えばhttpd_unified
という設定をオンにするとWebサーバのタイプhttpd_t
がhttpd_
で始まるタイプのファイルへ自由にアクセス出来るようになります。これによって、手動でルール変更を行わなくてもWebサーバがhttpd_sys_content_t
タイプを書き換えられるようにできるようになります。
基本的には1と4の方法で使いたいソフトウェアが妨げられないように設定を行っていきます。
3の方法は最後の手段です。煩雑なのでこのサイトでは触れません。(いつか触れる事もあるかもしれませんが)
2の方法は自分でビルドしたソフトウェアでは真っ先に行うべき設定ですが、逆にdnfなどで管理されているソフトについてはまず行いません。
まとめ
今回はLinuxの概要と変更の考え方について説明しました。
次回は実際に変更を行うためのコマンドを説明したいと思います。