AWS Network Firewall でアウトバウンド URL フィルタリングを試してみた
はじめに
AWS Network Firewall では ドメイン単位 でのアクセス制御が可能です。
しかし実運用では、
- 同じドメインでも特定のパスだけブロックしたい
- 特定のサービスの一部ページのみ制御したい
といったニーズが出てくることがあります。
一方で、AWS にはプロキシ製品が用意されていないため、基本的には ドメイン単位での制御 しかできません。
それでも「URL のパス単位でブロックできたら便利だよな」と思い、アウトバウンド通信を対象に Network Firewall を使って試してみました。
本記事はその検証結果を、備忘録としてまとめたものです。
構成イメージ
今回の構成イメージは以下になります。

設定の概要
URL フィルタリングを Network Firewall で実現するには、TLS 通信を復号して中身を確認できるようにした上で、Suricata ルールでパス単位の制御を行う必要があります。
今回の設定の流れは以下のとおりです。
- CA証明書の作成
- 証明書を ACM にインポート
- TLS 検査設定の作成
- ファイアウォールポリシーの作成
- クライアント PC に証明書をインストール
- Suricata ルールを作成
設定の詳細
前提条件
今回はあくまでもURLフィルタリングの部分を中心としたいため以下を前提とします。
- Network Firewall はデプロイ済み
- クライアント端末は Windows を想定
- ホワイトリスト形式での制御
- ステートフルルールを利用
1. CA証明書の作成
アウトバウンド向けのTLS インスペクションには、プライベート認証局のルート証明書が必要になります。 今回は証明書の作成方法の詳細は割愛しますが、OpenSSLを利用し作成することが可能です。 なお、CA証明書利用するにあたって以下の注意点があります。
プライベート CA で署名されたサーバー証明書との通信は検査できない
通信相手(=Web サイトなど)がプライベート CA の証明書を使っている場合、Network Firewall はその通信を検査できません。Mozilla による CA 証明書リストに含まれるパブリック証明書は利用可能
一般的なウェブサイト(例:Amazon、Google など)はこれに該当するため、こうした宛先との TLS 通信は検査可能です。
詳しくはこちらを参照ください: docs.aws.amazon.com
2. 証明書のインポート
作成したルート証明書をACMへインポートします。
作成したルート証明書とプライベートキーの情報を貼り付けます。

3.Network FirewallでTLS検査設定を設定
下記のドキュメントに沿って実施すれば問題ありません。
ポイント
- 証明書の関連付けでは、先ほどインポートした証明書がプルダウンで表示されますので選択してください。
- スコープの定義では、基本的に宛先ポートを
443に指定することをお勧めします。
4.Network Firewallのファイアウォールポリシーを作成
こちらも下記のドキュメントに沿って実施すれば問題ありません。 今回は、「TLS検査設定」を追加の項目以外はデフォルト値で作成しました。
ポイント
- 「TLS検査設定」を追加の項目があるため、そこで手順3で作成したTLS設定を選択してください
- 作成後、ポリシーにあとからTLS検査を追加することができません。
5.クライアントPCに証明書をインストールする
端末のローカルにクライアント証明書を保存し、以下の手順でルート証明書をインストールします。
6.Suricataによるルール作成
こちらも下記のドキュメントに沿って実施すれば問題ありません。 docs.aws.amazon.com
今回は以下の内容で設定します。
ルールグループ形式を「Suricata互換ルール文字列」を選択する

「名前」と「キャパシティ」を入力

ルールを設定で以下のようなフィルタリング指定を行います。
例)https://www.serverworks.co.jp/en/about.html への通信を許可したい場合
pass http $HOME_NET any -> $EXTERNAL_NET 443 (msg:"Allow access to www.serverworks.co.jp/en/about.html";flow:to_server,established;http.host; content:"www.serverworks.co.jp";http.uri; content:"/en/about.html";sid:1000201;rev:1;)

詳細 はSuricaルールドキュメント をご参照ください
8.1. Rules Format — Suricata 8.0.1-dev documentation
以降の「カスタマーマネージドキー」や「タグ」の設定は特に変更せず、すべてデフォルトのままでルールグループを作成しました。
動作確認
以下の通り、許可ページはアクセス成功、その他はブロックされることを確認できました。
許可したURLのページ(https://www.serverworks.co.jp/en/about.html)が表示される。

許可していないページ(https://www.serverworks.co.jp)はもちろんブロックされる。

ちなみに、ブラウザでサイトを見た際、証明書の発行者が作成したルート証明書になります。

つまずいたこと
Suricataルールで最初は「Alert」で記載しておりましたが、この場合接続できませんでした。 ホワイトリスト形式の場合、「pass」にする必要があります。
こちらのブログと同じ原理なので気になる方はご参照ください
暗黙的拒否のNetwork Firewallにおいてアラートルールのみでは拒否される。パスルールも必要! - サーバーワークスエンジニアブログ
まとめ
今回は、AWS Network Firewall を使ってアウトバウンド通信の URL フィルタリングを試してみました。
- Network Firewall では通常ドメイン単位の制御しかできない
- TLS インスペクションを組み合わせることで、パス単位のフィルタリングが可能になる
- Suricata ルールを利用して柔軟なアクセス制御ができる
一方で、証明書の管理やクライアントへのインストール、TLS インスペクションの制約(プライベート CA への対応不可など)もあるため、実運用に組み込む際には考慮が必要です。
「URL のパス単位でブロックしたい!」という要件はそこまで多くないかもしれませんが、知っておくと選択肢が広がると思います。
今回の内容がどなたかの参考になれば幸いです。