firewalld を使用したサービスアクセスの制限

LinuxBeginner
オンラインで実践に進む

はじめに

ネットワークサービスを公開することは、管理タスクの半分に過ぎません。ホストのファイアウォールがどのトラフィックを許可するかを制御する必要があります。Red Hat システムでは、firewalld がゾーン、サービス、ポート、およびリッチルールを通じてファイアウォールポリシーを管理します。

この実験では、TCP ポート 8088 で動作する小さな HTTP サービスが用意されています。デフォルトゾーンの確認、ランタイムでのポート開放、ルールの永続化、広範囲なポート開放からソース制限付きのリッチルールへの置き換え、そして最終的なファイアウォール状態の監査を行います。

ファイアウォールとサービスのベースラインの確認

このステップでは、現在の firewalld の状態と、用意されたネットワークサービスを確認します。ルールを変更する前に、ファイアウォールが実行されていることを確認する必要があります。

セットアップにより、public ゾーンでは SSH と 3002/tcp を使用する LabEx ブラウザーターミナルへのアクセスが永続的に許可されています。アプリケーションのファイアウォールポリシーを変更する際も、これらの管理用ルールは維持してください。

プロジェクトディレクトリに移動します。

cd /home/labex/project

firewalld が実行されていることを確認します。この環境では、読み取りおよび書き込み操作の両方に sudo firewall-cmd を使用してください。

sudo firewall-cmd --state

デフォルトゾーンを表示します。

sudo firewall-cmd --get-default-zone

アクティブなゾーンを確認します。LabEx の SSH セッションが維持されるよう、ssh が許可されていることに注目してください。

sudo firewall-cmd --list-all

練習用の Web サービスが実行されており、ポート 8088 でリッスンしていることを確認します。

systemctl is-active rhcsa-fw-web.service
ss -ltn | grep ':8088'
curl -s http://127.0.0.1:8088/

ポート 8088/tcp が firewalld でまだ広範囲に開放されていないことを確認します。

sudo firewall-cmd --query-port=8088/tcp || echo "port 8088 is not open in the zone"

ランタイムポートの開放

このステップでは、ランタイムファイアウォールルールを追加します。ランタイムルールは即座に有効になりますが、永続化しない限り firewalld をリロードすると消滅します。

現在のランタイム設定で TCP ポート 8088 を開放します。ゾーンが指定されていないため、firewall-cmd は先ほど確認したデフォルトゾーンに変更を適用します。

sudo firewall-cmd --add-port=8088/tcp

ランタイムルールを照会します。yes という結果は、アクティブなファイアウォールが現在そのポートを許可していることを意味します。

sudo firewall-cmd --query-port=8088/tcp

ランタイムポートを一覧表示します。これにより、アクティブなゾーンで手動で開放されたポートを簡潔に確認できます。

sudo firewall-cmd --list-ports

永続的な設定を確認します。ランタイム設定と永続的な設定は別物であるため、まだ no と表示されるはずです。ランタイムのみのルールは現在機能しますが、firewalld をリロードすると失われます。

sudo firewall-cmd --permanent --query-port=8088/tcp || echo "port 8088 is not permanent yet"

ポートルールの永続化

このステップでは、同じポートを永続的な設定に追加し、firewalld をリロードします。リロードを行うことで、永続的な設定がランタイムファイアウォールに適用されます。

永続的なポートルールを追加します。--permanent オプションは、実行中のファイアウォールを変更するだけでなく、firewalld の設定ファイルにルールを書き込みます。

sudo firewall-cmd --permanent --add-port=8088/tcp

firewalld をリロードします。リロードは永続的な設定からランタイムファイアウォールを再構築します。このステップは、保存したルールがリロード後も維持されるかをテストするものです。

sudo firewall-cmd --reload

ランタイム設定と永続的な設定の両方を照会します。最初のコマンドはアクティブなファイアウォールを、2 番目のコマンドは保存された設定を確認します。

sudo firewall-cmd --query-port=8088/tcp
sudo firewall-cmd --permanent --query-port=8088/tcp

両方のコマンドで yes が返されるはずです。

開放されたポートをリッチルールに置き換える

このステップでは、すべてのソースに対してサービスを開放するのではなく、アクセスを制限します。リッチルールを使用すると、ソースアドレスと宛先ポートを 1 つのルールに含めることができます。

広範囲に開放していた永続的なポートルールを削除します。これは、より厳密なルールを適用するための準備です。これを行わないと、リッチルールが存在していても、広範囲なポートルールによってすべてのソースからのアクセスが許可されたままになってしまいます。

sudo firewall-cmd --permanent --remove-port=8088/tcp

ドキュメントネットワーク 192.0.2.0/24 からのみ 8088/tcp へのアクセスを許可するリッチルールを追加します。リッチルールは、単純なサービスやポートルールでは不十分な場合(ソースアドレスによる制限が必要な場合など)に役立ちます。

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.0/24" port port="8088" protocol="tcp" accept'

firewalld をリロードして、永続的な変更を適用します。

sudo firewall-cmd --reload

広範囲なポートが開放されていないことを確認します。期待される no という結果は、サービスが一般的なポートルールによって公開されていないことを意味します。

sudo firewall-cmd --query-port=8088/tcp || echo "broad port rule removed"

リッチルールを一覧表示します。リッチルールの出力は、ソースベースの制限ルールが広範囲な開放ルールに置き換わったことの証拠となります。

sudo firewall-cmd --list-rich-rules

最終的なファイアウォール状態の監査

このステップでは、最終的な状態を監査します。最終確認は重要な管理習慣です。サービスが実行されていること、SSH が引き続き許可されていること、広範囲なポートが閉じられていること、そして制限ルールが存在していることを確認します。

アクティブなゾーンを一覧表示します。

sudo firewall-cmd --list-all

永続的なリッチルールを一覧表示します。

sudo firewall-cmd --permanent --list-rich-rules

SSH が引き続き許可されていることを確認します。

sudo firewall-cmd --query-service=ssh

サービス自体がローカルで応答することを確認します。ローカルループバックアクセスはサービスプロセスを検証するものであり、firewalld はインバウンドのゾーントラフィックを個別に制御します。

curl -s http://127.0.0.1:8088/

まとめ

firewalld を使用したホストファイアウォールの管理を実践しました。デフォルトゾーンの確認、ネットワークサービスの稼働確認、ランタイムポートルールの追加、ルールの永続化、firewalld のリロード、広範囲な開放からソース制限付きのリッチルールへの置き換え、そして最終的なファイアウォール状態の監査を行いました。