AWSネットワークの「番人」を理解する:セキュリティグループとNACLの賢い使い分け
クラウドインフラの設計を始めると、必ずと言っていいほど直面するのが「セキュリティグループ(SG)」と「ネットワークACL(NACL)」という二人の番人の存在です。
「どっちもパケットを遮断するものだよね? なんで二つもあるの?」
初めてAWSを触るエンジニアが必ず抱くこの疑問。今日は、この二つの違いを「郵便配達」に例えながら、現場で事故を起こさないための「使い分けの極意」を紐解いていきましょう。
—
1. 郵便配達で例える「二重の防衛線」
ネットワークのセキュリティを考えるとき、私はよく「マンションの防衛」をイメージします。
セキュリティグループ(SG):各部屋の「玄関の鍵」
セキュリティグループは、インスタンスという「各部屋のドア」についている鍵です。
- ステートフル(帰りを覚えている): 友達を部屋に招き入れたら(許可)、帰りはわざわざ鍵を開け直さなくてもスムーズに出られますよね。SGも同じで、「許可した通信の戻り」は自動的に通してくれます。
- ホワイトリスト方式: 基本的に「誰が通れるか」を細かく指定する、まさに玄関のセキュリティです。
ネットワークACL(NACL):マンション全体の「門番」
一方、NACLはマンションの敷地入り口に立つ「門番」です。
- ステートステートレス(記憶がない): 門番は非常に厳格です。「行き」のチェックと「帰り」のチェックを個別に厳しく行います。行きを許可しても、帰りの通信を許可するルールがなければ門番に止められてしまいます。
- ブラックリスト・ホワイトリスト両対応: 「特定の怪しいIPからのアクセスを即座に門前払いする(ブロック)」といった、広範囲なフィルタリングが得意です。
—
2. なぜNACLが必要なのか?
「SGがあれば十分じゃない?」と思うかもしれません。しかし、現場ではNACLがないと詰むケースがあります。
例えば、「特定の悪意あるIPアドレスから、サブネット内の全サーバーに対して大量の攻撃が来ている」という事態を想像してください。SGで一台ずつ設定を書き換えていたら日が暮れてしまいますよね。
NACLなら、サブネットの入り口でそのIPを「Deny(拒否)」にするルールを1行追加するだけで、そのサブネット全体を瞬時に守ることができます。これがNACLの最大の強み、「広範囲の一括遮断」です。
—
3. 実践!NACLの設計パターン
NACLを設定する際、必ず覚えておくべきは「番号」と「ルール」の関係です。NACLは番号が小さいルールから順に適用されます。
NACL設定の基本テンプレート
AWS CLIでNACLのルールを追加するイメージをコードにしてみましょう。
# 1. 特定の攻撃元IP(192.0.2.100)からの通信をサブネットの入り口で遮断する
aws ec2 create-network-acl-entry \
--network-acl-id acl-0123456789abcdef0 \
--ingress \
--rule-number 100 \
--protocol -1 \
--rule-action deny \
--cidr-block 192.0.2.100/32 # このIPからの通信は門前払い
# 2. 戻りの通信を許可するために、エフェメラルポート(1024-65535)を開ける
# ※NACLはステートレスなので、帰り道の許可も明示的に書く必要があります
aws ec2 create-network-acl-entry \
--network-acl-id acl-0123456789abcdef0 \
--egress \
--rule-number 100 \
--protocol tcp \
--port-range From=1024,To=65535 \
--rule-action allow \
--cidr-block 0.0.0.0/0
設計のポイント
- SGをメインに使う: 基本的なアクセス制御は、管理が楽でステートフルなSGで行いましょう。
- NACLは「最後の砦」: NACLはあくまで「緊急時の全体遮断」や「特定のIPのブロック」といった、サブネット単位での制御が必要な時にだけ使うのがベストプラクティスです。
- 戻りの通信を忘れない: 前述の通り、NACLは行きと帰りを個別に設定する必要があります。Webサーバー(HTTP/HTTPS)を運用する場合、
1024から65535の範囲を許可しないと、画面が真っ白になって通信できない……というトラブルがよくあります。
—
まとめ:一歩ずつ理解を深めよう
最初は難しく感じるNACLの「ステートレス」という性質も、「マンションの門番は、行きと帰りを別々にチェックするんだ」とイメージすれば、少し親しみやすくなりませんか?
1. セキュリティグループ: 個別対応(ステートフル)
2. NACL: 広域対応(ステートレス・ブラックリスト活用)
この二つを適材適所で使い分けることができれば、あなたのクラウドインフラはより強固で、かつ運用しやすいものになります。
まずは、皆さんの環境のデフォルトNACLが「全て許可(Allow All)」になっていることを確認するところから始めてみてください。それが、ネットワークセキュリティの第一歩です!
コメント