AWSマネージドなNework Firewallがリリースされたのでプロキシサーバ替わりにしてみる
re:Invent直前、素敵な機能がリリースされたようです。
Network Firewallとは
ネットワークレイヤーでVPC内のリソースを保護できるAWSマネージドなFirewallのようです。 と言ってもよくわからないので実際に作って挙動を見ていきます。
これまで、外部アクセスをフィルタリングする場合はオープンソースのプロキシサーバであるSquidなどを使用してEC2でプロキシサーバを構築していましたが、これを使用することでマネージドな形でURLフィルタリングができます。
今回の構成
ドキュメントのルーティング例にある一番シンプルな構成で作ります。 私の場合はEC2を配置するサブネットを10.0.0.0/24で作成しています。 配置したEC2から、外部通信時にFWを通すようにします。
Simple single zone architecture with an internet gateway - Network Firewall
※東京リージョンにはまだないため、今回はバージニア北部リージョンで試しています。
Network Firewallの作成
VPCのメニューに新しい項目が・・
ファイアウォールを作成していきます。
このような概要説明も画面に表示されていました。
任意の名前を設定し、パブリックサブネットを2つ選択します。(名前がelbとなっていますが通常のパブリックサブネットです)
初回のため空のポリシーを作成し、ファイアウォールを作成します。
作成できたので、実際のルールを適用するためにルールグループを作成します。 ルールグループはステートレスとステートフルの2種類がありますが、今回はステートフルで作成します。
ルールグループは以下の3つから選べます。ここではドメインベースで外部アクセスの拒否を使います。 IPSベースのルールも選べるようで、今後活用できそうですね。
キャパシティは1にするとエラーになるため、10としておきます。作成後にこの値は変更不可のようなので注意です。
アクセス拒否したいドメインを記載し、アクションでDenyにします。 今回はサンプルとして「www.yahoo.co.jp」にしました。
作成を押すとルールグループが追加されます。
ファイアウォールの設定はここまでです。
Route Tableの設定
VPCの通信をファイヤーウォール経由とするため、Route Tableの設定を変更していきます。
具体的には以下赤丸のとおり3か所のルートテーブルを設定しますが、私はInternet GatewayにRoute Tableを設定するという概念が今まで頭になかったのでそこに悩んでしまいました。。
実際に設定していきます。
① Internet Gatewayの Route Table
通常とは異なるルートテーブルを設定するため、新たにルートテーブルを作成します。
作成したルートテーブルを選択し、アクションからEdit edge associationsを選択します。(Internet Gatewayと関連付けるため。私はここで初めてやりました)
Internet Gatewayに関連付けしてSaveします。
関連付けしたルートテーブルを編集し、以下のとおりターゲットをFirewallのエンドポイントに設定します。
※ここもわかりにくいのですが、選択肢にはFirewallという文字はなく、Gateway Load Balancer Endpointから選択します。おそらく裏ではこれが稼働しているためです。エンドポイントの情報は、ファイアウォール画面>ファイアウォールの詳細タブ>ファイアウォールエンドポイント から確認できます。
※エンドポイントはサブネット単位のため、マルチAZの場合は複数のルートが必要です。
これで一つ目のルートテーブル設定は完了です。
② Firewall Subnetの Route Table
Firewallを配置したサブネットのルートテーブルです。ここは通常のパブリックサブネット同様、以下のように設定すればOKです。 VPC向けのlocalと、0.0.0.0向けのIGWです。
③ EC2 Subnetの Route Table
最後にEC2を配置するサブネットのルートテーブルです。vpce-**となっているのは、ファイアウォールエンドポイントです。 デフォルトゲートウェイ(0.0.0.0)として、ファイアウォールにルーティングさせます。
以上で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などもできるかもしれません(試せていません)
まだまだ奥が深そうなサービスなので、また機会があれば触ってみたいと思います。