AWSの「ネットワークACL」を攻略せよ!ルール番号とショートカットの秘密
こんにちは、クラウドアーキテクトの筆者です。
AWSでインフラを構築し始めると、必ずと言っていいほどぶつかる壁が「セキュリティ」ですよね。特にVPC(仮想ネットワーク)におけるネットワークACL(NACL)は、まるで「我が家の門番」のような存在です。
今日は、初心者の方が陥りやすい「NACLのルール番号」の罠と、パケットがどう処理されるのかという「ショートカット(短絡評価)」の仕組みについて、一緒に紐解いていきましょう。
—
NACLは「超厳格な門番」である
AWSにはセキュリティグループ(SG)とNACLという2つの門番がいます。SGが「インスタンス」を守るボディーガードなら、NACLは「サブネット(区画)」そのものを守る、少し気難しい門番です。
NACLの最大の特徴は、「ルール番号が小さい順に評価される」ということ。そして、「一度マッチしたら、そこで思考停止(評価終了)」するという点です。これを専門用語で「短絡評価(ショートサーキット)」と呼びます。
—
郵便配達で例える「ルール番号」のルール
想像してみてください。あなたは巨大なマンションの管理室にいます。届いた郵便物(パケット)を、ルールに従って「受け取る(Allow)」か「追い返す(Deny)」か判断する仕事です。
管理室には、以下のルールリストが貼ってあります。
1. ルール番号 100: 郵便番号「123-4567」は「拒否(Deny)」!
2. ルール番号 200: 郵便番号「123-0000」〜「999-9999」は「許可(Allow)」!
ここで、「123-4567」宛ての郵便物が届きました。
ルール番号100を見た瞬間、「お、これは拒否対象だ!」と判明しますよね。すると、あなたは迷わずその郵便物を追い返します。
たとえルール番号200に「それ以外は全部受け取れ!」と書いてあっても、あなたはもうルール番号100で判断を終えているので、200番のルールは一生目にすることはありません。 これが「短絡評価」の正体です。
—
実践!NACL設計の注意点
もし、設計をミスして以下のように書いてしまったらどうなるでしょうか?
- ルール番号 100: 許可(Allow) – 全ての通信
- ルール番号 200: 拒否(Deny) – 特定の怪しいIPアドレス
この場合、全ての通信がルール番号100で「許可!」と判定されてしまい、ルール番号200の拒否設定は完全に無視(スルー)されます。門番が100番のルールを見て「よし、通れ!」と言った後に、200番を確認することはないからです。
現場でよくある失敗を防ぐための設定例
AWS CLIやコンソールでNACLを設定する際は、以下のように「拒否したいもの」を先に、そして「許可したいもの」を後に配置するのが鉄則です。
# AWS CLIでネットワークACLのエントリを作成するイメージ
# 1. 最初に「拒否」ルールを若い番号で登録
aws ec2 create-network-acl-entry \
--network-acl-id acl-12345678 \
--ingress \
--rule-number 100 \
--protocol tcp \
--port-range From=80,To=80 \
--cidr-block 192.168.1.50/32 \
--rule-action deny # ここで「拒否」を先に評価させる
# 2. 次に「許可」ルールを大きい番号で登録
aws ec2 create-network-acl-entry \
--network-acl-id acl-12345678 \
--ingress \
--rule-number 200 \
--protocol tcp \
--port-range From=80,To=80 \
--cidr-block 0.0.0.0/0 \
--rule-action allow # 拒否されなかったものだけがここに来る
—
SREからのアドバイス:番号は「10刻み」で空けておけ!
現場のベテランが必ずやること。それは、ルール番号を「1, 2, 3…」と詰め込まないことです。
100: 許可
110: 許可
120: 拒否
このように、10刻みで番号を振っておけば、後から「あ、このIPだけ急いで遮断しなきゃ!」という時に、115といった番号を使って新しいルールを差し込むことができます。
もしルールを 1, 2, 3 と詰めて書いていたら、新しいルールを追加するために既存のルールをすべて書き直す必要が出てきます。これは本番環境では非常に危険な操作ですよね。
—
まとめ:今回のポイント
1. NACLは「小さい番号」から順に評価される!
2. マッチした時点で評価終了(ショートサーキット)!
3. 「拒否」ルールは必ず「許可」ルールより若い番号に配置する!
4. 番号は将来の変更を見越して「10刻み」で空けておく!
ネットワークのトラブルシューティングをしていると、「なぜか通信が遮断されない」「なぜか全部通ってしまう」といった事象によく遭遇します。そんな時は、パケットがどのルール番号で「ストップ」しているかを想像してみてください。
NACLは一見冷たい門番ですが、ルールさえ正しく理解すれば、あなたのクラウド環境を守る最高に頼もしい相棒になりますよ。一歩ずつ、確実に理解を深めていきましょう!
コメント