AWS SAA(Solutions Architect - Associate)対策

SGとNACLの設計

このレッスンを終えると、通信要件の文を読んで、セキュリティグループで書くべきか、ネットワーク ACL で書くべきか、両方が要るのかを判断できるようになります。

まず要件から

ある企業が、ALB の後ろに Web サーバー、その後ろに RDS という3層構成を組んでいます。運用中に、特定の IP アドレス帯から不正なアクセスが続いたため「このサブネット全体で、その IP 帯を丸ごと落としたい」という要望が出ました。担当者はセキュリティグループに拒否ルールを書こうとしています。

これは書けません。セキュリティグループには許可ルールしか書けず、拒否ルールは存在しません。特定の相手を落としたいなら、ネットワーク ACL の Deny ルールを使います。この一点だけで正解が決まる問題が本番でも出ます。

2つの違い

セキュリティグループネットワーク ACL
効く場所ENI(インスタンス単位)サブネット単位
書けるルール許可のみ許可と拒否の両方
状態の扱いステートフル。戻りの通信は自動で通るステートレス。戻りの通信も明示的に許可が要る
評価の仕方全ルールを合わせて判定番号の小さいルールから順に評価し、最初に一致したもので決まる
相手の指定IP のほか他のセキュリティグループ ID も指定できるIP アドレス帯のみ
既定インバウンドは全拒否、アウトバウンドは全許可既定のものは全許可

実務でも試験でも、通常の許可設計はセキュリティグループで行い、ネットワーク ACL は既定のまま触らないのが基本形です。ネットワーク ACL を持ち出すのは、特定の相手を明示的に落とす要件が書かれているときだけと覚えます。

ステートレスの落とし穴

ネットワーク ACL でインバウンドの 443 だけを許可し、アウトバウンドを絞ると通信が壊れます。戻りのパケットは、クライアント側が使った一時的なポート番号あてに返るためです。ネットワーク ACL でアウトバウンドを制限するなら、この一時ポートの範囲を許可しなければなりません。セキュリティグループはステートフルなので、この考慮は要りません。

試験では「443 のインバウンドを許可したのに応答が返らない」という症状で問われます。症状を見たらネットワーク ACL のアウトバウンドを疑います。

3層をセキュリティグループで書く

多層防御の型は、IP ではなくセキュリティグループ ID を参照して連ねることです。

インバウンドで許可する相手ポート
ALB のセキュリティグループ0.0.0.0/0443
Web のセキュリティグループALB のセキュリティグループ ID80
RDS のセキュリティグループWeb のセキュリティグループ ID3306

この書き方なら、Auto Scaling でインスタンスが入れ替わって IP が変わってもルールを直す必要がありません。要件文に「インスタンスが動的に増減する」「IP が固定されない」とあれば、この参照方式が正解です。CIDR で書く選択肢は、動きはしますが増減のたびに保守が要るので負けます。

要件語から構成へ

要件文の言い回し選ぶもの
特定の IP 帯からのアクセスを遮断したいネットワーク ACL の Deny ルール
サブネット全体に一律の制限をかけたいネットワーク ACL
Web からだけ DB に届くようにしたいRDS 側 SG で Web の SG ID を許可
インスタンスが増減しても設定を変えたくないSG ID の参照
インバウンドは許可したのに応答が返らないNACL のアウトバウンドと一時ポート
アプリケーション層の攻撃を防ぎたいAWS WAF を ALB や CloudFront に付ける
大規模な DDoS への対策を強化したいAWS Shield Advanced

最後の2行は層が違います。SQL インジェクションのようなリクエストの中身に基づく防御は、セキュリティグループでもネットワーク ACL でもできません。要件文に攻撃の種類が書かれていたら WAF を選びます。

よくある引っ掛け

ひとつめは、セキュリティグループで拒否ルールを書く選択肢です。存在しないので即座に落とせます。

ふたつめは、ネットワーク ACL の評価順です。番号 100 で許可し、番号 200 で同じ相手を拒否しても、先に一致した許可で確定します。落としたいなら小さい番号に置きます。

まとめ

  • セキュリティグループは ENI 単位、ステートフル、許可のみ
  • ネットワーク ACL はサブネット単位、ステートレス、拒否も書ける
  • 明示的に遮断したい要件が出たときだけネットワーク ACL を持ち出す
  • 多層防御はセキュリティグループ ID を参照して連ねる
  • リクエストの中身に基づく防御は WAF の担当
生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部

復習ミニクイズ

ある企業が VPC 内で 3 層の Web アプリケーションを運用しています。Web 層は Auto Scaling で台数が増減し、プライベート IP は固定されません。この Web 層のインスタンスからのみ RDS への接続を許可し、台数が増減しても設定変更が不要な構成にしたいと考えています。適切な設定はどれですか。