【AWS】ネットワークACLとセキュリティグループの使い分け
▼|はじめに
オンプレ環境では結構インフラの設計構築をやって来たけど、じゃそれをAWSでやるってなったときに自分の中で悩んだというか、どうあるべきなのか結構考えたポイントの一つがこれ。
・ネットワークACLとセキュリティグループの使い分け
備忘も含めて、設計のポイントというか方針的なものをまとめておこうと思う。
ちなみ、これは私的なメモだけど、世の中広いし自分と同じところでどうなんって考えてた人もいるかも知れないので、そんな人の参考というか検討の材料になれば幸いです。
まずはそもそも、ネットワークACLとは、セキュリティセキュリティグループとは、みたいなところを簡単にまとめました。
▼|ネットワークACLとは
AWSでは、サブネット単位で設定するファイアウォール機能として、ネットワークACLが提供されています。
ネットワークACLは、サブネットに対して1つのみ設定可能で、サブネットへのインバウンドとアウトバウンドのそれぞれのトラフィックに対して制御が行えます。
ネットワークACLはデフォルトで一つ用意されていて、すべてのトラフィックを許可する設定になっています。サブネットを作成すると、まずはこのデフォルトのネットワークACLが自動的に適用されます。
ただし、実際はこのデフォルトのネットワークACLは使わずに、新規にネットワークACLを作成して使用した方が良いと思っています。このデフォルトのネットワークACLは、他のAWSのサービス(まはたリソース)でも初期設定値として使用されるため、敢えて触れずに残しておく方が良いと思っています。
また、ネットワークACLは、インバウンドとアウトバウンドのそれぞれのトラフィックに対して許可ルールと拒否ルールを設定できます。それぞれのルールはルール番号順に適用されるため、設定を行う際はどの順番でルールを適用させるのか意識して設定する必要があります。
で、新規に作成したネットワークACLは、逆にデフォルトですべてのトラフィックを拒否する設定になっていますので、ホワイトリスト形式でルールを追加していけば良いと思います。
最後に、ネットワークACLはステートレスのため、戻りのトラフィックも意識して設定する必要があります。例えば、インバウンドとアウトバウンドの両方ですべてのトラフィックを拒否する設定とした状態で、インバウンドに対してSSH(22番ポート)でのアクセスを許可した場合、アウトバウンドに戻りのトラフィック(49152~65535番ポートなど)を許可する設定を明示的に行う必要があります。
▼|セキュリティグループとは
AWSでは、サブネットに対して適用するネットワークACLとは別に、EC2インスタンスなどに適用するファイアウォール機能として、セキュリティグループを提供しています。
セキュリティグループは、ネットワークACLと同様にインバウンドとアウトバウンドのそれぞれに対してトラフィックの制御が可能となります。
ただし、ネットワークACLとは異なり、インバウンドとアウトバウンドのそれぞれに対して許可ルールのみを設定するホワイトリスト形式の仕様になっています。そして、デフォルトではインバウンドのトラフィックはすべて拒否、アウトバウンドのトラフィックはすべて許可する設定となっています。
なお、ネットワークACLとは違いステートフルのため、戻りのトラフィックを意識して設定する必要はありません。
▼|設計方針
まず、AWSのベストプラクティスでは、ネットワークACLをファイアウォールとして使用して、サブネットレベルでインバウンドとアウトバウンドのトラフィックを制御するよう推奨されています。それと同時に、ネットワークACLはステートレスであり管理が複雑なため、またサブネット全体に影響を与えるという理由から使用は控えめにし、可能な限りセキュリティグループを使用することも推奨されています。
これを踏まえて、以下が設計のポイントです。
①ネットワークACLでは、L3レベルでのトラフィック制御のみを行う。
②ネットワークACLでは、基本的にネットワークセグメント単位でトラフィック制御を行う。
③セキュリティグループでは、L4レベルでのトラフィック制御を行う。
④セキュリティグループでは、基本的にIPアドレスとポート番号でトラフィック制御を行う。
AWSにおけるトラフィック制御は複雑になりがちですが、設計方針をシンプルに明確に定義することで改善可能です。
◆ネットワークACLの設計方針
まず、ネットワークACLでは、サービスポートを含めたL4レベルでのトラフィック制御は行わず、L3レベルでのトラフィック制御のみを行うようにします。
ネットワークACLはステートレスのため戻りのトラフィックを意識する必要があり、その戻りのトラフィックの宛先ポートはエフェメラルポートになります。そのため、かなり広いポートレンジでトラフィックを許可する設定をしなくてはいけないので、もう潔くポートを意識したL4レベルでのトラフィック制御は行いません。少しでもシンプルな設計になるよう、L3レベルでのトラフィック制御のみに専念させます。
また、デフォルトではすべてのトラフィックを遮断し、通信要件としてネットワークセグメント間の通信が必要な場合に限り、ホワイトリスト形式で許可する設定を行います。その際、基本的にはネットワークセグメント単位で許可する設定とし、必要であればIPアドレス単位で行います。
◆セキュリティグループの設計方針
セキュリティグループはステートフルのため、戻りのトラフィックは意識して設定する必要がありません。そのため、ポート番号も含めたL4レベルでのトラフィック制御については、セキュリティグループにて行うようにします。
また、同一ネットワークセグメント内のトラフィック制御も考慮し、基本的にはIPアドレス単位でポート番号も指定して、ホワイトリスト形式でトラフィック制御を行うようにします。
以上、長くなりましたが、ネットワークACLとセキュリティグループの使い分けによる設計のポイントの私的まとめになります。
ぶっちゃけ、ネットワークACLは全オープンにして、すべてセキュリティグループでトラフィック制御を行うという振り切って頑張るという選択肢もありかもですが、どうせ機能があるのであれば使うってことで。。。