このステップでは、Apache を非標準ディレクトリから Web コンテンツを提供し、その SELinux ファイルコンテキストを管理するように設定する方法を学びます。デフォルトでは、SELinux ポリシーは Apache(httpd)を特定のディレクトリ(主に/var/www/html)からのみファイルを提供するように制限しています。Web コンテンツを別の場所に配置すると、ファイルシステムのアクセス許可が正しくても、SELinux は Apache がそれにアクセスするのを防ぎます。ここで SELinux ファイルコンテキストが重要になります。
SELinux ファイルコンテキストは、ファイルのセキュリティ属性を定義するファイルまたはディレクトリに適用されるラベルです。Apache がカスタムの場所からコンテンツを提供するには、その場所とその内容が正しい SELinux コンテキスト(通常はhttpd_sys_content_t)を持っている必要があります。semanage fcontextを使用して永続的なルールを定義し、restoreconを使用してそれを適用します。
-
Apache HTTP サーバーをインストールします。
dnfパッケージマネージャーを使用して、httpdパッケージをインストールします。
sudo dnf install -y httpd
httpdパッケージとその依存関係が正常にインストールされたことを示す出力が表示されるはずです。
-
Web コンテンツ用のカスタムディレクトリとindex.htmlファイルを作成します。
/customという名前の新しいディレクトリを作成し、その中に単純なindex.htmlファイルを配置します。これが、非標準の Web ドキュメントルートになります。
sudo mkdir /custom
echo 'This is custom web content.' | sudo tee /custom/index.html
index.htmlファイルの内容を確認します。
cat /custom/index.html
This is custom web content.
-
新しいドキュメントルートを使用するように Apache を設定します。
Apache のメイン設定ファイルは/etc/httpd/conf/httpd.confです。このファイルを編集して、デフォルトの/var/www/htmlではなく、新しい/customディレクトリを指すように Apache を設定する必要があります。
nanoを使用して設定ファイルを開きます。
sudo nano /etc/httpd/conf/httpd.conf
エディタ内で、DocumentRoot "/var/www/html"と<Directory "/var/www/html">という行を見つけます。/var/www/htmlのすべての出現箇所を/customに変更します。
変更後の関連セクションは次のようになります。
#
## DocumentRoot: The directory out of which you will serve your
## documents. By default, all requests are taken from this directory, but
## symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/custom"
#
## Relax access to content within /var/www.
#
<Directory "/custom">
AllowOverride None
## Allow open access:
Require all granted
</Directory>
ファイルを保存して終了します(Ctrl+X、Y、Enter)。
-
Apache Web サービスを開始して有効にします。
設定を変更した後、httpdサービスを開始する必要があります。コンテナ環境にいるため、systemctlは利用できません。httpdを直接開始します。
sudo /usr/sbin/httpd -DFOREGROUND &
&記号は、コマンドをバックグラウンドで実行し、ターミナルを使い続けることができます。Apache が起動していることを示す次のような出力が表示されるはずです。
[1] 5094
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::216:3eff:fe00:63b%eth0. Set the 'ServerName' directive globally to suppress this message
注: サーバーの完全修飾ドメイン名に関する警告メッセージは、この実験(Lab)環境では正常であり、安全に無視できます。
Apache が実行されていることを確認するには、httpdプロセスを確認できます。
ps aux | grep httpd
いくつかのhttpdプロセスが実行されているはずです。
root ... /usr/sbin/httpd -DFOREGROUND
apache ... /usr/sbin/httpd -DFOREGROUND
...output omitted...
-
Web ページへのアクセスを試みます。
次に、curlを使用して Web ページにアクセスしてみます。同じマシン上にあるため、localhostを使用できます。
curl http://localhost/index.html
注: この特定の環境では、root_tコンテキストでも Web ページにアクセスできる場合があります。これは、SELinux が適用されている間、root_tコンテキストが予想よりも広いアクセス許可を持っている可能性があることを示しています。ただし、セキュリティのベストプラクティスと適切な SELinux 設定のために、Web コンテンツは引き続き適切なhttpd_sys_content_tコンテキストを使用する必要があります。
This is custom web content.
-
カスタムディレクトリの現在の SELinux コンテキストを確認します。
ls -Zコマンドを使用して、/customディレクトリとindex.htmlファイルの SELinux コンテキストを表示します。
ls -Zd /custom /custom/index.html
それらがroot_tコンテキストを持っていることに気付くでしょう。これは、Apache Web コンテンツに推奨されるコンテキストではありません。
system_u:object_r:root_t:s0 /custom
system_u:object_r:root_t:s0 /custom/index.html
これをデフォルトの Apache ドキュメントルートと比較します。
ls -Zd /var/www/html
/var/www/htmlがhttpd_sys_content_tコンテキストを持っていることがわかります。これは、カスタムディレクトリに適用する必要があるコンテキストです。
system_u:object_r:httpd_sys_content_t:s0 /var/www/html
-
/customの永続的な SELinux ファイルコンテキストルールを定義します。
semanage fcontextコマンドは、SELinux ファイルコンテキストマッピングルールを管理するために使用されます。-aオプションは新しいルールを追加し、-tはターゲットタイプを指定し、正規表現'/custom(/.*)?'は/customディレクトリ自体と、その中のすべてのファイルとサブディレクトリに一致します。
sudo semanage fcontext -a -t httpd_sys_content_t '/custom(/.*)?'
このコマンドは、SELinux ポリシーにルールを追加しますが、既存のファイルのコンテキストをすぐに変更するわけではありません。
-
新しい SELinux コンテキストをファイルに適用します。
restoreconコマンドは、ファイルとディレクトリの SELinux コンテキストを、ポリシーで定義されているデフォルト値に復元するために使用されます。-Rオプションは変更を再帰的に適用し、-vは詳細出力を提供します。
sudo restorecon -Rv /custom
/customと/custom/index.htmlのコンテキストが再ラベル付けされたことを示す出力が表示されるはずです。
Relabeled /custom from system_u:object_r:root_t:s0 to system_u:object_r:httpd_sys_content_t:s0
Relabeled /custom/index.html from system_u:object_r:root_t:s0 to system_u:object_r:httpd_sys_content_t:s0
ls -Zを使用して、コンテキストをもう一度確認します。
ls -Zd /custom /custom/index.html
これで、httpd_sys_content_tコンテキストを持っているはずです。
system_u:object_r:httpd_sys_content_t:s0 /custom
system_u:object_r:httpd_sys_content_t:s0 /custom/index.html
-
Web ページに再度アクセスします。
SELinux コンテキストが正しく設定されたので、curlを使用して Web ページに再度アクセスしてみます。
curl http://localhost/index.html
これで、index.htmlファイルの内容が表示されるはずです。
This is custom web content.
最後に、Apache HTTP サーバープロセスを停止します。
sudo pkill httpd
httpdプロセスが実行されていないことを確認します。
ps aux | grep httpd
grepプロセス自体のみが表示されるはずです。
labex ... grep httpd