本記事は TechHarmony Advent Calendar 12/24付の記事です。 |
こんにちは、SCSK齋藤でございます。
今回は、最近業務で調べる機会が多かったAWS Network Firewallについて、学んだことをアウトプットしたいと思います。
AWS Network Firewallとは?
AWSから提供される、VPC全体に適用されるファイアウォール型マネージドサービスです。
数クリックでファイアウォール自体は作成でき、ステートフルやステートレスのアクセス制御、Webフィルタリング、IPS/IDSといった幅広い機能が使えます。
VPCの前面に配置することで、インターネットからVPCに入ってくる通信に対してチェックを行うファイアウォールということです。
ファイアウォールとのことなので、個人的にはセキュリティグループやネットワークACLとの違いが最初よくわからなかったのですが、検証を踏まえて使ってみたことで、違いが見えてきました。
構成要素
AWS Network Firewallには主に3つの構成要素がございます。
Firewall
その名の通り、ファイアウォールそのものです。数クリックで作成することができ、それをVPCやサブネットにアタッチします。
インターネットからVPCに入ってくる通信をチェックするので、パブリックサブネットに配置する必要がございます。
ファイアウォールそのものですが、これ単体ではパケットのチェックなどは実施しないので、後述する2つが必要となります。
ファイアウォールポリシー
ファイアウォールの動作を定義したものです。後述するルールグループを紐づけることで、ステートレスもしくはステートフルなチェックを実施します。
ルールグループ
ネットワークトラフィックのルールの集合体です。1つのルールグループに複数のルールを追加することができ、優先順位づけを実施することができます。
5つの項目 (送信元IP、送信元ポート番号、宛先IP、宛先ポート番号、プロトコル番号)を細かく定義することができ、またその項目に対する挙動(通信をパスするか、ドロップするか、別のルールに分岐するかなど)も定義することができます。
ハンズオン
構成
今回は下記のような構成で通信を行い、インスタンスにSSHをしてみたいと思います。
パブリックサブネットにAWS Network Firewallを配置し、専用のサブネットとします。
その背後のプライベートサブネットにEC2を配置することで、外部からの通信は必ずAWS Network Firewallを通って、EC2のあるサブネットに疎通するようにします。
なお、今回のハンズオンではネットワークの設定や、EC2の立ち上げは省略いたします。
Firewallの作成
まずは、前述したFirewallを作成します。
基本的にマネジメントコンソールの内容に沿って設定を実施します。
VPC単位で適用されるサービスであるのと、Firewallを設置するサブネットの選択が必須になります。
また、ファイアウォールポリシーについてはこの段階で作成を行います。
ファイアウォールポリシーを作成する際に注意すべきは、デフォルトのアクションをどうするかです。
この後作成する、ルールグループでの評価に何もマッチしなかった場合に、通信を許可するか、拒否するかなどを設定することができます。
通常、セキュリティのことを考えたら、ルール評価にマッチしない場合は通信を拒否するのが普通かなと考えたので、今回はデフォルトで拒否するようにします。
下記のように準備が整ったら、「ファイアウォールを作成」を押下して作成します。作成には結構時間がかかるので、待ちましょう。
ルールグループの作成
ファイアウォールポリシーに、具体的なルールを設定するための、ルールグループを作成します。
ルールグループには2種類があり、「ステートレスルールグループ」と「ステートフルルールグループ」があります。
評価の順序については、下記ドキュメントに記載されている通り、「ステートレスルールグループ」→「ステートフルルールグループ」の順番となります。「ステートフルルールグループ」を作成しない場合は、「ステートレスルールグループ」のみの評価となります。
ルールグループは複数作成してアタッチし、評価順序を設定できるので、より柔軟に設定が可能です。
今回は1つだけのルールグループを作成しました。
今回は上記のようなルールで、特定のインスタンスに、自宅のネットワークからのみSSHを許可するアクションを追加しました。
ステートレスで作成したので、行きの通信と戻りの通信それぞれのルールを設定する必要がありますね。
前述したようにファイアウォールポリシーのデフォルトのアクションが、拒否という設定をしたので、今回のルールグループの評価にマッチしない場合は、通信が全部拒否されます。
ファイアウォールポリシーとの関連付け
作成したルールグループをファイアウォールポリシーにアタッチします。
私はこれを忘れたまま、SSHの接続を試みて、全然アクセスができないという事象に陥りました。。。
ファイアウォールポリシーの画面に遷移し、ステートレスルールグループの「アクション」から、「アンマネージドステートレスルールグループを追加」をクリックします。
事前作成したルールグループを選択し、「ステートレスルールグループを追加する」を押下します。
これで、ルールグループの内容をもとに、ファイアウォールがパケットを評価する準備が整いました。
動作検証
SSH通信が許可されるかどうか
では早速、インスタンスにSSHをしてみましょう。
問題なく、SSH接続をすることができました。
私が前述した通り、最初はルールグループをファイアウォールポリシーにアタッチするのを忘れていたのですが、ルールグループなしでSSH接続してみたらどうなるかを再度試してみましたところ、、
接続できませんでした。これは、ファイアウォールポリシーのデフォルトのアクションが拒否になっているので、通信が拒否されたものとなります。
セキュリティグループとの関係性はどうなのか?
ひとつ気になることとして、セキュリティグループとの関係性はどういうものなのか気になりました。
試しに、EC2のセキュリティグループで外部からのアクセスを許可する設定を入れなかった場合にどうなるか試してみたところ、SSH接続できませんでした。
これは、AWS Network FirewallがVPC単位でのファイアウォールなのに対して、セキュリティグループはインスタンス単位でのファイアウォールになるためです。
なので、AWS Network FirewallでVPC内への通信を許可しても、インスタンスの直前に立つセキュリティグループがブロックすれば、通信はできないということですね。
まとめ
今回は、AWS Network Firewallが何をできるのか知るために検証してみました。
ファイアウォールということで、セキュリティグループなどとはどう違うのかが1番気になっていたので、VPC単位での設定や、複数のルールグループをアタッチし順番に評価することが可能な点がわかり、より柔軟なアクセスコントロールができるのだと感じました。