AWSの検証を行っているときにネットワークACL(Access Control List)とセキュリティグループの違いについて調べたので、これを起点にAzureとのIaaSにおけるネットワークセキュリティについて比較しようと思いました。
AzureのNetwork Security Group(NSG)
まずはAzureから。
AzureのNSGはステートフルです。
IaaSのNIC、若しくはIaaSの存在するサブネットに対してインバウンドかアウトバウンドかを選択し、以下の5タプル(要素)で通信の制御を行います。
1. Source IP Address
2. Destination IP Address
3. Protocol
4. Source Port
5. Destination Port
AWSのネットワークセキュリティ
AWSのネットワークセキュリティもステートフルです。
AWSのIaaSの存在するVPCに対してインバウンドかアウトバウンドかを選択し、以下の3つの要素で通信の制御を行います。
1. プロトコル
2. ポート
3. Source IP Address
AWSのネットワークACL
AWSのネットワークACLはステートレスです。
AWSのIaaSの存在するVPC内のサブネットに対してインバウンドかアウトバウンドかを選択し、ネットワークセキュリティと同じ3つの要素で通信の制御を行います。
ただし、ステートフルなため、インバウンドルールに対しては対象の通信のレスポンスにあたるアウトバウンド方向の通信も許可しなければならず、インバウンドルールに対してもレスポンスにあたるアウトバウンドルール方向の通信も許可しなければなりません。
ネットワーク層におけるステートフルとステートレスの違いは何か?
はい。
ここで本題です。
ステートレス:AWSのネットワークACLは許可したい通信に対して、レスポンスの通信を許可しなければならない
ステートフル:AzureのNSGやAWSのネットワークセキュリティは、インバウンドであれアウトバウンドであれ、許可したい通信のみを許可し、許可したい対象のレスポンスの通信は許可する必要がない
これがステートレスとステートフルの違いです。
ステートレスとステートフル、どちらが優れているのか?
優劣はありません。
場合によって制御しやすい方を選択します。
ルーターなどによくある機能のSPIはStateful Packet Inspectionの略で、ステートフルに通信制御を行う機能です。
ちょっと分かりにくいんで具体的な例を挙げてくれませんか?
そうですよね。
ステートフルな通信制御機能を持つルーターでアウトバウンド方向にAny Any Permit、インバウンド方向にAny Any Denyの設定を行うとどうなるでしょうか?
正解はアウトバウンド方向はどのような通信も許可し、インバウンド通信はどのような通信も拒否します。
まぁこの辺はまだわかりやすい、想像しやすいと思います。
しかしステートレスな通信制御機能しか持たないルーターで先ほどと同様にアウトバウンド方向にAny Any Permit、インバウンド方向にAny Any Denyの設定を行うとどうなるでしょうか?
正解はルーターから通信のリクエストは出せますが、リクエストに対するレスポンスが一切許可されないため、実際の通信は途絶えてしまいます。
もっとわかりやすく言うと、ステートレスなルーターにアウトバウンド方向にAny Any Permit、インバウンド方向にAny Any Denyの設定を行うと、ルーター配下のあらゆる通信が途絶えます。
つまりインターネットに出れません。
いや、ちょっと意味が分からないので、図で説明してもらえませんか?
はい。
その通りですね。
まずはイメージしやすいステートフルから。
もう普通の通信ですね。
ではステートレス。
はい。
拒否されます。
これがステートレスとステートフルの違いです。
なんでステートレスがあるんですか?全部ステートフルでもいいんじゃないですか?
優劣の話と同じで、場面によってどちらが良いか変わります。
例えばWebアプリケーションのFirewallであればステートフルの方が有効です。
ステートフルは一般のルーターであれば便利ですね。
複雑なこと考えなくて済みます。
AzureとAWS比較するとどうなの?
単純に選択肢が多い方が良いかと思います。
そういう意味では
AWSに軍配が上がると思います。
しかし設定した通りに挙動する、制御がわかりやすい、思った通りの設定がやりやすい、という意味では
Azureの方がトラブルなく設定できて分かりやすいかと思います。
やはりどちらが良い、というのはケースバイケースという結論でしょうか?
本日はここまで。