Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Unlocking Linux Security: A Deep Dive into SELinux 🛡️

2025年09月20日に「Dev.to」が公開したITニュース「Unlocking Linux Security: A Deep Dive into SELinux 🛡️」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

SELinuxはLinuxのセキュリティを強化する機能だ。ファイルやプロセスへのアクセスをシステムが厳しく管理(MAC)し、従来の自由なアクセス(DAC)では防げない不正侵入時の被害拡大を阻止する。最初は難しく感じるが、理解し設定すればシステムは格段に安全になる。

ITニュース解説

SELinuxは、Fedora、CentOS、RHELなどのRed Hat系のLinuxディストリビューションを使用していると、その存在に気づくことが多い。新しいサービスを設定したり、システムを変更したりする際に、しばしば想定外のアクセス拒否に遭遇し、「邪魔なもの」として安易に無効化されがちである。しかし、SELinuxはシステムセキュリティを大幅に強化する強力な守護者であり、その仕組みを理解することは非常に重要である。

SELinuxとは、Linuxカーネルに組み込まれたセキュリティモジュールで、強制アクセス制御(MAC)という仕組みを提供する。従来のLinuxのセキュリティモデルは任意アクセス制御(DAC)と呼ばれるもので、ファイルの所有者がそのファイルへのアクセス権限(読み取り、書き込み、実行など)を自由に設定できる。このモデルでは、rootユーザーはほとんどのDACルールを迂回し、システム上のあらゆるリソースにアクセスできる絶対的な権限を持つ。

これに対し、SELinuxが提供するMACは、より厳格なセキュリティモデルである。システム管理者が定義したセキュリティポリシーが、すべてのアクセスを強制的に管理する。この「強制」アクセス制御は、たとえrootユーザーであってもポリシーで禁止された操作は実行できないことを意味する。例えば、Webサーバーのプロセス(httpd_t)がユーザーのホームディレクトリ(user_home_t)に書き込みを行うことをポリシーが禁止している場合、ファイルのDACパーミッションが許可していても、そのアクセスは拒否される。このMACモデルは、万が一Webサーバーなどのサービスが攻撃者に乗っ取られた場合でも、その侵害されたプロセスがシステム内の他の領域、例えばユーザーデータやシステム設定ファイルなど、本来アクセスすべきではない部分に侵入するのを防ぐという点で極めて重要である。これにより、攻撃による被害の拡大を効果的に食い止めることができる。

SELinuxの核心となる概念は「セキュリティコンテキスト」、または「ラベル」と呼ばれるものである。SELinuxが有効なシステム上のすべてのファイル、ディレクトリ、プロセスは、このセキュリティコンテキストを持っている。セキュリティコンテキストは、「user:role:type:level」という形式の文字列で構成されるが、システムエンジニアの初心者が理解すべき最も重要な要素は「type(タイプ)」である。SELinuxのポリシーは、このタイプ情報に基づいて「httpd_tタイプのプロセスはhttpd_sys_content_tタイプのファイルにのみアクセスできる」といったルールを定義する。

ファイルやプロセスのセキュリティコンテキストは、多くの一般的なコマンドに「-Z」オプションを付けることで確認できる。例えば、「ls -lZ /var/www/html/index.html」と実行すると、ファイルのアクセス権限情報に加えて、「unconfined_u:object_r:httpd_sys_content_t:s0」のようなセキュリティコンテキストが表示される。この例では「httpd_sys_content_t」がそのファイルのタイプである。同様に、「ps auxZ | grep httpd」と実行すると、Webサーバープロセスのセキュリティコンテキスト(例: system_u:system_r:httpd_t:s0-s0:c0.c1023)が表示され、ここでは「httpd_t」がプロセスのタイプである。SELinuxポリシーは、この「httpd_t」タイプのプロセスが「httpd_sys_content_t」タイプのファイルを読み取れるように明示的に許可するルールを持っている。

SELinuxを扱う上で、いくつかの必須コマンドと概念がある。まず、SELinuxの状態とモードを確認することがトラブルシューティングの第一歩である。「getenforce」コマンドは、現在のSELinuxモードが「Enforcing(強制)」「Permissive(許可)」「Disabled(無効)」のいずれかを表示する。Enforcingモードは、ポリシーを厳格に適用し、違反を拒否してログに記録する最も安全な状態である。Permissiveモードでは、ポリシー違反をログに記録するが、実際のアクセスはブロックしないため、システム機能を損なわずに問題の原因を特定するのに役立つ。DisabledモードはSELinuxが完全に無効化された状態であり、通常は推奨されない。「sestatus」コマンドは、より詳細な情報、例えばロードされているポリシーの種類などを表示する。

SELinuxのモードを一時的に変更するには、「setenforce [0|1]」コマンドを使用する。「setenforce 0」でPermissiveモードへ、「setenforce 1」でEnforcingモードへ切り替わる。システムを再起動してもこの変更を永続化したい場合は、「/etc/selinux/config」ファイルを編集し、「SELINUX」変数の値を変更する必要がある。この永続的な変更は、システム再起動後に適用される。

次に、ファイルコンテキストの管理について説明する。SELinuxでよくある問題の一つが、ファイルコンテキストの誤りである。これは、ファイルを新しい場所に移動した際によく発生する。「chcon」コマンドは、ファイルやディレクトリのセキュリティコンテキストを一時的に変更する。例えば、「chcon -t httpd_sys_content_t /srv/web/my-app/index.html」と実行することで、指定されたファイルのタイプをWebサーバーがアクセス可能なものに変更できる。しかし、この変更は永続的ではなく、ファイルシステムのリラベルなどで失われる可能性がある。

