AWS Network Firewall でアウトバウンド URL フィルタリングを試してみた

記事タイトルとURLをコピーする

AWS Network Firewall でアウトバウンド URL フィルタリングを試してみた

はじめに

AWS Network Firewall では ドメイン単位 でのアクセス制御が可能です。
しかし実運用では、

  • 同じドメインでも特定のパスだけブロックしたい
  • 特定のサービスの一部ページのみ制御したい

といったニーズが出てくることがあります。

一方で、AWS にはプロキシ製品が用意されていないため、基本的には ドメイン単位での制御 しかできません。

それでも「URL のパス単位でブロックできたら便利だよな」と思い、アウトバウンド通信を対象に Network Firewall を使って試してみました。
本記事はその検証結果を、備忘録としてまとめたものです。


構成イメージ

今回の構成イメージは以下になります。

構成図

設定の概要

URL フィルタリングを Network Firewall で実現するには、TLS 通信を復号して中身を確認できるようにした上で、Suricata ルールでパス単位の制御を行う必要があります。

今回の設定の流れは以下のとおりです。

  1. CA証明書の作成
  2. 証明書を ACM にインポート
  3. TLS 検査設定の作成
  4. ファイアウォールポリシーの作成
  5. クライアント PC に証明書をインストール
  6. 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検査設定を設定

下記のドキュメントに沿って実施すれば問題ありません。

docs.aws.amazon.com

ポイント

  • 証明書の関連付けでは、先ほどインポートした証明書がプルダウンで表示されますので選択してください。
  • スコープの定義では、基本的に宛先ポートを 443 に指定することをお勧めします。

4.Network Firewallのファイアウォールポリシーを作成

こちらも下記のドキュメントに沿って実施すれば問題ありません。 今回は、「TLS検査設定」を追加の項目以外はデフォルト値で作成しました。

docs.aws.amazon.com

ポイント

  • 「TLS検査設定」を追加の項目があるため、そこで手順3で作成したTLS設定を選択してください
  • 作成後、ポリシーにあとからTLS検査を追加することができません。

5.クライアントPCに証明書をインストールする

端末のローカルにクライアント証明書を保存し、以下の手順でルート証明書をインストールします。

learn.microsoft.com

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 のパス単位でブロックしたい!」という要件はそこまで多くないかもしれませんが、知っておくと選択肢が広がると思います。
今回の内容がどなたかの参考になれば幸いです。