今日やったこと

  • セキュリティグループとネットワークACLの違いを整理した
  • セキュリティグループは、EC2などのリソース単位で通信を制御することを確認した
  • ネットワークACLは、サブネット単位で通信を制御することを確認した
  • ステートフルとステートレスの違いを確認した
  • 許可ルールと拒否ルールの扱いが異なることを整理した

学んだこと

セキュリティグループとは

セキュリティグループは、EC2インスタンスなどのリソースに適用する仮想ファイアウォール。

主に、次のような通信を制御する。

- インバウンド通信
- アウトバウンド通信

たとえば、WebサーバーにHTTPS通信を許可する場合は、インバウンドルールにTCPの443番ポートを追加する。

プロトコル: TCP
ポート: 443
送信元: 0.0.0.0/0

セキュリティグループには許可ルールだけを設定でき、明示的な拒否ルールは設定できない。

セキュリティグループはステートフル

セキュリティグループはステートフルに動作する。

ステートフルとは、許可した通信に対する戻りの通信が自動的に許可される仕組み。

たとえば、インバウンドでHTTPS通信を許可した場合、そのリクエストに対するレスポンスは、アウトバウンドルールに関係なく戻すことができる。

クライアント
  ↓ HTTPSリクエスト
EC2
  ↑ レスポンスは自動的に許可

通信の往復をひとまとまりとして追跡しているイメージ。

ネットワークACLとは

ネットワークACLは、サブネットに適用する通信制御の仕組み。

サブネットへ入る通信と、サブネットから出る通信を制御する。

インバウンド:
  サブネットに入ってくる通信

アウトバウンド:
  サブネットから出ていく通信

セキュリティグループがリソース単位であるのに対し、ネットワークACLはサブネット単位で適用される。

ネットワークACLはステートレス

ネットワークACLはステートレスに動作する。

ステートレスでは、行きの通信と戻りの通信を別々に評価する。

たとえば、インバウンドでHTTPS通信を許可しても、戻りの通信をアウトバウンド側でも許可する必要がある。

クライアント
  ↓ インバウンドルールで許可
EC2
  ↑ アウトバウンドルールでも許可が必要

戻りの通信では、クライアント側のエフェメラルポートを許可する必要がある場合もある。

ネットワークACLでは拒否ルールを設定できる

ネットワークACLでは、許可ルールと拒否ルールの両方を設定できる。

ALLOW:
  通信を許可する

DENY:
  通信を拒否する

ルールには番号が付いていて、小さい番号から順番に評価される。

最初に一致したルールが適用され、それ以降のルールは評価されない。

ルール100: 特定IPを拒否
ルール200: その他を許可

このように、特定のIPアドレスだけを明示的に拒否する設定ができる。

違いを整理する

項目 セキュリティグループ ネットワークACL
適用単位 EC2などのリソース サブネット
動作 ステートフル ステートレス
許可ルール 設定できる 設定できる
拒否ルール 設定できない 設定できる
ルールの評価 許可ルールをまとめて評価 番号の小さい順に評価
戻り通信 自動的に許可 明示的な許可が必要

基本はセキュリティグループを使う

通常の通信制御では、まずセキュリティグループを使用する。

たとえば、Webサーバーなら次のような設定が考えられる。

インターネット
  ↓ 443番ポート
ALB
  ↓ アプリケーション用ポート
EC2

EC2のセキュリティグループでは、送信元としてALBのセキュリティグループを指定できる。

これにより、インターネット全体からEC2への直接アクセスを許可せず、ALB経由の通信だけを許可できる。

ネットワークACLは追加の防御に使う

ネットワークACLは、サブネット全体に対する追加の防御として利用できる。

たとえば、次のような場合に使われる。

- 特定のIPアドレスを明示的に拒否したい
- サブネット単位で通信を制限したい
- セキュリティグループとは別の防御層を設けたい

ただし、ステートレスで戻り通信の設定も必要になるため、セキュリティグループより設定が複雑になりやすい。

まとめ

セキュリティグループとネットワークACLは、どちらもVPC内の通信を制御する仕組みだが、役割が異なる。

セキュリティグループ:
  リソース単位
  ステートフル
  許可ルールのみ

ネットワークACL:
  サブネット単位
  ステートレス
  許可・拒否ルールを設定可能

SAAの問題では、次のように判断するとよさそう。

EC2やALBなど、個別リソースへの通信を制御したい
  → セキュリティグループ

サブネット全体を制御したい
特定IPを明示的に拒否したい
  → ネットワークACL

次にやること

  • パブリックサブネットとプライベートサブネットの違いを整理する
  • Internet GatewayとNAT Gatewayの違いを整理する
  • ステートレス通信で必要になるエフェメラルポートを整理する
  • ALBとEC2のセキュリティグループ設計を整理する