fu3ak1's tech days

何事もシンプルに。主にAWS関連の記事を書いています

AWSマネージドなNework Firewallがリリースされたのでプロキシサーバ替わりにしてみる

re:Invent直前、素敵な機能がリリースされたようです。

AWS Network Firewall

aws.amazon.com

Network Firewallとは

ネットワークレイヤーでVPC内のリソースを保護できるAWSマネージドなFirewallのようです。 と言ってもよくわからないので実際に作って挙動を見ていきます。

これまで、外部アクセスをフィルタリングする場合はオープンソースのプロキシサーバであるSquidなどを使用してEC2でプロキシサーバを構築していましたが、これを使用することでマネージドな形でURLフィルタリングができます。

今回の構成

f:id:fu3ak1:20201118152837p:plain

ドキュメントのルーティング例にある一番シンプルな構成で作ります。 私の場合はEC2を配置するサブネットを10.0.0.0/24で作成しています。 配置したEC2から、外部通信時にFWを通すようにします。

Simple single zone architecture with an internet gateway - Network Firewall

※東京リージョンにはまだないため、今回はバージニア北部リージョンで試しています。

Network Firewallの作成

VPCのメニューに新しい項目が・・

f:id:fu3ak1:20201118112416p:plain

ファイアウォールを作成していきます。

f:id:fu3ak1:20201118112447p:plain

このような概要説明も画面に表示されていました。

f:id:fu3ak1:20201118112542p:plain

任意の名前を設定し、パブリックサブネットを2つ選択します。(名前がelbとなっていますが通常のパブリックサブネットです)

f:id:fu3ak1:20201118112759p:plain

初回のため空のポリシーを作成し、ファイアウォールを作成します。

f:id:fu3ak1:20201118112837p:plain

作成できたので、実際のルールを適用するためにルールグループを作成します。 ルールグループはステートレスとステートフルの2種類がありますが、今回はステートフルで作成します。

f:id:fu3ak1:20201118122447p:plain

ルールグループは以下の3つから選べます。ここではドメインベースで外部アクセスの拒否を使います。 IPSベースのルールも選べるようで、今後活用できそうですね。

キャパシティは1にするとエラーになるため、10としておきます。作成後にこの値は変更不可のようなので注意です。

f:id:fu3ak1:20201118153729p:plain

アクセス拒否したいドメインを記載し、アクションでDenyにします。 今回はサンプルとして「www.yahoo.co.jp」にしました。

f:id:fu3ak1:20201118153437p:plain

作成を押すとルールグループが追加されます。

f:id:fu3ak1:20201118153834p:plain

ファイアウォールの設定はここまでです。

Route Tableの設定

VPCの通信をファイヤーウォール経由とするため、Route Tableの設定を変更していきます。

具体的には以下赤丸のとおり3か所のルートテーブルを設定しますが、私はInternet GatewayにRoute Tableを設定するという概念が今まで頭になかったのでそこに悩んでしまいました。。

f:id:fu3ak1:20201118154229p:plain

実際に設定していきます。

① Internet Gatewayの Route Table

通常とは異なるルートテーブルを設定するため、新たにルートテーブルを作成します。

f:id:fu3ak1:20201118154652p:plain

作成したルートテーブルを選択し、アクションからEdit edge associationsを選択します。(Internet Gatewayと関連付けるため。私はここで初めてやりました)

f:id:fu3ak1:20201118154852p:plain

Internet Gatewayに関連付けしてSaveします。

f:id:fu3ak1:20201118155825p:plain

関連付けしたルートテーブルを編集し、以下のとおりターゲットをFirewallのエンドポイントに設定します。

※ここもわかりにくいのですが、選択肢にはFirewallという文字はなく、Gateway Load Balancer Endpointから選択します。おそらく裏ではこれが稼働しているためです。エンドポイントの情報は、ファイアウォール画面>ファイアウォールの詳細タブ>ファイアウォールエンドポイント から確認できます。

※エンドポイントはサブネット単位のため、マルチAZの場合は複数のルートが必要です。

f:id:fu3ak1:20201118155414p:plain

これで一つ目のルートテーブル設定は完了です。

Firewall Subnetの Route Table

Firewallを配置したサブネットのルートテーブルです。ここは通常のパブリックサブネット同様、以下のように設定すればOKです。 VPC向けのlocalと、0.0.0.0向けのIGWです。

f:id:fu3ak1:20201118160107p:plain

③ EC2 Subnetの Route Table

最後にEC2を配置するサブネットのルートテーブルです。vpce-**となっているのは、ファイアウォールエンドポイントです。 デフォルトゲートウェイ(0.0.0.0)として、ファイアウォールにルーティングさせます。

f:id:fu3ak1:20201118160311p:plain

以上で3つのルートテーブルの設定は完了です。Internet GatewayのルートテーブルとEC2のルートテーブルそれぞれでFWにルーティングさせて、FWサブネットを経由させる形ですね。

EC2から外部疎通確認

ファイアウォールの準備ができたので、サブネットにEC2を構築して外部疎通してみます。 (EC2構築手順は割愛します。)

まずは拒否されていない「www.google.co.jp」にcurlでアクセスしてみます。

[root@ip-10-0-0-58 ~]# curl -I https://www.google.co.jp/
HTTP/2 200
content-type: text/html; charset=Shift_JIS
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
date: Wed, 18 Nov 2020 06:08:16 GMT
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
expires: Wed, 18 Nov 2020 06:08:16 GMT
cache-control: private
set-cookie: 1P_JAR=2020-11-18-06; expires=Fri, 18-Dec-2020 06:08:16 GMT; path=/; domain=.google.co.jp; Secure
set-cookie: NID=204=TrfasTpATfsY4c6PAqxv9izTeDMO-A9qoTOW86D4FrM0F_ChpBcER3tsdYfu7ARzYogEkEYo2MUYw60BbscDozNSizUyjtx4u2bSk6MJ_hefdf9RD_lggp_RLQrUoMUI7eZq-MgRVf7r_OozmjvJLinf7vnehJdBu1ImwwUToiU; expires=Thu, 20-May-2021 06:08:16 GMT; path=/; domain=.google.co.jp; HttpOnly
alt-svc: h3-Q050=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"

エラーなくステータス200で返ってきますね。

次に拒否している「www.yahoo.co.jp」。

[root@ip-10-0-0-58 ~]# curl -I https://www.yahoo.co.jp
curl: (28) Operation timed out after 300992 milliseconds with 0 out of 0 bytes received

タイムアウトとなりました!ドメインで拒否できていることがわかりますね。

まとめ、感想

Route Tableで詰まってしまい、思ったより時間がかかりました。

まだ東京リージョンでは未対応のようなので、東京リージョンやCloud Formationが対応したらテンプレートで作成・管理できるようにしたいです。

また、外部からのアクセスも制御できるようなので、これまでSecurity Groupで対応できなかった特定IPやポートのDenyなどもできるかもしれません(試せていません)

まだまだ奥が深そうなサービスなので、また機会があれば触ってみたいと思います。