ファイルコンテキストを永続的に管理する推奨される方法は、「semanage fcontext」コマンドを使用することである。このコマンドは、特定の場所にあるファイルを自動的にラベル付けするためのルールをシステムに定義する。例えば、「semanage fcontext -a -t httpd_sys_content_t "/srv/web/my-app(/.)?"」と実行することで、/srv/web/my-app ディレクトリとその配下のすべてのファイルに httpd_sys_content_t タイプを割り当てる永続的なルールを追加できる。「-a」はルールを追加することを意味し、「(/.)?」はディレクトリ自体とその中のすべてにルールが適用されることを示す。ルールを定義した後は、「restorecon」コマンドを使って、そのルールを実際にディスク上のファイルに適用する必要がある。「restorecon -Rv /srv/web/my-app/」と実行すると、/srv/web/my-app ディレクトリ内のファイルを検査し、定義されたポリシーに基づいて適切なデフォルトコンテキストに復元する。

SELinuxブール値も重要な概念である。これは、新しいポリシールールを作成したりコンパイルしたりすることなく、既存のポリシーの動作をオン/オフで切り替えることができる設定である。Webサーバーがネットワーク接続を許可するかどうかなど、特定の機能を有効または無効にするのに便利な方法である。「getsebool -a」コマンドで、すべてのブール値とその現在の状態を確認できる。「setsebool」コマンドでブール値を変更する。例えば、「setsebool httpd_can_network_connect on」と実行すると、Webサーバープロセスがネットワーク接続を行えるようになる。この変更は一時的であるため、システム再起動後も有効にするには「-P」フラグを付けて「setsebool -P httpd_can_network_connect on」のように実行する必要がある。

SELinuxによって何らかの操作がブロックされた場合、まずは監査ログを確認する。SELinuxによるアクセス拒否は、AVC(Access Vector Cache)メッセージとしてログに記録される。ほとんどのシステムでは、これらの拒否メッセージは「/var/log/audit/audit.log」ファイルに保存されている。「grep "denied" /var/log/audit/audit.log」のようにコマンドを実行することで、拒否された記録を絞り込むことができる。 「setroubleshoot-server」パッケージに含まれる「sealert」ツールは、難解なAVCメッセージを人間が読みやすい説明に変換し、解決策を提案してくれる。「sealert -a /var/log/audit/audit.log」と実行すると、すべての警告を分析し、分かりやすく表示する。 「audit2allow」は強力だが、非常に慎重に扱うべきツールである。拒否メッセージを分析し、その拒否された操作を許可する新しいポリシールールを生成する。例えば、「cat /var/log/audit/audit.log | grep "denied" | audit2allow -w」と実行すると、ログから拒否されたイベントを抽出し、そのイベントを許可するポリシーの候補を出力する。このツールは、拒否された操作が本当に許可されるべきものであると確信できる場合にのみ使用することが重要である。不用意に使用すると、セキュリティホールを作り出す可能性があるため、極めて注意深く扱う必要がある。

具体的なユースケースとして、標準ではないディレクトリからWebサイトをホストする場合、前述の「ファイルコンテキストの管理」で説明したように、ファイルコンテキストを変更し、永続的なルールを設定する必要がある。また、サービスをカスタムポートで実行する場合、SELinuxはポートにも特定のコンテキストを持っているため、そのポートを許可するルールを追加する必要がある。例えば、「semanage port -a -t ssh_port_t -p tcp 2222」と実行することで、SSHサービスが2222番ポートを使用できるようにルールを追加できる。さらに、スクリプトでタスクを自動化する際に、そのスクリプトがデフォルトのプロセスコンテキストでは許可されないリソースにアクセスする必要がある場合、スクリプトのコンテキストを変更したり、カスタムポリシーモジュールを作成したりする必要がある。例えば、バックアップスクリプトが新しいディレクトリに書き込む必要がある場合などがこれに該当する。

「semanage」コマンドは、多くのSELinuxオブジェクトを管理するための汎用的な構文を持っている。基本的な使い方は「sudo semanage <オブジェクト> -<アクション> [オプション]」である。<オブジェクト>には「fcontext」「port」「boolean」「user」「login」などが入り、<アクション>には「-a (--add)」でレコードを追加、「-d (--delete)」でレコードを削除、「-m (--modify)」で既存のレコードを変更、「-l (--list)」で特定のタイプのすべてのレコードを一覧表示する。特に便利なのが「-C (--locallist)」オプションで、「-l」と組み合わせて使用すると、デフォルトのポリシーから変更したローカルのカスタマイズのみを表示できるため、自分が行った変更を把握するのに非常に役立つ。

SELinuxは、初めて触れると複雑で扱いにくいと感じるかもしれないが、強制アクセス制御(MAC)とセキュリティコンテキストという核となる概念を理解することが、その力を引き出す鍵となる。SELinuxのステータスを確認し、ファイルコンテキストを適切に管理し、ブール値を活用し、そして監査ログを読んでトラブルシューティングを行う方法を学ぶことで、SELinuxを無効化することなく、システムのセキュリティ体制を効果的に強化し、設定できるようになる。SELinuxを「セキュリティ上の手間」と捉えるのではなく、システムの弾力性と安全性を基盤から高めるための強力なツールとして活用することで、より堅牢で安全なシステムを構築できるだろう。

関連コンテンツ

関連IT用語