杉村です。 AWS Network Firewall で何ができるのか、その仕組みや基本的な概念、構成図、注意点を分かりやすく記載します。
1. 何ができるのか
AWS Network Firewall は VPC の Internet Gateway の手前に置くイメージで VPC に出入りするパケットに対して以下のようなことができます。
- ステートレスなパケットフィルタリング (プロトコル, 送信元IP, 送信元ポート, 送信先IP, 送信先ポート)
- ステートフルなパケットフィルタリング (プロトコル, 送信元IP, 送信元ポート, 送信先IP, 送信先ポート)
- 送信先ドメイン名を基にしたHTTP/HTTPSのアクセス制御
※ 3 つ目について 送信元/先のドメイン名を基にした
... と記載していた時期がございました。正しくは 送信先ドメイン名を基にした
となります。お詫びして訂正いたします (2022/10/07 追記) 。
よって、以下のような以前までの悩みを解決することができます。
「VPC とインターネットの間で XX の通信は絶対通したくない。だから仮想アプライアンス製品を EC2 で構築して、全てのパケットをその製品を通して通信させよう。可用性も確保したい。セルフマネージドだから、運用も大変だ...」
AWS Network Firewall を使うことで、上記の通信制御をマネージドサービスで実現できます。
基盤を AWS が管理するため、可用性やスケーラビリティを考慮する必要がありません。
一方で、以下は現在の機能では実現することができません。 (2020/11/24時点)
- VPC Peering を出入りするパケットの検査
- VPC から Transit Gateway を経由して別の VPC へ通信するときのパケットの検査
- つまり以下はできない
- VPC A (EC2 Instance) => Transit Gateway => VPC B (Network Firewall) => VPC B (EC2 Instance)
- ただし以下のような構成はできる
- VPC A (EC2 Instance) => Transit Gateway => Inspection VPC (Network Firewall) => Transit Gateway => VPC B (EC2 Instance)
- VPC A (EC2 Instance) => Transit Gateway => VPC B (NAT gateway) => VPC B (Network Firewall) => Internet gateway => Internet (0.0.0.0/0)
- 詳細は AWS 公式ブログ Deployment models for AWS Network Firewall 参照
- つまり以下はできない
(2021/03/26 追記) ブログ公開当初、 特定ドメイン名へのアクセスのみ許可してそれ以外は拒否 という設定はできないと間違った記載をしておりました。実際には実現可能です。申し訳ありません。
2. 構成図
2-1. 基本構成
AWS 慣れしている人であれば、どんな構成になるのかがまず気になるところと思います。
Internet Gateway 経由で利用する際の基本構成(Multi-AZ 構成)はこちらです。
AWS Network Firewall を構築してサブネットと紐づけます。 (図の Firewall subnet)
このサブネットは AWS Network Firewall 専用であることが推奨です。
また図の Public Subnet にはこの例での通信元/先である EC2 Instance を配置して Elasitc IP を付与しています。
(AWS Network Firewall はそれ単体では NAT Gateway のようには動作してくれないことに注意が必要です)
AWS Network Firewall をサブネットと紐づけると VPC Endpoint が作成されます。
なおマネジメントコンソールで確認すると、このエンドポイントは先日発表された Gateway Load Balcner Endpoint となっていることが分かります。
ドキュメントによると AWS Network Firewall を紐づけた(エンドポイントを作成した)サブネットごとに料金が発生するので注意が必要です。 Firewall を 1 AZ 構成にして、別の AZ の EC2 等からクロスゾーン利用することもできますが、 VPC 内のクロスゾーン通信の料金は通常通り発生します。
Internet Gateway には Ingress Routing 機能で Route Table を紐づけます。
この Route Table では「通信元/先サブネット → AWS Network Firewall のエンドポイント」というルートを記載します。
あとは図のようにルートテーブルを設定することで「Intenet Gateway ⇔ AWS Network Firewall ⇔ Public Subnet」という通信路ができあがります。
(余談ですが Ingress Routing を使ったこのルートテーブル構成で通信できるところを見ると、VPC では Internet Gateway が NAT テーブルを管理して、 EC2 等の持つ Public IP と Private IP を変換しているのであろう、ということが分かりますね。ユーザーが意識しないところですが)
2-2. NAT Gateway を利用する構成
以下の図のように NAT Gateway を利用する構成も利用できます。
こちらの構成では EC2 Instance に Elastic IP/Public IP を付与する必要はありません。
こちらの構成のほうが、利用機会は多いかもしれません。
3. 構成要素
- Firewall
- Firewall policy
- Rule group
上記の3つの構成要素を押さえます。
それぞれの関係性の例を以下に図示します。
Firewall はその名の通り Firewall 本体のイメージです。
Firewall を VPC のサブネットに紐づけると Firewall のエンドポイントがサブネット内にできあがります。
ルートテーブルで、このエンドポイントめがけてパケットを向けるのです。
Firewall policy は Rule group の集合体です。1 つの Firewall には 1 つの Firewall policy を紐づけられます。 Firewall policy は 再利用可能なので、同じ Firewall policy を複数の Firewall で利用することもできます。
Rule Group はその名の通り、ルールの集合体です。
Stateless rule group と Stateful rule group があり、それぞれステートレス/ステートフルにパケットを検査するルールの集合体です。
複数の Rule group を Firewall policy と紐づけて利用します。
1 つの Rule Group 内には複数のルールを設定できます。
4. ルール評価
こちらの公式ドキュメントでの記載が分かりやすいですが、解説します。
AWS Network Firewall を通る通信は図のように、まず設定してあるステート レス ルールグループで評価されます。
ステートレスルールグループは設定した優先度の順に上から評価されていき、どれかのルールに一致すると、それ以降のルールは評価されません。
どのルールにも合致しなかった場合は、デフォルトアクションが適用されます。
ステートレスルールグループのアクションは「Pass(許可)」「Drop(拒否)」「Forward to stateful rules(ステートフルルールに転送)」の3種から選べます。
ステート フル ルールグループではパケットの行き/返りを意識したルール評価が可能です。
ドメイン名による制限もこちらで作成します。
なおステートフルルールのデフォルトアクションは Pass(許可) です。
ステートフルルールでは Pass, Drop の他に Alert という動作が選択可能です。
Alert 動作は Firewall に設定したログ出力先に Alert としてログを出力する動作です。
Firewall はログ出力先として CloudWatch Logs, S3, Kinesis Data Firehose のいずれかを選択できます。
ここで問題があります。前述した「できないこと」に関連してですが、よくあるユースケースとして以下があると思います。
「EC2 からインターネット経由でソフトウェアレポジトリやセキュリティソフトのマネージャサーバへと通信させたい。でもマルウェアも心配だ。 HTTP プロキシを立てて、許可リスト(ホワイトリスト)に記載したドメイン名とだけ通信させて、それ以外は拒否しよう」
こういったケースで AWS Network Firewall を利用したいところですが、 2020/11/24 現在は実現できません。
なぜなら Stateful rules のデフォルトアクションは Pass (許可) だからです。
どんなドメインも Drop されない限り必ず Pass されてしまうので許可リストを作っても意味がないのです。
一方で拒否リスト(特定ドメインは Drop するリスト) は作れます。
(2021/03/26 追記) 上記は記載が間違っておりました。申し訳ありません。 特定ドメイン名へのアクセスのみ許可してそれ以外は拒否 という挙動は Domain list rule を用いて実現可能です。
「EC2 からインターネット経由でソフトウェアレポジトリやセキュリティソフトのマネージャサーバへと通信させたい。でもマルウェアも心配だ。 HTTP プロキシを立てて、許可リスト(ホワイトリスト)に記載したドメイン名とだけ通信させて、それ以外は拒否しよう」
というような設定は、許可リストを作ることで実現可能です。
Domain listを使った場合の挙動は以下のようになります。
- Domain list にてアクションを許可: リスト上のドメインにのみアクセスが可能となる。リストにないドメインに対してのアクセスは拒否される (いわゆる許可リスト、ホワイトリスト)
- Domain list にてアクションを拒否: リスト上のドメインへのアクセスは拒否される。リストにないドメインに対してのアクセスは許可される (いわゆる拒否リスト、ブラックリスト)
5. 構築
AWS Network Firewall の構築は、基本的には以下のドキュメントに沿って実施すればOKです。
Getting started with AWS Network Firewall - AWS Network Firewall
- Step 1: Create rule groups
- Step 2: Create a firewall policy
- Step 3: Create a firewall
- Step 4: Update your Amazon VPC route tables
- Step 5: Remove the firewall and clean up your resources
Step 1: Create rule groups
では一番のキモとなるルールを作っています。ここが最も難しいでしょう。
後述のルール例を参考にしてください。
また Step 4: Update your Amazon VPC route tables
で、どのようにルート設定すればいいのか詳しい記載がありません。前述の構成図を参考にしてください。
なお構築した AWS Network Firewall のエンドポイント ID を知りたい場合、当該 Firewall をマネジメントコンソールで選択してタブ Firewall details
(ファイアウォールの詳細) を選択すれば Firewall endpoints
(ファイアウウォールエンドポイント)という欄に表示されています。
6. Rule group の例
6-1. Stateless rule group の例
Stateless rule group の一例のみご紹介します。
以下の図の例では 10.200.10.0/24 サブネットにいる EC2 からインターネットへの 443/tcp 通信を許可しています。
また同サブネット内の EC2 に対して灰色で塗りつぶしてある特定 IP アドレスからの 22/tcp 通信を許可しています。
※プロトコル番号 6 は TCP
たとえば EC2 が Public IP (EIP) を持っていたとしてもここに指定する IP は Private IP となることに注意です。
6-2. Stateful rule group の例
Stateful rule では 5-tuple rule (プロトコル, 接続元IP, 接続元ポート, 接続先IP, 接続先ポート) と Domain list rule, Suricata compatible IPS rules を作成することができます。
1 つの Firewall policy に複数の Stateful rule group を設定することができますが、 Stateful rule には優先順位がありません。
独自の評価基準があるようで例えば「 5-tuple rule による Drop 」「特定ドメインのアクセスを Pass するような Stateful Rule Groups 」が同時に適用されていて、パケットが 5-tuple rule に合致した場合、5-tuple rule が適用されパケットが Drop されます。
6-3. Capacity
Rule group には Capacity という概念があります。
Rule group を作成する際に予め割り当てる Capacity を数字で指定します。
この数字は後から変えることはできませんので、必要な Capacity 量を見積もって Rule group を作成します。
作成できる Rule groups の Capacity 量は AWS アカウント/リージョンごとに上限があります。
(Stateless と Stateful それぞれに別個の上限がある)
上限はドキュメント AWS Network Firewall quotas - AWS Network Firewall に記載の通りです。
ルールが消費するキャパシティ量は、以下ドキュメントの計算式に基づいて算出できます。 AWS Network Firewall
杉村 勇馬 (記事一覧)
サーバーワークス → 株式会社G-gen 執行役員CTO
2021 Japan APN Ambassadors / 2021 APN All AWS Certifications Engineers
マルチAWSアカウント管理運用やネットワーク関係のAWSサービスに関するブログ記事を過去に執筆。
2021年09月から株式会社G-genに出向、Google Cloud(GCP)が専門に。G-genでもGoogle Cloud (GCP) の技術ブログを執筆中。