Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

5.16. ファイアウォールロックダウンの設定

ローカルのアプリケーションやサービスは、root で実行していれば (たとえば libvirt) ファイアウォール設定を変更することができます。この機能を使用すると、管理者はファイアウォール設定をロックして、どのアプリケーションもファイアウォール変更を要求できなくするか、ロックダウンのホワイトリストに追加されたアプリケーションのみがファイアウォール変更を要求できるようにすることが可能になります。ロックダウン設定はデフォルトで無効になっています。これを有効にすると、ローカルのアプリケーションやサービスによるファイアウォールの望ましくない設定変更を確実に防ぐことができます。

5.16.1. コマンドラインクライアントを使用してロックダウンの設定

ロックダウンが有効になっているかを確認するには、root で以下のコマンドを使用します。
~]# firewall-cmd --query-lockdown
ロックダウンが有効な場合は終了ステータスが 0yes が出力され、無効の場合は終了ステータスが 1no が出力されます。
ロックダウンを有効にするには、root で以下のコマンドを実行します。
~]# firewall-cmd --lockdown-on
ロックダウンを無効にするには、root で以下のコマンドを実行します。
~]# firewall-cmd --lockdown-off

5.16.2. コマンドラインクライアントでホワイトリストオプションの設定

ロックダウンのホワイトリストには、コマンド、セキュリティーのコンテキスト、ユーザー、およびユーザー ID を追加できます。ホワイトリストのコマンドエントリーがアスタリスク * で終了している場合、そのコマンドで始まるすべてのコマンドラインが一致することになります。* がない場合は、コマンドと引数が完全に一致する必要があります。
ここでのコンテキストは、実行中のアプリケーションやサービスのセキュリティー (SELinux) コンテキストです。実行中のアプリケーションのコンテキストを確認するには、以下のコマンドを実行します。
~]$ ps -e --context
このコマンドで、実行中のアプリケーションがすべて返されます。grep ツールを使用して、出力から目的のアプリケーションを以下のようにパイプ処理します。
~]$ ps -e --context | grep example_program
ホワイトリストにあるコマンドラインを一覧表示するには、root で以下のコマンドを実行します。
~]# firewall-cmd --list-lockdown-whitelist-commands
ホワイトリストにコマンド command を追加するには、root で以下のコマンドを実行します。
~]# firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
ホワイトリストからコマンド command を削除するには、root で以下のコマンドを実行します。
~]# firewall-cmd --remove-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
ホワイトリストにコマンド command があるかどうかを確認するには、root で以下のコマンドを実行します。
~]# firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
True の場合は終了ステータスが 0yes が出力され、False の場合は終了ステータスが 1no が出力されます。
ホワイトリストにあるセキュリティーコンテキストを一覧表示するには、root で以下のコマンドを実行します。
~]# firewall-cmd --list-lockdown-whitelist-contexts
ホワイトリストにコンテキスト context を追加するには、root で以下のコマンドを実行します。
~]# firewall-cmd --add-lockdown-whitelist-context=context
ホワイトリストからコンテキスト context を削除するには、root で以下のコマンドを実行します。
~]# firewall-cmd --remove-lockdown-whitelist-context=context
ホワイトリストにコンテキスト context があるかどうかを確認するには、root で以下のコマンドを実行します。
~]# firewall-cmd --query-lockdown-whitelist-context=context
コマンドがある場合は終了ステータスが 0yes が出力され、ない場合は終了ステータスが 1no が出力されます。
ホワイトリストにあるユーザー ID を一覧表示するには、root で以下のコマンドを実行します。
~]# firewall-cmd --list-lockdown-whitelist-uids
ホワイトリストにユーザー ID uid を追加するには、root で以下のコマンドを実行します。
~]# firewall-cmd --add-lockdown-whitelist-uid=uid
ホワイトリストからユーザー ID uid を削除するには、root で以下のコマンドを実行します。
~]# firewall-cmd --remove-lockdown-whitelist-uid=uid
ホワイトリストにユーザー ID uid があるかどうかを確認するには、以下のコマンドを実行します。
~]$ firewall-cmd --query-lockdown-whitelist-uid=uid
コマンドがある場合は終了ステータスが 0yes が出力され、ない場合は終了ステータスが 1no が出力されます。
ホワイトリストにあるユーザー名を一覧表示するには、root で以下のコマンドを実行します。
~]# firewall-cmd --list-lockdown-whitelist-users
ホワイトリストにユーザー名 user を追加するには、root で以下のコマンドを実行します。
~]# firewall-cmd --add-lockdown-whitelist-user=user
ホワイトリストからユーザー名 user を削除するには、root で以下のコマンドを実行します。
~]# firewall-cmd --remove-lockdown-whitelist-user=user
ホワイトリストにユーザー名 user があるかどうかを確認するには、以下のコマンドを実行します。
~]$ firewall-cmd --query-lockdown-whitelist-user=user
コマンドがある場合は終了ステータスが 0yes が出力され、ない場合は終了ステータスが 1no が出力されます。

5.16.3. 設定ファイルを使用したロックダウンホワイトリストオプションの設定

デフォルトのホワイトリスト設定ファイルには NetworkManager コンテキストと、libvirt のデフォルトコンテキストが含まれます。また、リストにはユーザー ID 0 もあります。
<?xml version="1.0" encoding="utf-8"?>
	<whitelist>
	  <selinux context="system_u:system_r:NetworkManager_t:s0"/>
	  <selinux context="system_u:system_r:virtd_t:s0-s0:c0.c1023"/>
	  <user id="0"/>
	</whitelist>
以下のホワイトリスト設定ファイルの例では、firewall-cmd ユーティリティーのコマンドと、ユーザー ID が 815 である user のコマンドすべてを有効にしています。
<?xml version="1.0" encoding="utf-8"?>
	<whitelist>
	  <command name="/usr/bin/python -Es /bin/firewall-cmd*"/>
	  <selinux context="system_u:system_r:NetworkManager_t:s0"/>
	  <user id="815"/>
	  <user name="user"/>
	</whitelist>
上記の例では user iduser name の両方が使用されていますが、実際にはどちらか一方のみのオプションが必要になります。インタープリターは Python なので、コマンドラインに追加されています。または、以下のような明確なコマンドも使用できます。
/usr/bin/python /bin/firewall-cmd --lockdown-on
この例では、--lockdown-on コマンドのみが許可されます。

注記

Red Hat Enterprise Linux 7 では、すべてのユーティリティーが /usr/bin/ ディレクトリーに格納されており、/bin/ ディレクトリーは /usr/bin/ ディレクトリーのシンボリックリンクとなります。つまり、rootfirewall-cmd のパスを実行すると /bin/firewall-cmd に対して解決しますが、/usr/bin/firewall-cmd が使用できるようになっています。新たなスクリプトはすべて新しい格納場所を使用する必要がありますが、root で実行するスクリプトが /bin/firewall-cmd のパスを使用するようなっているのであれば、通常 root ユーザー以外のみに使用される /usr/bin/firewall-cmd パスに加え、このコマンドパスもホワイトリストに加える必要があります。
コマンドの名前属性の最後にある * は、それで始まるすべてのコマンドが一致することを意味します。* がなければ、コマンドと引数が完全に一致する必要があります。