特定のドメインをブロックまたは許可するための Network Firewall ルールを設定する方法を教えてください。
AWS Network Firewall を使用して、Amazon Virtual Cloud (Amazon VPC) 内のリソースからのアウトバウンドウェブトラフィックをフィルター処理しようとしています。
簡単な説明
AWS Network Firewall は、アウトバウンドウェブトラフィックに対するドメインベースのフィルター処理をサポートするために、アクションの順序または厳密な評価順序を使用します。ルールを設定するには、ステートフルドメインリストのルールグループまたは Suricata 互換文字列を使用します。ドメインインスペクションは、HTTP プロトコルと HTTPS プロトコルで機能します。
HTTP では、ファイアウォールはホストヘッダーを検査します。HTTPS では、ファイアウォールは TLS ハンドシェイクでサーバー名表示 (SNI) を使用します。ドメイン許可リストを使用すると、ネットワークファイアウォールは指定されたドメインにのみトラフィックを送信し、他のすべてのリクエストを破棄します。
詳細については、「AWS ネットワークファイアウォールでの Suricata 互換ルール文字列」および「AWS Network Firewall でのステートフルドメインリストのルールグループ」を参照してください。
解決策
ポリシーのドメインリストグループをデフォルトのアクション順序で設定する
次の手順を実行します。
- ファイアウォールを作成します。
- Amazon VPC コンソールのナビゲーションペインにおいて、[ネットワークファイアウォール] で [ファイアウォールポリシー] を選択します。
- 編集するファイアウォールポリシーでデフォルトのアクション順序を選択します。
- [ステートフルルールグループ] で [アクション] を選択し、[ステートフルルールグループの作成] を選択します。
- [ステートフルルールグループの形式] で [ドメインリスト] を選択します。
注: ステートフルルールの順序はポリシーから継承されるため、変更できません。[ルールの順序] は [アクション順序] と表示されます。 - 一意のルールグループ名を入力します。
- [キャパシティ予約] には、リストに含める推定ドメイン数を入力します。
注: ルールグループを作成した後に、値を変更することはできません。 - [ドメインリスト] の [ドメイン名のソース] に照合するドメイン名を入力します。ドメインは、完全一致で定義できます (例: abc.example.com)。ワイルドカードでの定義も可能です (例: .example.com)。
- [CIDR 範囲] で次のいずれかのオプションを選択します。
[デフォルト]: ファイアウォールと同じ VPC 内にあるソース IP アドレス。
[カスタム]: リモートVPC 内のソース IP アドレス。[ソース IP CIDR の範囲] でファイアウォールが検査するソースサブネットを入力します。 - [プロトコル] で [HTTP と HTTPS] を選択します。
- [アクション] で [許可] を選択します。
- [ルールグループを作成] を選択します。
アクション順序評価を使用してポリシーに Suricata 互換 IPS ルールを定義する
次の手順を実行します。
- ファイアウォールを作成します。
- Amazon VPC コンソールのナビゲーションペインにおいて、[ネットワークファイアウォール] で [ファイアウォールポリシー] を選択します。
- 編集するファイアウォールポリシーでデフォルトのアクション順序を選択します。
- [ステートフルルールグループ] で [アクション] を選択し、[ステートフルルールグループの作成] を選択します。
- [ステートフルールグループの形式] で [Suricata 互換ルール文字列] を選択します。
注: ステートフルルールの順序はポリシーから継承されるため、変更できません。[ルールの順序] は [アクション順序] と表示されます。 - 一意のルールグループ名を入力します。
- [キャパシティ予約] には、リストに含める推定ドメイン数を入力します。
注: ルールグループを作成した後に、値を変更することはできません。 - (オプション) Suricata 署名で使用するカスタムルール変数を定義します。
- (オプション) Suricata 署名で使用する IP セット参照を定義します。
- Suricata 互換ルールの文字列に次のルールを入力します。
pass http $HOME_NET any -> $EXTERNAL_NET any (http.host; dotprefix; content:".amazonaws.com"; endswith; msg:"matching HTTP allowlisted FQDNs"; flow:to_server, established; sid:1; rev:1;) pass http $HOME_NET any -> $EXTERNAL_NET any (http.host; content:"example.com"; startswith; endswith; msg:"matching HTTP allowlisted FQDNs"; flow:to_server, established; sid:2; rev:1;) pass tls $HOME_NET any -> $EXTERNAL_NET any (tls.sni; dotprefix; content:".amazonaws.com"; nocase; endswith; msg:"matching TLS allowlisted FQDNs"; flow:to_server, established; sid:3; rev:1;) pass tls $HOME_NET any -> $EXTERNAL_NET any (tls.sni; content:"example.com"; startswith; nocase; endswith; msg:"matching TLS allowlisted FQDNs"; flow:to_server, established; sid:4; rev:1;) drop http $HOME_NET any -> $EXTERNAL_NET any (http.header_names; content:"|0d 0a|"; startswith; msg:"not matching any HTTP allowlisted FQDNs"; flow:to_server, established; sid:5; rev:1;) drop tls $HOME_NET any -> $EXTERNAL_NET any (msg:"not matching any TLS allowlisted FQDNs"; flow:to_server, established; sid:6; rev:1;)
注: 上記のルールにおいて、ドメインは実際に含めるドメインに置き換えてください。 [ルールを作成] を選択します。
注: ドメインルールには、多くの場合確立されたフローキーワードが含まれますが、かかるキーワードはフロー外のパケット交換におけるすべてのエッジケースに対応できるとは限りません。ルールリストの例を使用する前に、ルールをテストして想定通りに機能することを確認してください。
厳密な評価順序を含むポリシーにドメインリストルールグループを設定する
次の手順を実行します。
- ファイアウォールを作成します。
- Amazon VPC コンソールのナビゲーションペインにおいて、[ネットワークファイアウォール] で [ファイアウォールポリシー] を選択します。
- 編集する、厳密な評価順序を含むファイアウォールポリシーを選択します。
- [ステートフルルールグループ] で [アクション] を選択し、[ステートフルルールグループの作成] を選択します。
- [ステートフルルールグループの形式] で [ドメインリスト] を選択します。
注: ステートフルルールの順序はポリシーから継承されるため、変更できません。[ルール順序] は [厳密] と表示されます。 - 一意のルールグループ名を入力します。
- [キャパシティ予約] には、リストに含める推定ドメイン数を入力します。
注: ルールグループを作成した後に、値を変更することはできません。 - [ドメインリスト] の [ドメイン名のソース] に照合するドメイン名を入力します。ドメインは、完全一致で定義できます (例: abc.example.com)。ワイルドカードでの定義も可能です (例: .example.com)。
- [CIDR 範囲] で次のいずれかのオプションを選択します。
[デフォルト]: ファイアウォールと同じ VPC 内にあるソース IP アドレス。
[カスタム]: リモートVPC 内のソース IP アドレス。[ソース IP CIDR の範囲] でファイアウォールが検査するソースサブネットを入力します。 - [プロトコル] で [HTTP と HTTPS] を選択します。
- [アクション] で [許可] を選択します。
- [ルールグループを作成] を選択します。
- ナビゲーションペインの [ネットワークファイアウォール] で [ファイアウォールポリシー] を選択します。
- 厳格な順序ポリシーを選択します。
- [ステートフルールの評価順序とデフォルトアクション] で [編集] を選択します。
- [デフォルトアクション] で [確立を削除] を選択し、[保存] を選択します。
厳密な評価順序を含むポリシー用の Suricata 互換 IPS ルールを定義する
次の手順を実行します。
- ファイアウォールを作成します。
- Amazon VPC コンソールのナビゲーションペインにおいて、[ネットワークファイアウォール] で [ファイアウォールポリシー] を選択します。
- 編集する、厳密な評価順序を含むファイアウォールポリシーを選択します。
- [ステートフルルールグループ] で [アクション] を選択し、[ステートフルルールグループの作成] を選択します。
- [ステートフルールグループの形式] で [Suricata 互換ルール文字列] を選択します。
注: ステートフルルールの順序はポリシーから継承されるため、変更できません。[ルール順序] は [厳密] と表示されます。 - 一意のルールグループ名を入力します。
- [キャパシティ予約] には、リストに含める推定ドメイン数を入力します。
注: ルールグループを作成した後に、値を変更することはできません。 - (オプション) 定義した Suricata 署名で使用するカスタムルール変数を定義します。
- (オプション) 定義した Suricata 署名で使用する IP セット参照を定義します。
- Suricata 互換ルールの文字列に次のルールを入力します。
pass http $HOME_NET any -> $EXTERNAL_NET any (http.host; dotprefix; content:".amazonaws.com"; endswith; msg:"matching HTTP allowlisted FQDNs"; flow:to_server, established; sid:1; rev:1;) pass http $HOME_NET any -> $EXTERNAL_NET any (http.host; content:"example.com"; startswith; endswith; msg:"matching HTTP allowlisted FQDNs"; flow:to_server, established; sid:2; rev:1;) pass tls $HOME_NET any -> $EXTERNAL_NET any (tls.sni; dotprefix; content:".amazonaws.com"; nocase; endswith; msg:"matching TLS allowlisted FQDNs"; flow:to_server, established; sid:3; rev:1;) pass tls $HOME_NET any -> $EXTERNAL_NET any (tls.sni; content:"example.com"; startswith; nocase; endswith; msg:"matching TLS allowlisted FQDNs"; flow:to_server, established; sid:4; rev:1;)
注: 上記のルールにおいて、ドメインは実際に含めるドメインに置き換えてください。 [ルールグループを作成] を選択します。 ナビゲーションペインの [ネットワークファイアウォール] で [ファイアウォールポリシー] を選択します。 厳格な順序ポリシーを選択します。 [ステートフルールの評価順序とデフォルトアクション] で [編集] を選択します。 [デフォルトアクション] で [確立を削除] を選択し、[保存] を選択します。
注: ドメインルールには、多くの場合確立されたフローキーワードが含まれますが、このキーワードは通常のフロー外でパケットが交換される、すべてのエッジケースをキャプチャするとは限りません。ルールリストの例を使用する前に、ルールをテストして想定通りに機能することを確認してください。
設定をテストする
設定が機能するかどうかをテストするには、指定したドメインに対して curl コマンドを実行します。
次のコマンド例では、https://example.com というドメインへの HTTPS アクセスをテストします。
curl -v --silent https://example.com --stderr - | grep 200
アクセスが許可されている場合、次の出力が表示されます。
< HTTP/2 200
次のコマンド例では、http://www.google.com への HTTP アクセスをテストします。
curl -v http://www.google.com
次の出力例は、GET リクエストで接続が停止したため、ファイアウォールルールにより HTTP トラフィックがブロックされたことを示しています。
* Trying 172.253.115.99:80... * Connected to www.google.com (http://www.google.com/) (172.253.115.99) port 80 (#0) > GET / HTTP/1.1 > Host: www.google.com (http://www.google.com/) > User-Agent: curl/7.79.1 > Accept: /
次のコマンド例では、https://www.google.com への HTTPS アクセスをテストします。
curl -v https://www.google.com
出力は、TLS ハンドシェイク中に接続が停止したため、HTTPS トラフィックがブロックされたことを示しています。
* Trying 172.253.115.147:443... * Connected to www.google.com (https://www.google.com/) (172.253.115.147) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: /etc/pki/tls/certs/ca-bundle.crt * CApath: none * TLSv1.2 (OUT), TLS header, Certificate Status (22): * TLSv1.2 (OUT), TLS handshake, Client hello (1):
関連情報
- 言語
- 日本語
