はじめに
実際のシステム管理業務において、単一のコマンドで解決する問題は稀です。サービスが失敗する原因は、ユニットが非アクティブであること、サービスユーザーがコンテンツを読み取れないこと、SELinux ラベルが不完全であること、あるいはファイアウォールが必要なポートを許可していないことなど、多岐にわたります。
この実験では、準備された Web サービスホストを修復します。このサービスは labex ユーザーとして実行され、/srv/rhcsa-review/site からコンテンツを提供し、127.0.0.1:18082 でリッスンし、起動時に有効化され、適切な SELinux ラベルを持ち、firewalld を通じて 18082/tcp を公開するように設定する必要があります。
サービス障害の再現と診断
このステップでは、サービス障害を再現し、変更を加える前に証拠を調査します。まずは systemctl と journalctl を使用し、ログメッセージとファイルパーミッションを照らし合わせます。
セットアップにより、public ゾーンでは SSH と 3002/tcp を使用する LabEx ブラウザーターミナルへのアクセスが永続的に許可されています。アプリケーションのファイアウォールポリシーを変更する際も、これらの管理用ルールは維持してください。
プロジェクトディレクトリに移動します。
cd /home/labex/project
準備されたサービスを確認します。サービスは存在しますが、まだ実行されていません。
systemctl status rhcsa-review-web.service --no-pager || true
サービスを起動してみます。サービスは labex ユーザーとして実行されますが、そのユーザーがコンテンツディレクトリにアクセスできないため、失敗するはずです。
sudo systemctl start rhcsa-review-web.service || echo "service start failed as expected"
sleep 1
systemd によってユニットが失敗状態としてマークされたかを確認します。
systemctl is-failed rhcsa-review-web.service || true
最新のサービスログエントリを読み取ります。ジャーナルには、サービスアカウントが設定された作業ディレクトリやコンテンツパスを使用できていないことが示されているはずです。
sudo journalctl -u rhcsa-review-web.service -n 20 --no-pager
コンテンツパスのパーミッションを調査します。
sudo stat -c '%a %U:%G %n' /srv/rhcsa-review /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
コンテンツパーミッションの修復
このステップでは、コンテンツを誰でも読み取れる状態(world-readable)にすることなく、サービスアカウントが読み取れるように修正します。サービスはユーザー labex およびグループ labex として実行されます。
ディレクトリツリーのグループを labex に設定します。サービスは labex グループで実行されるため、グループ所有権を変更することで、サービスユーザー自身がファイルの所有者でなくてもアクセス権を付与できます。
sudo chown root:labex /srv/rhcsa-review /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
グループがディレクトリをトラバースし、コンテンツファイルを読み取れるようにします。ディレクトリにはトラバース用の実行ビットが必要であり、HTML ファイルにはサービスが提供するための読み取りビットが必要です。
sudo chmod 750 /srv/rhcsa-review /srv/rhcsa-review/site
sudo chmod 640 /srv/rhcsa-review/site/index.html
修復されたパーミッションを確認します。
sudo stat -c '%a %U:%G %n' /srv/rhcsa-review /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
失敗状態をリセットし、サービスを再起動します。reset-failed は古い失敗マーカーを削除し、パーミッション修復後の systemctl の状態を読み取りやすくします。
sudo systemctl reset-failed rhcsa-review-web.service
sudo systemctl start rhcsa-review-web.service
sleep 1
サービスがアクティブになり、コンテンツが提供されていることを確認します。
systemctl is-active rhcsa-review-web.service
curl -s http://127.0.0.1:18082/
サービスの永続化
このステップでは、修復したサービスを起動時に開始するように有効化します。次回の起動までしか動作しないサービスは、完全な修復とは言えません。
ユニットを有効化します。起動(start)は現在のセッションを修正しますが、有効化(enable)は修復されたサービスが通常のブートターゲットで自動的に開始されるように記録します。
sudo systemctl enable rhcsa-review-web.service
有効化状態を確認します。
systemctl is-enabled rhcsa-review-web.service
サービスを再起動し、パーミッション修復後にユニットが正常に開始できることを確認します。クリーンな再起動は、単に実行中のプロセスを確認するよりも強力な証拠となります。
sudo systemctl restart rhcsa-review-web.service
sleep 1
サービスを再度テストします。
systemctl is-active rhcsa-review-web.service
curl -s http://127.0.0.1:18082/
SELinux コンテキストとポートラベルの追加
このステップでは、SELinux ポリシーのメタデータをサービス設計に適合させます。単純なデモサービスであればコンテンツを読み取れる場合でも、RHCSA スタイルの Web サービス修復には、永続的なファイルコンテキストとポートラベルの設定を含める必要があります。
サービスコンテンツに対して、永続的な HTTP コンテンツコンテキストルールを追加します。fcontext ルールは永続的なポリシーメタデータであり、リラベル後にこのパスがどのラベルを受け取るべきかを SELinux に伝えます。
sudo semanage fcontext -a -t httpd_sys_content_t '/srv/rhcsa-review/site(/.*)?'
既存のファイルにルールを適用します。restorecon は永続的なルールを読み取り、既存のファイルに正しいラベルを適用します。
sudo restorecon -Rv /srv/rhcsa-review/site
カスタムルールと結果のラベルを調査します。
sudo semanage fcontext -l | grep '/srv/rhcsa-review/site'
ls -Zd /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
サービスポートを HTTP ポートタイプに追加します。ポートラベルにより、SELinux ポリシーは TCP 18082 が HTTP スタイルのサービストラフィック用であることを理解できるようになります。
sudo semanage port -a -t http_port_t -p tcp 18082
HTTP ポートラベルを調査します。
sudo semanage port -l | grep '^http_port_t'
ファイアウォールの開放とエンドツーエンドの検証
このステップでは、firewalld を通じてサービスポートを公開し、最終的な監査を実行します。サービスはアクティブかつ有効化され、ラベルが正しく設定され、ホストのファイアウォールによって許可されている必要があります。
firewalld を開始し、有効化します。
sudo systemctl enable --now firewalld
サービスポートを永続的に追加し、ファイアウォールをリロードします。永続的なルールは firewalld のリロード後も保持され、リロードによってアクティブなファイアウォールにルールが適用されます。
sudo firewall-cmd --permanent --add-port=18082/tcp
sudo firewall-cmd --reload
アクティブなポートリストを調査します。
sudo firewall-cmd --list-ports
最終的なサービスチェックを実行します。これらのコマンドは、サービスが起動時に有効化されており、現在アクティブであり、期待されるローカル Web レスポンスを返していることを確認します。
systemctl is-enabled rhcsa-review-web.service
systemctl is-active rhcsa-review-web.service
curl -s http://127.0.0.1:18082/
最後にコンテンツのパーミッションを監査します。この最終チェックは、よくある「部分的な修復」を防ぐためのものです。サービスは動作していても、アクセスモデルが意図したものより広すぎたり狭すぎたりしていないかを確認します。
sudo stat -c '%a %U:%G %n' /srv/rhcsa-review /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
まとめ
失敗した systemd ユニットの診断、サービスユーザーのパーミッション修正、サービスの有効化、SELinux ファイルおよびポートラベルの追加、firewalld の開放、そして最終的な Web レスポンスの検証を行うことで、マルチイシューのサービスホストを修復しました。



