「Network Firewall専用のサブネットを用意する必要があるか?」というテーマについて、実際に使いながら理解していきたいと思います。
AWS Network Firewallとは
VPC向けのファイアウォールであり、IDS(侵入検知システム)/IPS(侵入防止システム)によって不正な通信を見つけ出し、それをブロックするマネージドサービスです。
自宅の玄関先に防犯カメラを設置しておき(IDS)、不審な動きをしている人が侵入してきたら警報を鳴らすイメージです。
AWS Network Firewall特徴
Internet GatewayからのトラフィックをFirewall Endpointを経由するようにRoute Tableを設定する必要があり、Internet Gatewayに対して「Edgeの関連付け」をを使用して、Route Tableをアタッチする必要がある。
インバウンドのトラフィックを特定の場所にルーティングする必要がある場合にはこの方法での設定が必要となる。
Internet GatewayにRoute Tableをアタッチできることを今回初めて知ったので、非常に勉強になりました。
AWS Network Firewallを理解する上で重要なコンポーネントについて
- ファイアウォール
- ファイアウォールポリシー
- ルールグループ
上記3を理解する必要があります。
ファイアウォールとは
AWS Network Firewallではファイアウォール専用サブネットを設定し、そのサブネットに配置されるFirewall Endpointを通過することでトラフィックを検査します。
インターネットからVPCに入ってくる通信をチェックするため、パブリックサブネットに配置します。
VPC内部にあるリソース (例えばEC2)からのトラフィック
VPC内部へのトラフィックへのトラフィックがファイアウォールサブネットに配置されたFirewall Endpointを経由することでトラフィックが検査され、設定ルールに基づいて許可または拒否を行うことができます。
ファイアウォールポリシーとは
ファイアウォールポリシーに対してルールのアクションを定義したものを設定してやることで効果を発揮します。
「ポリシー」なのでイメージはIAM ポリシーと同じようなものをイメージしていただくとわかりやすいかと思います。
ルールグループで定義したルールをファイアウォールポリシーにアタッチするイメージと私は思っています。
ルールグループとは
5つの項目(※5-tuple)
- 送信元IP,
- 送信元ポート番号,
- 宛先IP,
- 宛先ポート番号,
- プロトコル番号
などを定義することで、それらの通信をパス(宛先への送信を許可)するのか、ドロップ(宛先への送信をブロック)するのか、を精査します。
※5-tuple: 通信に必要な5つの情報をまとめたもの指す
ルールグループには2種類存在し、「ステートレスルールグループ」「ステートフルルールグループ」があります。
ステートレスルールグループとは
AWS BlackBeltの資料が分かりやすかったため引用します。
「ステートレス」のためネットワークACLと同じようなものと想像してもらえるとわかりやすいかと思いますが、
送信先への通信と、その戻りの送信元から通信を、どのIPやPortからの通信だったらパス/ドロップ/ステートフルルールへ転送の3つのアクションから設定します。
要するに通信を通すための「ルール」とそのルールに基づいた「検査」をステートレスルールグループでは設定します。
ステートフルルールグループとは
こちらもAWS BlackBeltの資料を引用します。
ステートレスルールグループの違いは「ステートフル」のため、戻りの通信を気にする必要がありません。セキュリティグループをと同じようなものと思ってもらえるとわかりやすいかと思います。
また、ステートレスルールグループの場合は優先度を数字で設定してどのルールを優先させるかを明示的に設定しますが、ステートフルルールグループの場合はトラフィックをパスするルールが常に優先される仕様であり、ルールに一致しなかったものは「パス」されるようです。
実際にやってみる
以下の構成図をもとに作ってみます。
今回はデモのため、最小限の構成で検証してみます。
事前準備
事前準備としてFirewall Subnet、Protected Subnetはすでに作成している前提で進めます。
またProtected SubnetにApacheをインストールしたEC2(Amazon Linux2)を起動している前提で話を進めます。
/var/www/html/index.html
にHello AWS
と表示されるように設定しています。
ファイアウォールの作成
VPCの画面の左ペインからネットワークファイアウォール -> ファイアウォールを選択しファイアウォールを作成します。
ファイアウォール名は任意です。
サブネットはFirewall Subnet専用で作成したサブネットを選択します。
空のポリシーを作成して関連付けます。
[ルールの評価順序]については[厳密な順序 – 推奨]を選択します。
この[厳密な順序], [アクションの順序]はアクションの評価順序を設定できるか、できないかの違いがあります。
[アクションの順序]のルール評価順はパス -> ドロップ -> アラートの順番でルール評価を行いますが、この順番は固定となります。
対して[厳密な順序]は上記の順番を入れ替えることが可能です。
ドロップアクションは[確立された接続のパケットをドロップ]を選択します。
※確立された接続のパケットをドロップとは: どのステートフルルールにも一致しない場合の新たな接続を確立しようとするパケットは、ルールに一致しないためドロップするということです。
例えば、
- IPアドレス 192.168.0.1/24の範囲からのトラフィックを許可する
- ポート80, 443のトラフィックは許可する
というルールを設定していた場合、上記ルールに一致しない場合はパケットはドロップされます。
上記の内容でファイアウォールを作成します。
ファイアウォールの作成が完了すると、設定したFirewall SubnetにFirewall Endpointが作成されます。
ファイアウォールルールグループの作成
今回はステートレスルールで設定していきます。
左ペインのファイアウォールポリシーから空で作成されたポリシーを選択します。
ステートレスルールグループの[アクション]からステートレスルールグループを作成します。
以下左の画像が送信先(EC2インスタンスのプライベートIPアドレス/Port:80)へのインバウンド通信
右の画像が送信元、戻りの通信の設定です。
ルールアクションはパスを設定して、EC2インスタンスへの80番ポートへの通信を許可します。
これでルールグループを作成します。
ルートテーブルの設定
Firewall-IGW-rtbの設定
Internet Gatewayにアタッチするルートテーブルを作成し、Edge関連付けでInternet Gatewayにアタッチします。
ProtectedSubnetに通信を向けます。
ProtectedSbunet-rtbの設定
Firewall Endpointを経由するように通信を向けます。
送信先は0.0.0.0/0ですが、ターゲットをFirewall EndpointにすることでFirewall Endpointを経由してInternet Gatewayへ向かうようになります。
Protected Subnetへの関連付けを設定する。
Firewall Subnetに関してはルートをInternet Gatewayへ向けます。
これでEC2にアクセスしてみます。
アクセスできることが確認できます。
それでは実際にFirewallの設定でアクセスを拒否できるかを確認してみます。
インバウンドの通信を「ドロップ」に変更して再度EC2にアクセスしてみます。
アクセスできなくなることが確認できました。
理解するまでにかなりの時間を要しましたが、今回ハンズオンを通して一通り設定してみて、理解が深まりました。