はじめに
この実験では、Apache ウェブサーバーなどのサービスが必要なファイルにアクセスできるように、SELinux のファイルコンテキストを管理する方法を学びます。Security-Enhanced Linux (SELinux) が「コンテキスト」と呼ばれるセキュリティラベルをファイルに適用する仕組みや、標準的なファイル権限が正しく設定されていても、コンテキストの不一致によってアクセス拒否エラーが発生する様子を詳しく見ていきます。このハンズオン体験は、Linux 環境における一般的なセキュリティ問題のトラブルシューティングに関する実践的なスキルを構築することを目的としています。
各ステップを通じて、Apache のインストール、SELinux が enforcing モードであることの確認、正しく配置されたウェブページのデフォルトコンテキストの確認を行います。その後、不適切なコンテキストを持つファイルをウェブルートディレクトリに移動させることで、意図的に「Forbidden(閲覧禁止)」エラーを発生させます。この問題を解決するために、chcon コマンドを使用してファイルにラベルを再設定し、SELinux コンテキスト関連の問題を修正してサービス機能を回復させる基本的な手法を習得します。
Apache のインストールと SELinux の強制モードの確認
このステップでは、まず環境が正しく構成されていることを確認します。これには、Linux カーネルの重要なセキュリティモジュールである Security-Enhanced Linux (SELinux) が enforcing(強制)モードで動作しているかの確認が含まれます。その後、SELinux コンテキストの動作を実演するために使用する Apache ウェブサーバーをインストールします。
まず、SELinux のステータスを確認しましょう。詳細な概要を表示する sestatus コマンド、または現在のモードを直接回答する getenforce コマンドを使用できます。
getenforce を実行して現在のモードを確認します。
getenforce
コマンドの結果として Enforcing が返されるはずです。これは、SELinux がシステムを能動的に保護していることを意味します。
Enforcing
もし Permissive と表示された場合、SELinux は警告をログに記録しますが、アクションをブロックしません。Disabled の場合は、SELinux が完全にオフになっています。この実験では Enforcing である必要があります。この実験環境は、あらかじめ Enforcing モードに設定されています。
次に、Apache ウェブサーバーをインストールします。CentOS/RHEL 系のシステムでは httpd というパッケージ名で知られています。yum パッケージマネージャーを使用してインストールします。-y フラグは、確認のプロンプトに対して自動的に「yes」と回答するためのものです。
sudo yum -y install httpd
yum が依存関係を解決し、パッケージをインストールする様子が出力されます。インストールが成功すると、最後に「Complete!」というメッセージが表示されます。
...
Installed:
httpd-2.4.x-xx.el8.x86_64
...
Complete!
インストールが完了したら、Apache サービスを起動して実行させる必要があります。サービスの管理には systemctl を使用します。
sudo systemctl start httpd
Apache サービスが正しく動作していることを確認するために、ステータスをチェックします。
sudo systemctl status httpd
出力結果に、サービスが active (running) であることが示されているはずです。
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since ...
...
q キーを押してステータス表示を終了し、コマンドプロンプトに戻ります。これで、次のステップに進む準備が整いました。
ウェブページの作成とデフォルトの SELinux コンテキストの確認
このステップでは、簡単なウェブページを作成し、先ほどインストールした Apache サーバーを使って公開します。このプロセスを通じて、特定のポリシーで定義されたディレクトリにファイルが作成された際、SELinux がどのように適切なセキュリティコンテキストを自動的に割り当て、サービスが問題なくファイルにアクセスできるようにするかを確認します。
Apache のウェブコンテンツのデフォルトディレクトリは /var/www/html です。ここに配置されたファイルは、権限と SELinux コンテキストが正しく設定されていれば、ウェブブラウザからアクセス可能になります。
/var/www/html の直下にシンプルな index.html ファイルを作成しましょう。このディレクトリは root ユーザーが所有しているため、書き込みには sudo が必要です。標準的な sudo echo コマンドとリダイレクト (>) を組み合わせても、リダイレクト自体は権限のない現在のシェルによって処理されるため、うまくいきません。これを解決するために、sudo sh -c '...' を使用して root シェル内でコマンドを実行します。
以下のコマンドを実行してファイルを作成します。
sudo sh -c 'echo "Welcome to Apache on LabEx" > /var/www/html/index.html'
次に、ウェブサーバーがこの新しいページにアクセスして提供できるかを確認しましょう。URL を使用してデータを転送するコマンドラインツールである curl を使って、localhost にリクエストを送信します。
curl http://localhost
ターミナルに index.html ファイルの内容が表示されれば、Apache が動作しており、ファイルを読み取れていることが確認できます。
Welcome to Apache on LabEx
では、なぜこれがスムーズに動作したのでしょうか?その答えはファイルの SELinux コンテキストにあります。ファイルを作成すると、SELinux は親ディレクトリのポリシーに基づいてコンテキストを割り当てます。ls -Z コマンドを使用して、作成した index.html のコンテキストを調べてみましょう。-Z オプションは SELinux のセキュリティコンテキストを表示します。
ls -Z /var/www/html/index.html
出力は以下のようになります。
system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
この出力で最も重要な部分は、コンテキストラベルの system_u:object_r:httpd_sys_content_t:s0 です。このラベルは「ユーザー:ロール:タイプ:レベル」の 4 つの部分で構成されています。この実験では、タイプ(型)である httpd_sys_content_t に注目します。
Apache (httpd) の SELinux ポリシーでは、httpd_t タイプで動作しているプロセスが、httpd_sys_content_t ラベルの付いたファイルにアクセスすることを明示的に許可しています。ファイルを /var/www/html 内に直接作成したため、正しいデフォルトコンテキストが継承され、すべてが期待通りに動作したのです。
不適切なコンテキストを持つファイルの移動による SELinux 拒否の再現
このステップでは、不適切な SELinux コンテキストを持つファイルを Apache のウェブディレクトリに移動したときに何が起こるかを確認します。これは、mv コマンドなどのファイル操作において SELinux コンテキストがどのように扱われるかを知らないと、非常に混乱しやすい一般的なシナリオです。ディレクトリ内でファイルを直接作成する場合(親のデフォルトコンテキストを継承する)とは異なり、ファイルを移動(move)した場合は、元のコンテキストが保持されます。
まず、現在の作業ディレクトリ ~/project に新しいウェブページ page2.html を作成します。
echo "This is Page 2" > page2.html
この新しいファイルの SELinux コンテキストを確認します。ユーザーのホームプロジェクトディレクトリで作成されたため、ユーザーファイルに割り当てられるデフォルトのコンテキストが付与されます。
ls -Z page2.html
出力には、ユーザーのホームディレクトリ内のファイルに対するデフォルトである user_home_t などのコンテキストタイプが表示されます。
system_u:object_r:user_home_t:s0 page2.html
タイプが user_home_t であることに注目してください。これは、Apache がアクセスを許可されている httpd_sys_content_t とは異なります。
次に、mv コマンドを使用して、このファイルを Apache のウェブルートに移動します。移動先のディレクトリ /var/www/html は root 所有であるため、sudo が必要です。
sudo mv page2.html /var/www/html/
mv コマンドは、移動元ファイルの SELinux コンテキストを保持します。新しい場所にあるファイルのコンテキストを確認して、これを確かめてみましょう。
ls -Z /var/www/html/page2.html
見ての通り、コンテキストは変わっていません。ファイルは /var/www/html ディレクトリにありますが、依然として user_home_t のままです。
system_u:object_r:user_home_t:s0 /var/www/html/page2.html
ここで、curl を使ってこの新しいページにアクセスを試みてみましょう。コンテキストの不一致により、SELinux がアクセスをブロックします。
curl http://localhost/page2.html
サーバーから「403 Forbidden」エラーが返されます。これは伝統的なファイル権限(パーミッション)の問題ではありません。SELinux がセキュリティポリシーを強制し、httpd プロセスが user_home_t ラベルを持つファイルを読み取ることを拒否しているのです。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /page2.html
on this server.</p>
</body></html>
これは典型的な SELinux の問題を示しています。次のステップでは、ファイルのコンテキストを変更してこの問題を解決する方法を学びます。
chcon によるファイルコンテキストの修正とアクセスの確認
このステップでは、page2.html ファイルの SELinux コンテキストを手動で変更することで、前のステップで発生した「403 Forbidden」エラーを解決します。ファイルやディレクトリのセキュリティコンテキストを変更するための強力なツールである chcon (change context) コマンドを使用します。
chcon コマンドを使用すると、SELinux コンテキストのユーザー、ロール、タイプ、またはレベルを直接変更できます。この演習では、タイプのみを変更する必要があります。Apache が読み取ることができるウェブコンテンツの正しいタイプは httpd_sys_content_t です。
問題を解決するために、chcon に -t フラグを付けて page2.html の新しいタイプを指定します。ファイルは /var/www/html にあるため、コンテキストの変更には sudo を使用する必要があります。
以下のコマンドを実行して、page2.html の SELinux タイプを更新します。
sudo chcon -t httpd_sys_content_t /var/www/html/page2.html
コマンドを実行したら、コンテキストが更新されたことを確認しましょう。再度 ls -Z を使用して、ファイルのセキュリティコンテキストを検査します。
ls -Z /var/www/html/page2.html
出力では、タイプが user_home_t から httpd_sys_content_t に変更されているはずです。
system_u:object_r:httpd_sys_content_t:s0 /var/www/html/page2.html
正しい SELinux コンテキストが設定されたことで、Apache はファイルにアクセスして提供できるようになります。curl で再度リクエストを送信してテストしてみましょう。
curl http://localhost/page2.html
今度はコマンドが成功し、ウェブページの内容がターミナルに表示されるはずです。
This is Page 2
これで、SELinux 関連のアクセス問題の診断と解決に成功しました。ファイルを移動すると元のコンテキストが保持されること、そして chcon を使用してコンテキストをセキュリティポリシーに合わせて手動で調整し、Apache などのサービスにアクセスを許可する方法を学びました。なお、chcon による変更は、ファイルシステム全体のラベル再設定(relabeling)が行われると保持されない場合があることに注意してください。通常、ポリシーで定義されたデフォルトのコンテキストを適用するには restorecon コマンドが使用されます。
まとめ
この実験では、Apache ウェブサーバーにおける SELinux ファイルコンテキストの管理方法を学びました。まず、SELinux が Enforcing モードであることを確認し、httpd サービスをインストールして起動しました。Apache のウェブルート (/var/www/html) 内で直接作成されたファイルには、Apache が適切にアクセスして提供するために必要な httpd_sys_content_t コンテキストが自動的に割り当てられることを確認しました。
実験の核心部分では、不適切なファイルコンテキストがもたらす影響を実演しました。ユーザーのホームディレクトリからファイルを移動(user_home_t コンテキストを保持)することで SELinux の拒否を発生させ、「403 Forbidden」エラーを引き起こしました。その後、chcon コマンドを使用してファイルのコンテキストを正しい httpd_sys_content_t タイプに手動で変更することでこのアクセス問題を解決し、アクセスを復旧させました。これにより、SELinux の強制ポリシー下でサービスを正常に動作させるためには、正しいファイルコンテキストが不可欠であるという原則を再確認しました。



