前回は、VPC の中にサブネットを置き、インターネットゲートウェイとルートテーブルを設定しました。今回は、VPC の中に置くサーバなどのリソースを外部からのアクセスから守るセキュリティグループを確かめます。セキュリティグループの考え方を整理したあと、Web サーバ用のセキュリティグループを1つ作ります。
- セキュリティグループの役割と、ステートフルなファイアウォールの動き
- インバウンドルールの書き方(タイプ、プロトコル、ポート範囲、ソース)
- アウトバウンドルールの初期値と、作成後の確認
- セキュリティグループとネットワーク ACL の違い
前提条件
次の記事で作った VPC(MyVPC)に、セキュリティグループを作ります。先に読んでおくと、この記事の構成がわかりやすくなります。
セキュリティグループとは
セキュリティグループは、VPC の中のリソースに適用するステートフルなファイアウォール(フィルタ)です。インターネットのユーザーが、AWS の中の Web サーバ(EC2 インスタンス)にアクセスする場合を考えます。セキュリティグループは、次の図のように Web サーバを守るファイアウォールとして働きます。
セキュリティグループは、守る対象のリソース(ここでは Web サーバのインスタンス)に関連付け(アタッチ)します。ルールは IP アドレス(またはセキュリティグループ)とプロトコル、ポート番号で書き、通信の向きによってインバウンドルールとアウトバウンドルールの2種類があります。
外部からの Web アクセスを通すには、Web サーバに関連付けたセキュリティグループのインバウンドルールで、HTTP(TCP 80)を許可します。これで、外部から Web サーバへの HTTP の接続が通るようになります。
ステートフルな動き
セキュリティグループはステートフルです。インバウンドルールで許可した通信に対する応答(Web サーバからのレスポンス)は、アウトバウンドルールに関係なく、自動で通過できます。そのため、レスポンスのためにアウトバウンドルールを書く必要はありません。
逆向きも同じです。インスタンスから外に出した通信が許可されていれば、その応答は、インバウンドルールに関係なくインスタンスまで戻ります。
ルールの評価のしかた
セキュリティグループに書けるのは「許可」のルールだけで、「拒否」のルールは書けません。リソースに複数のセキュリティグループを関連付けた場合は、すべてのセキュリティグループのルールがまとめられ、1つのルールの集まりとして評価されます。どれか1つのルールに合えば、その通信は許可されます。
| 項目 | セキュリティグループ | ネットワーク ACL |
|---|---|---|
| 適用する単位 | インスタンスなどのリソース | サブネット |
| ルールの種類 | 許可のみ | 許可と拒否 |
| 評価のしかた | すべてのルールを見てから判断する | ルール番号の小さい順に見て、最初に合ったルールで決める |
| 戻りの通信 | 自動で許可(ステートフル) | 明示的に許可が必要(ステートレス) |
VPC には、サブネット単位で効くネットワーク ACL というフィルタもあります。この記事ではリソースに直接効くセキュリティグループを使います。
セキュリティグループの設定
ここからは、外部から HTTP(TCP 80)と SSH(TCP 22)だけを許可するセキュリティグループを作ります。セキュリティグループは VPC のコンソールで設定します。VPC ›› セキュリティ ›› セキュリティグループ を開き、「セキュリティグループを作成」をクリックします。
基本的な詳細を入れる
セキュリティグループの名前と説明を入れ、適用する VPC を選びます。
この記事の画面は、実際の画面ではなく、検証時(2021年)の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。AWS のコンソールは画面の構成や表記がよく変わるので、今の画面とは違うことがあります。セキュリティグループや VPC の ID は省いています。
| 1セキュリティグループ名 | WebSV-SG 作成後に名前を編集することはできません。 |
| 2説明 | WebServer |
| 3VPC | MyVPC |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | セキュリティグループ名 | WebSV-SG。名前は作成後に変えられないので、用途がわかる名前にします。 |
| 2 | 説明 | WebServer。説明も作成後には変えられません。 |
| 3 | VPC | MyVPC。セキュリティグループは、ここで選んだ VPC のリソースに関連付けて使います。 |
インバウンドルールを設定する
作ったばかりのセキュリティグループには、インバウンドルールが1つもありません。セキュリティグループには許可のルールしか書けないので、この状態ではインバウンドの通信はすべて通りません。通したい通信を、ルールとして1つずつ足していきます。
「ルールを追加」をクリックすると、ポート番号や送信元のアドレスを指定する行が追加されます。
| タイプ | プロトコル | ポート範囲 | ソース |
|---|---|---|---|
| 1カスタム TCP | 2TCP | 0 | 3カスタム |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | タイプ | 通信の種類を選びます。HTTP や SSH のような決まったタイプを選ぶと、プロトコルとポート範囲は自動で入ります。 |
| 2 | プロトコル/ポート範囲 | タイプで決まります。カスタム TCP などのカスタムのタイプを選んだときだけ、ポート範囲を自分で入れます。 |
| 3 | ソース | 通信を許可する送信元です。次の「送信元を指定する」で説明します。 |
プロトコル(ポート番号)を指定する
HTTP の通信を許可するには、タイプで HTTP を選びます。プロトコルは TCP、ポート範囲は 80 が自動で入ります。
タイプは HTTP のほかにも、次のようなものを選べます。一覧にないポート番号を使いたいときは、カスタム TCP や カスタム UDP を選んでポート範囲を入れます。
| 分類 | 検証時の画面で選べたタイプ |
|---|---|
| カスタム | カスタム TCP、カスタム UDP、カスタム ICMP – IPv4、カスタム ICMP – IPv6、カスタムプロトコル |
| すべて | すべての TCP、すべての UDP、すべての ICMP – IPv4、すべての ICMP – IPv6、すべてのトラフィック |
| よく使うサービス | SSH、SMTP、DNS (UDP)、DNS (TCP)、HTTP、POP3、IMAP、LDAP、HTTPS、SMB、SMTPS、IMAPS、POP3S、NFS、RDP、WinRM-HTTP、WinRM-HTTPS など |
| データベース | MSSQL、MYSQL/Aurora、PostgreSQL、Oracle-RDS、Redshift |
送信元(ソース)を指定する
ソースは、次の4つから選びます。
| 1ソース | カスタムAnywhere-IPv4 Anywhere-IPv6 マイ IP CIDR ブロック0.0.0.0/0 0.0.0.0/8 0.0.0.0/16 ::/0 ⋮セキュリティグループdefault | sg-… ⋮ |
| ソース | 登録される値 | 使いどころ |
|---|---|---|
| カスタム | 入力した CIDR ブロック、またはセキュリティグループ | 特定のネットワークや、特定のセキュリティグループを付けたリソースからだけ許可する |
| Anywhere-IPv4 | 0.0.0.0/0 | すべての IPv4 アドレスから許可する(公開 Web サーバの HTTP など) |
| Anywhere-IPv6 | ::/0 | すべての IPv6 アドレスから許可する |
| マイ IP | いまコンソールを操作している PC のパブリック IPv4 アドレス | 作業 PC からの SSH など、自分だけに許可する |
カスタムでは、検索欄に 111.111. のようにアドレスの一部を入れると、111.111.0.0/16 や 111.111.0.0/24 のような CIDR ブロックの候補が出ます。候補から選ぶか、CIDR ブロックをそのまま入れます。
カスタムでセキュリティグループを指定すると、そのセキュリティグループを関連付けたリソースが送信元になります。たとえば、DB サーバのセキュリティグループのソースに Web サーバのセキュリティグループを指定すると、Web サーバのインスタンスからだけ(プライベート IP アドレスでの通信を)許可できます。IP アドレスを書かずに済むので、インスタンスを増やしてもルールを書き換える必要がありません。
今回のインバウンドルール
今回は、すべての IPv4 アドレスからの HTTP と SSH を許可します。
| タイプ | プロトコル | ポート範囲 | ソース |
|---|---|---|---|
| 1HTTP | TCP | 80 | Anywh… 0.0.0.0/0 |
| 2SSH | TCP | 22 | Anywh… 0.0.0.0/0 |
| No. | タイプ | 設定内容 |
|---|---|---|
| 1 | HTTP | TCP 80 を、すべての IPv4 アドレス(Anywhere-IPv4、0.0.0.0/0)から許可します。 |
| 2 | SSH | TCP 22 を、すべての IPv4 アドレスから許可します。 |
この検証では SSH もすべての IPv4 アドレスから許可していますが、実際に使うときは、SSH(TCP 22)や RDP(TCP 3389)のソースを特定の IP アドレスや範囲に絞ります。作業 PC からだけ入れればよい場合は、ソースに「マイ IP」を選ぶのが手軽です。
アウトバウンドルールを確かめる
アウトバウンドルールには、作成時から「すべてのトラフィックを、すべての送信先(0.0.0.0/0)に許可する」ルールが1つ入っています。外向きの通信を絞りたいときは、このルールを消して、許可したい通信だけをルールにします。今回は外向きの通信は制限しないので、そのままにします。
| タイプ | プロトコル | ポート範囲 | 送信先 |
|---|---|---|---|
| 1すべてのトラフィック | すべて | すべて | カスタム 0.0.0.0/0 |
アウトバウンドルールを全部消すと、外向きの通信は通らなくなります。ただし、インバウンドルールで許可した通信の応答は、ステートフルなので、アウトバウンドルールがなくても返せます。
作成して確かめる
設定が終わったら、画面の下の「セキュリティグループを作成」をクリックします。作成が終わると、次のようなメッセージが表示されます。
| セキュリティグループ ID | セキュリティグループ名 | VPC ID | 説明 |
|---|---|---|---|
| 2sg-… | WebSV-SG | vpc-… | WebServer |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 正常に作成されました(緑) | セキュリティグループができました。sg- で始まる ID が割り当てられます。 |
| 2 | 一覧の WebSV-SG の行 | VPC ›› セキュリティ ›› セキュリティグループ の一覧にも追加されています。VPC ID が MyVPC のものになっているかを確かめます。 |
セキュリティグループは、作った VPC のリソースに関連付けて使います。現在は「Security Group VPC Association」の機能で、同じリージョンのほかの VPC にセキュリティグループを関連付けることもできます。
リソースへの適用
作ったセキュリティグループは、EC2 インスタンスやロードバランサなどのリソースに関連付けて使います。EC2 インスタンスの作成時にセキュリティグループを選ぶ手順は、次の記事で確かめています。
まとめ
| 項目 | この記事の設定 | ポイント |
|---|---|---|
| 名前/説明 | WebSV-SG/WebServer | 作成後に変えられない |
| VPC | MyVPC | この VPC のリソースに関連付ける |
| インバウンドルール | HTTP(TCP 80)と SSH(TCP 22)を 0.0.0.0/0 から許可 | 初期値はルールなし。SSH のソースは絞る |
| アウトバウンドルール | 初期値のまま(すべてのトラフィックを許可) | 応答の通信はステートフルで自動で許可される |
セキュリティグループは、許可のルールだけを書くステートフルなファイアウォールです。通したい通信をインバウンドルールに書けば、その応答は自動で返ります。つながらないときは、タイプ(ポート番号)とソースが合っているか、そのセキュリティグループがリソースに関連付けられているかを確かめます。
コメント