AWS CLF(Cloud Practitioner)対策
SGとネットワークACL
セキュリティグループとネットワークACL
このレッスンを終えると、AWS にある2つのファイアウォールを、適用対象と挙動の違いから区別できるようになります。CLF で最も出題されやすい比較のひとつです。
ufw を設定したときのことを思い出す
Linux サーバーを1台建てたとき、ufw や firewalld でこんな設定を書いたはずです。22番と80番と443番だけ許可して、あとは全部落とす。ここで一度も書かなかったものがあります。戻りの通信の許可です。80番への着信を許可しただけで、そのリクエストに対する応答は何も書かずに返っていきました。これは ufw が接続の状態を覚えていて、行きを許した通信の帰りを自動で通すからです。この性質をステートフルと言います。
一方、昔ながらのルーターの ACL は状態を覚えません。行きの許可と帰りの許可を、2行に分けて自分で書く必要がありました。これがステートレスです。
AWS にはこの両方があります。セキュリティグループがステートフル、ネットワーク ACL がステートレスです。
2つの違い
| 観点 | セキュリティグループ | ネットワーク ACL |
|---|---|---|
| 適用される場所 | インスタンス (ENI) 単位 | サブネット単位 |
| 状態を覚えるか | ステートフル。戻りは自動で通る | ステートレス。戻りも明示的に許可する |
| ルールの種類 | 許可のみ書ける | 許可と拒否の両方が書ける |
| 評価のしかた | すべてのルールをまとめて見る | 番号の小さい順に見て、最初に一致したもので決まる |
| 既定の状態 | インバウンドは全拒否、アウトバウンドは全許可 | 既定のものは全許可 |
覚え方としては、セキュリティグループはサーバー1台に付ける門番、ネットワーク ACL は区画の入口に立つ検問所という対比が使えます。門番はインスタンスに付くので、同じサブネットに置いた2台に別々のルールを当てられます。検問所はサブネットに付くので、そのサブネットに出入りするすべての通信が対象になります。
もうひとつ重要なのが、拒否を書けるのはネットワーク ACL だけという点です。セキュリティグループには許可のルールしか書けません。特定の IP アドレスからのアクセスをブロックしたいという要件は、セキュリティグループでは表現できないので、ネットワーク ACL の出番になります。
通信が届くまでの順番
インターネットからプライベートなアプリサーバーへ通信が届くまでを並べると、次の順に検査されます。
- ルートテーブル — そもそもその宛先への経路があるか
- ネットワーク ACL — サブネットの入口で許可されているか
- セキュリティグループ — インスタンスの手前で許可されているか
通信が届かないときは、この3つのどこで止まっているかを順に見ます。
試験ではこう出る
言い換えのパターンは次のとおりです。
- 「ステートフルなファイアウォール」「戻りのトラフィックを自動的に許可する」 — セキュリティグループ
- 「ステートレス」「インバウンドとアウトバウンドを個別に設定する必要がある」 — ネットワーク ACL
- 「特定の IP アドレスをブロックしたい」「拒否ルールを書きたい」 — ネットワーク ACL
- 「サブネットレベルで制御したい」 — ネットワーク ACL
- 「インスタンスレベルで制御したい」「EC2 ごとに違うルールを当てたい」 — セキュリティグループ
引っ掛けとして頻出なのが、「セキュリティグループで特定の IP を拒否する」という選択肢です。もっともらしく見えますが、セキュリティグループに拒否ルールという概念が無いので誤りです。逆に「ネットワーク ACL をインスタンスに関連付ける」も、適用単位がサブネットなので誤りになります。
まとめ
- セキュリティグループはインスタンス単位でステートフル、許可ルールだけを書く
- ネットワーク ACL はサブネット単位でステートレス、許可と拒否の両方を番号順に評価する
- 拒否を書きたい要件はネットワーク ACL しか満たせない
- 両方を通過して初めて通信が届くので、2つは置き換えではなく重ね掛けの関係になる
復習ミニクイズ
特定のグローバル IP アドレスからのアクセスを、サブネット全体に対してブロックしたいです。最も適切なものはどれですか。