インフラと通信のセキュリティ
AWSのセキュリティグループ (SG) と ネットワークACL (NACL) は、どちらもインターネットからのアクセスを制御する「門番」ですが、役割と振る舞いに大きな違いがあります。
アパートのセキュリティに例えるSGとNACL
バックエンドエンジニアにとって、この2つのコンポーネントは、構築するアプリケーションへのトラフィックを制御する基本的な防御層となります。
セキュリティグループ (SG):EC2インスタンスの「部屋のドア」
セキュリティグループは、AWSでいうと、EC2インスタンス(アプリケーションサーバー)に直接適用される、ステートフルなファイアウォールです。これは、個々の部屋のドアのセキュリティに例えられます。
| SGの役割 | アパートの例え | エンジニア観点 |
|---|---|---|
| 適用単位 | 各部屋(個人の居住空間) | 個々のEC2インスタンス(Webサーバー、DBサーバーなど) |
| 制御対象 | ドアを通る出入り | インスタンスへのアクセス(特定のポートとプロトコル) |
| ルールの振る舞い | ステートフル(鍵の出入りの記録) | 往復の通信が自動許可される |
| 例 | 許可された人が入ったら、その人が持ち出した荷物はチェックなしで持ち帰れる | Inbound (443/TCP) を許可すれば、Outbound (応答) は自動的に許可される |
ステートフルのメリット:
SGは通信セッションの状態を記憶しているため、明示的に戻りのルールを書く必要がありません。Webサーバー (80/443) の通信制御は、通常このSGのみで行うため、設定がシンプルになります。
ネットワークACL (NACL):サブネットの「敷地全体への通用門」
ネットワークACLは、AWSでいうと**サブネット(ネットワーク区画)**全体に適用される、ステートレスなファイアウォールです。これは、アパートの敷地全体への通用門のセキュリティに例えられます。
| NACLの役割 | アパートの例え | エンジニア観点 |
|---|---|---|
| 適用単位 | 敷地全体(共通の入り口) | サブネット(VPC内のネットワーク区画全体) |
| 制御対象 | 敷地へ入る・出るすべての通行人 | サブネットに出入りするすべてのトラフィック |
| ルールの振る舞い | ステートレス(都度IDチェック) | 往復の通信を明示的に許可する必要がある |
| 例 | 入るときもIDチェック、出るときも再度IDチェックが必要 | Inbound (443/TCP) を許可しても、Outbound (応答の戻り) は明示的に許可する必要がある |
ステートレスの注意点:
NACLは状態を記憶しないため、Webサーバーからの応答(Outbound)が戻れるよう、エフェメラルポート(一時的に使用される高位ポート)のOutboundルールを明示的に開ける必要があります。これを忘れると通信が成立しません。
エンジニアとしての使い分け
推奨される設計
・メインの防御:通常、アプリケーションのポート制御はセキュリティグループで行います。設定が簡単でステートフルであるため、アプリケーションの通信要件を満たしやすいです。
・追加の防御:NACLは、IPアドレス単位での広範囲なアクセス拒否 (Deny) や、サブネットの境界でのより厳格なネットワーク層の制御を行いたい場合に、SGの上に重ねて使用します。NACLはデフォルトで* Deny(すべて拒否)のルールがあるため、特に慎重な設定が必要です。
この二層構造で防御することで、堅牢なネットワークセキュリティをVPC内で実現できます。