第1章 SELinux の使用
Security Enhanced Linux (SELinux) の基本概念を理解することで、システムのセキュリティーを強化します。SELinux のアーキテクチャー、パッケージ、および動作モードに関する知識は、システムポリシーを効果的に管理するのに役立ちます。
1.1. SELinux の概要 リンクのコピーリンクがクリップボードにコピーされました!
Security Enhanced Linux (SELinux) は、システムセキュリティーを強化する強制アクセス制御 (MAC) の実装です。SELinux は、プロセスがファイルやネットワークリソースとどのようにやり取りするかを制限するきめ細かなポリシーを適用することで、侵害されたアプリケーションの影響を軽減し、不正アクセスを防止します。
標準任意アクセス制御 (DAC) は、ユーザー、グループ、およびその他の権限に基づいてアクセスポリシーを設定します。このモデルでは、システム管理者が、特定のアプリケーションにはログファイルの閲覧のみを許可し、他のアプリケーションにはログファイルへのデータ追加を許可するなど、きめ細かなセキュリティーポリシーを作成できなくなります。
SELinux は、強制アクセス制御 (MAC) ポリシーを適用することで、保護のレイヤーを追加します。MAC ポリシーは、Web サーバーはユーザーのホームディレクトリー内のファイルにアクセスしてもよいか? などの <対象> は <オブジェクト> に対して <アクション> を実行してもよいか? という質問に答えます。すべてのプロセスおよびシステムリソースには、SELinux コンテキスト と呼ばれる特別なセキュリティーラベルがあります。SELinux コンテキスト (SELinux ラベル とも呼ばれる) は、システムレベルの詳細を抽象化し、エンティティーのセキュリティー特性に焦点を当てるための識別子です。この識別子は、SELinux ポリシー内のオブジェクトを参照するための一貫した方法を提供し、他の識別方法に見られる曖昧さを解消します。たとえば、バインドマウントを使用するシステムでは、1 つのファイルに複数の有効なパス名が存在する可能性があります。
SELinux ポリシーは、プロセスがシステムリソースにアクセスする方法を定義するルールの中で、コンテキストを使用します。デフォルトでは、ルールによって明示的にアクセスが許可されない限り、ポリシーはすべての操作を拒否します。
詳細は、selinux(8) の man ページ、および selinux-policy-doc パッケージがシステムにインストールされている場合に man -k selinux コマンドで表示される man ページを参照してください。
SELinux ポリシールールは、DAC ルールの後にチェックされます。DAC ルールがアクセスを拒否した場合、SELinux ポリシールールは評価されず、SELinux によるアクセス拒否はログに記録されません。
SELinux のコンテキストには、ユーザー、ロール、タイプ、セキュリティーレベルの 4 つのフィールドがあります。SELinux ポリシーにおいて最も重要なのはタイプフィールドです。理由は、プロセスとリソース間の許可される操作を定義する際、一般的なポリシールールではコンテキスト全体ではなく、このタイプが判断基準として用いられるからです。SELinux のタイプの名前は、最後に _t が付きます。たとえば、Web サーバーのタイプコンテキストは httpd_t です。/var/www/html/ 内のファイルとディレクトリーは httpd_sys_content_t タイプを、/tmp および /var/tmp/ 内のファイルとディレクトリーは tmp_t を使用します。Web サーバーポートのタイプは http_port_t です。
Apache (httpd_t として実行する Web サーバープロセス) を許可するポリシールールがあります。このルールでは、通常 /var/www/html/ にあるコンテキストを持つファイルおよびディレクトリーと、その他の Web サーバーディレクトリー (httpd_sys_content_t) へのアクセスを許可します。通常、/tmp および /var/tmp/ にあるファイルに対する許可ルールはポリシーにないため、アクセスは許可されません。SELinux を使用すれば、Apache が危険にさらされ、悪意のあるスクリプトがアクセスを得た場合でも、/tmp ディレクトリーにアクセスすることはできなくなります。
図1.1 Apache と MariaDB を安全に実行するのに SELinux がどのように役立つかの例
前述の図が示すように、SELinux は httpd_t として実行されている Apache プロセスが /var/www/html/ ディレクトリーにアクセスすることを許可しますが、httpd_t および mysqld_db_t タイプのコンテキストに対して許可ルールが存在しないため、/data/mysql/ へのアクセスを拒否します。逆に、mysqld_t として実行されている MariaDB プロセスは /data/mysql/ にアクセスできますが、httpd_sys_content_t とラベル付けされている /var/www/html/ へのアクセスは拒否されます。