AWSのネットワークセキュリティを学ぶとき、必ずぶつかるのが「セキュリティグループ(SG)」と「ネットワークACL(NACL)」の違いです。
どちらもトラフィックを制御する仕組みですが、動作の仕方がまったく異なります。この違いを理解していないと、設定したつもりなのに通信できない・意図しないトラフィックが通ってしまうといったトラブルに直結します。
この記事では、SGとNACLの違いを基礎から整理したうえで、実務でどう使い分けるかまで解説します。AWS認定試験(SAA・SOA)の対策としても役立つ内容です。
セキュリティグループとネットワークACLの基本的な違い
まず結論から言います。
| セキュリティグループ(SG) | ネットワークACL(NACL) | |
|---|---|---|
| 適用対象 | EC2インスタンス(ENI) | サブネット |
| ステート | ステートフル | ステートレス |
| 拒否ルール | 書けない(許可のみ) | 許可・拒否どちらも書ける |
| ルール評価 | 全ルールを評価して許可 | 番号順に評価して最初にマッチで終了 |
| デフォルト(インバウンド) | 全拒否 | 全許可 |
| デフォルト(アウトバウンド) | 全許可 | 全許可 |
この表だけでも頭に入れておけば、試験でも実務でも迷いにくくなります。以下では各ポイントをひとつずつ掘り下げていきます。
適用対象の違い:インスタンスvsサブネット
セキュリティグループはインスタンス(正確にはENI:ネットワークインターフェース)に紐づくファイアウォールです。同じサブネット内に複数のEC2があっても、インスタンスごとに異なるSGを設定できます。
一方、ネットワークACLはサブネット全体に適用されます。そのサブネットに入ってくるトラフィック・出ていくトラフィックをまとめて制御します。
イメージとしては次のように捉えると理解しやすいです。
- NACL → 街の入り口にある検問所(サブネット単位で全員チェック)
- SG → 建物の受付(インスタンス単位で個別にチェック)
トラフィックはまずNACLを通過し、その後SGで判定されます。両方を通過して初めて通信が成立します。
ステートフルとステートレスの違い
ここが最も重要なポイントです。
セキュリティグループはステートフル
ステートフルとは、行きのトラフィックを許可すると、戻りのトラフィックも自動で許可されるという意味です。
たとえばインバウンドでポート443(HTTPS)を許可した場合、そのレスポンスのアウトバウンドトラフィックは自動的に許可されます。アウトバウンドにわざわざルールを追加する必要はありません。
ネットワークACLはステートレス
ステートレスとは、行きと帰りを個別に設定しないといけないという意味です。
インバウンドでポート443を許可しても、レスポンスのアウトバウンドは別途許可が必要です。このとき、レスポンスはエフェメラルポート(1024〜65535)を使って返ってくるため、アウトバウンドでエフェメラルポートの範囲を許可しておく必要があります。
これを忘れると「インバウンドは許可したのに通信できない」という状況が発生します。実務でも試験でもよく引っかかるポイントです。
拒否ルールの違い
セキュリティグループは「許可リスト」しか作れない
SGは許可するルールしか書けません。ルールに書かれていないトラフィックは自動的に拒否されますが、「このIPを明示的にブロックする」というルール自体は存在しません。
つまり、特定の攻撃元IPを名指しでブロックしたい場合、SGでは対応できません。
ネットワークACLは「許可」も「拒否」も書ける
NACLは許可・拒否の両方のルールを書けます。特定のIPアドレスやCIDRブロックを明示的にDENYすることが可能です。
DDoS攻撃や不審なアクセスをブロックしたいときは、NACLに拒否ルールを追加するのが定石です。
ルール評価順序の違い
セキュリティグループは全ルールを評価
SGはすべてのルールを評価し、どれか1つでも許可ルールに一致すれば通過できます。順番は関係ありません。
ネットワークACLはルール番号順に評価
NACLはルール番号の小さい順から評価し、最初にマッチしたルールで処理が終了します。
たとえば次のようなルールがある場合:
- ルール100:192.168.1.0/24 → ALLOW
- ルール200:192.168.1.10/32 → DENY
192.168.1.10からのアクセスはルール100でALLOWされて終了します。ルール200には到達しません。特定のIPを拒否したい場合は、許可ルールより小さいルール番号に拒否ルールを設定する必要があります。
実務での使い分け
概念の違いを理解したところで、実際の現場でどう使い分けるかを整理します。
セキュリティグループをメインに使う
日常的なアクセス制御はSGで行うのが基本です。インスタンスごとに細かくルールを設定でき、ステートフルなので管理も楽です。
- Webサーバー:ポート80・443のインバウンドを許可
- DBサーバー:WebサーバーのSGからポート3306のみ許可
- 踏み台サーバー:特定のオフィスIPからのSSHのみ許可
SGはソースにIPだけでなく別のSGを指定できるのも強みです。上記のDBサーバーの例のように、「WebサーバーのSGが付いたインスタンスからのアクセスのみ許可」という書き方が可能です。IPが変わっても自動で追従するため、Auto Scalingとの相性が抜群です。
ネットワークACLは「追加の防衛ライン」として使う
NACLはサブネット全体に適用されるため、大きな単位での制御に向いています。実務では次のような場面で活躍します。
- 特定IPをブロック:攻撃元のIPをDENYルールで遮断
- サブネット間の通信制限:本番サブネットと開発サブネットの通信を制限
- コンプライアンス対応:特定の国・地域からのアクセスを一括ブロック
ただし、NACLのルール管理は煩雑になりがちです。ステートレスなのでエフェメラルポートの設定を忘れると通信断の原因になります。変更する際は影響範囲をよく確認してから行いましょう。
Auto Scalingが絡む場合はNACLに注意
Auto Scalingで新しいサブネットが追加された場合、SGは動的に対応できますが、NACLは新しいサブネットのCIDRを手動で追加しないといけません。
これを忘れると「一部のユーザーだけDB接続できない」という問題が起きます。Auto Scalingを使う構成では、NACLのルールをCIDRベースではなく広めのレンジで設定しておくか、定期的に見直す運用が必要です。
AWS試験で狙われるポイント
SAA・SOAでよく出る問題パターンをまとめます。
- 「特定のIPを明示的にブロックしたい」→ NACL(SGは拒否ルールを書けない)
- 「ステートレスなのでインバウンドとアウトバウンド両方設定が必要」→ NACL
- 「エフェメラルポートの許可が必要」→ NACLのアウトバウンド設定
- 「Auto Scaling後に一部ユーザーがDB接続できない」→ NACLに新サブネットのルールが未追加
- 「SGのソースに別のSGを指定」→ 動的なIP変化に対応できる
まとめ
セキュリティグループとネットワークACLの違いを改めて整理します。
- SGはインスタンス単位・ステートフル・許可のみ・全ルール評価
- NACLはサブネット単位・ステートレス・許可と拒否・番号順評価
- 日常的なアクセス制御はSGをメインに使う
- 特定IPのブロックや追加の防衛ラインとしてNACLを補助的に使う
- NACLはステートレスなのでエフェメラルポートの設定を忘れずに
両者は「どちらか一方を使う」ものではなく、多層防御として組み合わせて使うのがAWSのベストプラクティスです。それぞれの役割を理解して、適切に使い分けてみてください。

コメント