【AWS】VPCのセキュリティグループとネットワークACLの違いを徹底比較!初心者向けにやさしく解説
生徒
「先生、AWSのVPCで『セキュリティグループ』と『ネットワークACL』ってよく出てきますけど、どう違うんですか?」
先生
「どちらも通信を制御するための機能ですが、適用される単位やルールの性質が違います。セキュリティグループはインスタンス単位、ネットワークACLはサブネット単位で適用されるんですよ。」
生徒
「なるほど…。じゃあ両方使う意味ってあるんですか?」
先生
「もちろんです。多層的なセキュリティ対策として、それぞれの特性を活かすことで安全なVPC設計ができます。それじゃ、詳しく説明していきますね。」
1. セキュリティグループとは?VPCにおける役割と特徴
セキュリティグループは、AWS VPC(Virtual Private Cloud)内でEC2インスタンスなどのリソースに対して通信の「許可」ルールを定義する仮想ファイアウォールです。
主な特徴は以下の通りです:
- インスタンス単位で適用される
- ステートフル:受信を許可したら送信も自動許可される
- 許可ルールのみ設定可能(拒否ルールは不可)
- インバウンド(受信)とアウトバウンド(送信)の両方を設定可能
たとえば、以下のようにSSHとHTTPを許可する設定がよく使われます:
タイプ: SSH
プロトコル: TCP
ポート範囲: 22
送信元: 0.0.0.0/0
タイプ: HTTP
プロトコル: TCP
ポート範囲: 80
送信元: 0.0.0.0/0
2. ネットワークACL(NACL)とは?サブネット単位のアクセス制御
ネットワークACLは、VPC内のサブネットに対して適用されるアクセス制御リストで、セキュリティグループとは異なる制御が可能です。
主な特徴はこちらです:
- サブネット単位で適用される
- ステートレス:戻りの通信も明示的に許可が必要
- 許可ルールと拒否ルールの両方を定義できる
- ルールには番号があり、昇順で評価される
NACLでは以下のようなルールを定義できます:
ルール番号: 100
タイプ: HTTP
プロトコル: TCP
ポート範囲: 80
送信元: 0.0.0.0/0
許可/拒否: 許可
ルール番号: 110
タイプ: すべてのトラフィック
プロトコル: ALL
送信元: 0.0.0.0/0
許可/拒否: 拒否
3. セキュリティグループとNACLの違いを表で比較
セキュリティグループとネットワークACLの違いを以下の表にまとめました:
| 項目 | セキュリティグループ | ネットワークACL |
|------------------------|-----------------------------|---------------------------|
| 適用範囲 | インスタンス | サブネット |
| ステートフル/ステートレス | ステートフル | ステートレス |
| ルールの種類 | 許可のみ | 許可・拒否両方 |
| 戻りの通信の自動許可 | あり | なし(明示的に設定必要) |
| 評価順序 | 全て適用 | 番号の小さい順に評価 |
両者は目的が違うため、使い分けが重要です。セキュリティグループは主にアプリケーション層での制御、NACLはネットワーク層での制御といえます。
4. セキュリティ強化のための使い分けと併用例
セキュリティグループとNACLは併用することで、より強固なセキュリティを実現できます。例えば以下のように使い分けましょう:
- セキュリティグループ:EC2ごとの細かな通信制御
- NACL:VPC全体やサブネット単位での広範な制御
具体例:
セキュリティグループではWebサーバーに対してTCP 80を許可しつつ、NACL側ではそれ以外のトラフィックを明示的に拒否するなど。
セキュリティグループ
└── 許可: TCP 80, TCP 22
NACL
├── 許可: TCP 80(ルール番号100)
├── 許可: TCP 22(ルール番号110)
└── 拒否: ALL(ルール番号120)
5. よくある設定ミスとトラブル回避ポイント
初心者が陥りやすいNACLとセキュリティグループの設定ミスには以下があります:
- NACLのアウトバウンドルールを忘れる:戻りの通信が遮断されて接続できない
- セキュリティグループだけ設定して安心してしまう:NACLで拒否されている可能性あり
- 評価順を理解していない:番号順に処理されるため、後ろのルールが無視される
トラブル時はCloudWatch LogsやVPC Flow Logsを活用すると原因を特定しやすくなります。
6. AWS CLIでセキュリティグループとNACLを設定する
AWS CLIを使って設定することもできます。以下に代表的なコマンドを示します。
# セキュリティグループ作成
aws ec2 create-security-group \
--group-name my-sg \
--description "My security group" \
--vpc-id vpc-xxxxxxxx
# インバウンドルール追加
aws ec2 authorize-security-group-ingress \
--group-id sg-xxxxxxxx \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0
# NACLにルール追加
aws ec2 create-network-acl-entry \
--network-acl-id acl-xxxxxxxx \
--rule-number 100 \
--protocol tcp \
--port-range From=80,To=80 \
--cidr-block 0.0.0.0/0 \
--egress \
--rule-action allow
CLIを使えば、インフラをコード化(IaC)することが可能になり、再現性や管理性が向上します。
7. まとめ
今回は、AWS VPCにおけるセキュリティグループとネットワークACL(NACL)の違いを初心者向けに丁寧に解説しました。どちらもAWSクラウドのネットワークセキュリティを構成する重要なコンポーネントであり、誤った理解のまま運用すると通信障害やセキュリティリスクに直結します。
セキュリティグループはインスタンス単位で適用され、ステートフルであるため「受信を許可すれば、返信の送信も自動で許可される」という性質があります。一方、NACLはサブネット単位で適用され、ステートレスであるため、戻り通信も明示的に許可する必要があります。この違いが、設定時のポイントになります。
また、セキュリティグループは「許可ルールのみ」を設定できるのに対して、ネットワークACLは「許可と拒否の両方」のルールが設定できるため、より厳密な制御が可能です。そのため、セキュリティグループは基本の守り、NACLは追加の防御ラインとして設計するのが一般的です。
実際のシステム設計では、これらを組み合わせて多層的なセキュリティ構成を作ることが求められます。以下のような併用例は実運用でも非常に効果的です:
# セキュリティグループ:WebアクセスとSSHのみ許可
タイプ: HTTP (80), SSH (22)
送信元: 0.0.0.0/0
# ネットワークACL:
ルール番号100:TCP 80 ALLOW
ルール番号110:TCP 22 ALLOW
ルール番号120:ALL DENY(すべて拒否)
さらに、AWS CLIを活用することで、セキュリティ設定をコードで管理し、バージョン管理や自動化に対応できます。特にInfrastructure as Code(IaC)を取り入れている企業やプロジェクトでは、CLIによる操作は欠かせません。
これらの設定や設計の知識は、AWS認定試験(例:SAA、SAP)にも頻出であり、実務においてもトラブルシュートや設計レビューの際に非常に役立ちます。VPCセキュリティの基礎をしっかり理解して、より安全なAWS環境を構築できるようになりましょう。
生徒
「セキュリティグループとネットワークACLって、似てるようで全然使い方が違うんですね!」
先生
「そうですね。セキュリティグループはインスタンス単位で使って、NACLはサブネット全体に適用する。それぞれの特徴を理解して適切に使うことが大切です。」
生徒
「ステートフルとステートレスの違いも印象に残りました。返信が自動で許可されるかどうかって重要ですね!」
先生
「まさにそこがポイントです。特にネットワークACLは戻り通信も忘れず設定しないと、想定通りに通信できません。」
生徒
「CLIでの設定例も勉強になりました。次はTerraformとかにも挑戦してみたいです!」
先生
「素晴らしいですね。IaCを取り入れれば、セキュリティ設定の自動化や再現性が高まります。ぜひ試してみてください。」