こんにちは、ラーニングエクスペリエンス課の小倉です。
私は AWS 認定インストラクター (AAI) として AWS 公式トレーニングの講師をしているのですが、先日、丸5日間連続で講師をするということを初めて経験しました。なかなかハードでしたが、楽しかったです!
サーバーワークスでは、自由に勉強会を開催してスキルアップをしています。その中で私は毎週月曜日の朝、「30分AWSハンズオン」という30分でできるAWSハンズオンを2021年9月から継続して開催しています。その内容をブログで定期的に紹介していきます。AWSをご利用のみなさまのスキルアップにお役立ていただければと考えています。
4回目は、「セキュリティグループとネットワークACLの違いを確認してみよう」をやります。どちらも仮想ファイアウォールの機能ですが、手を動かしながら動作の違いについて確認します。
ハンズオンの内容は、VPCを作成してその中にEC2を作成します。EC2にアタッチしたセキュリティグループにicmpを許可しておきます。以下の3パターンでクライアントからEC2に対してping(疎通確認用のコマンド)を実行し、動作の違いを確認します。
1. ネットワークACLとセキュリティグループですべて許可した状態
2. セキュリティグループのアウトバウンドのルールを削除した状態
3. ネットワークACLのアウトバウンドの許可ルールを削除した状態
使用するAWSサービス
Amazon VPC
VPCとはAWS内で作成できる仮想ネットワークです。VPCの機能の中に仮想ファイアウォールのセキュリティグループとネットワークACLがあります。機能に違いがあるので、以下の表にまとめました。
セキュリティグループ | ネットワークACL |
リソース単位 | サブネット単位 |
許可をインバウンドとアウトバウンドで設定 | 許可/拒否をインバウンドとアウトバウンドで設定 |
ステートフルのため、レスポンスの通信は考慮不要 | ステートレスのため、レスポンスの通信も明示的に許可が必要 |
全てのルールをチェックして通信可否を判断 | ルール番号の小さい順にチェックし、通信内容に合致するルールで通信可否を判断 |
以下、補足です。
クライアントサーバーモデルとは、クライアントとサーバーで役割をわけ、ネットワークで接続する方式のこと。
ステートフルはクライアントサーバーモデルでサーバーへのリクエストの通信がファイアウォールのインバウンドで許可されていれば、レスポンスの通信がアウトバウンドで許可されていなくても通信できる仕組みのこと。
ステートレスはクライアントサーバーモデルでサーバーへのリクエストの通信がファイアウォールのインバウンドで許可されていて、かつレスポンスの通信も明示的にアウトバウンドで許可すると通信できる仕組みのこと。
参考サイト: [AWS Black Belt Online Seminar]Amazon VPC
Amazon EC2
AWS上に仮想サーバーを提供するためのサービスです。インスタンスという単位で仮想サーバーが管理され、マネジメントコンソールから数クリックで、VPCのサブネット内にすぐに作成することができます。
参考サイト: [AWS Black Belt Online Seminar]Amazon EC2
構成図
今回の構成図です。
VPCの中にEC2を構築します。クライアントからEC2に対してpingを実行し、セキュリティグループやネットワークACLの設定を変更したときの疎通性を確認します。
ハンズオン手順
1. VPCを作成します
まず、VPCを作成します。デフォルトVPCを使ってもよいのですが、ネットワークACLの変更をするので、最後は設定を変更して元に戻すのではなく作成したVPCを削除することで元の状態に戻します。
AWSマネジメントコンソールにログインし、画面上の検索窓で「VPC」と入力し、サービスの下に表示された [VPC] をクリックしVPCのコンソール画面を開きます。また今回のハンズオンは東京リージョンで実施しますので、右上のリージョンが東京になっていない場合は東京に変更しておきましょう。
ナビゲーションペイン(左メニュー)の [お使いのVPC] をクリックしてVPC一覧の画面を表示した後、右上の [VPCを作成] をクリックします。
VPCを作成 の画面が表示されるので、以下を設定します。
・作成するリソース: VPCなど
・名前タグの自動生成: yyyymmdd (yyyymmdd は年月日で、例えば2023年5月20日なら 20230520 となります)
・アベイラビリティゾーン(AZ)の数: 1
下にスクロールし、さらに以下を設定し、[VPCを作成] をクリックします。
・パブリックサブネットの数: 1
・プライベートサブネットの数: 0
・VPCエンドポイント: なし
VPCやサブネットなどをまとめて作成してくれます。VPC, サブネットなどを個別で作成することもできるのですが、検証用ですので、楽な手順で実施しました。
以下の画面が表示されたら [VPCを表示] をクリックします。
作成したVPCの詳細画面が表示されます。
これでVPCの作成が完了しました。
2. EC2を作成します
クライアントからの通信先として使用するEC2を作成します。
画面上の検索窓で「EC2」と入力し、サービスの下に表示された [EC2] をクリックしEC2のコンソール画面を開きます。また今回のハンズオンは東京リージョンで実施しますので、右上のリージョンが東京になっていない場合は東京に変更しておきましょう。
ナビゲーションペイン(左メニュー)の [インスタンス] をクリックしてインスタンス一覧の画面を表示した後、右上の [インスタンスの作成] をクリックします。
インスタンスを起動の画面が表示されますので、どのようなEC2をつくるのかを設定していきます。
名前とタグでインスタンスの名前をつけます。今回は yyyymmdd-handson-ec2 としておきます(yyyymmdd は年月日で、例えば2023年5月20日なら 20230520 となります)。
画面を下にスクロールして、アプリケーションおよび OS イメージ (Amazon マシンイメージ) で、[Amazon Linux] をクリックします。
ここで起動するOSを選択できます。Amazon Linux の最新バージョンは Amazon Linux 2023 なのですが、今回は Amazon Linux 2 に変更します。
画面を下にスクロールして、インスタンスタイプは、t2.micro のままにしておきます。
ここではインスタンスのスペックを指定しています。スペックが低いと価格が安く、スペックが高いと価格も高くなります。インスタンスタイプの中に料金が書かれていますので、間違えて料金の高いインスタンスを作ってしまうと高額請求がきてしまうかもしれませんので、注意しましょう。
画面を下にスクロールして、Key pair (login) でキーペアの指定をします。今回はEC2にログインしませんので、キーペアなしで続行 を選択します。
画面を下にスクロールして、ネットワーク設定の横にある [編集] をクリックします。
ネットワーク設定が編集できようになったら、まず VPC を手順1で作成したVPC (yyyymmdd-vpc) にします。パブリックIPの自動割り当ては 有効化 にします。
次にセキュリティグループの設定をします。セキュリティグループは仮想ファイアウォールです。ルールに合致する通信のみ許可することができます。
セキュリティグループを作成するを選択し、セキュリティグループ名と説明を入力します(例: yyyymmdd-handson-ec2-sg)。インバウンドセキュリティグループのルールでタイプを すべてのICMP - IPv4 , ソースタイプを 自分のIP に変更します。
インバウンドは外からインスタンスへの通信を表しています。自分のIPはみなさんのパソコンがインターネットに接続するときに使っているグローバルIPアドレスを設定しています。ですから、このルールではみなさんのパソコンからEC2インスタンスへping通信を許可する設定をしています。
画面を下にスクロールして、ストレージを設定 は変更せずにそのままにしておきます。
ここまで入力できたら画面右か下にある [インスタンスを起動] をクリックします。
クリックするとインスタンスの作成がはじまり、5分程度で利用可能になります。
以下の画面が表示されるので、 [すべてのインスタンスを表示] をクリックし、インスタンス一覧の画面を表示します。
作成したインスタンスのステータスチェックが、2/2のチェックに合格しました と表示されれば起動完了です。作成したEC2インスタンスにチェックを入れ、パブリックIPアドレスをコピーして控えておきましょう。
これでEC2の作成が完了しました。
3. クライアントからEC2へ疎通性を確認しよう
EC2の準備ができましたので、クライアントからEC2へ疎通確認コマンドのpingを実行します。
①ネットワークACLとセキュリティグループですべて許可した状態
セキュリティグループ | ネットワークACL | |
インバウンド | 許可 | 許可 |
アウトバウンド | 許可 | 許可 |
私のクライアントはWindowsなので、コマンドプロンプトを起動して実行しました。コマンドプロンプトの起動方法は画面左下の検索窓に cmd と入力するとコマンドプロンプトが表示されるので、クリックすると起動できます。
コマンドプロンプトに ping <IPアドレス> を入力してEnterを押します。
応答というメッセージが表示されれば、通信が可能ということが確認できています。今回はセキュリティグループとネットワークACLのすべてが許可されているため、通信が可能となっています。
②セキュリティグループのアウトバウンドのルールを削除した状態
許可と拒否の関係は以下になります。
セキュリティグループ | ネットワークACL | |
インバウンド | 許可 | 許可 |
アウトバウンド | 拒否(許可ルールがない) | 許可 |
セキュリティグループのアウトバウンドのルールを削除します。
EC2のコンソール画面を開き、ナビゲーションペイン(左メニュー)の [インスタンス] をクリックしてインスタンス一覧の画面を表示した後、作成したEC2インスタンスにチェックを入れます。
画面下のセキュリティタブをクリックし、表示されたセキュリティグループのリンクをクリックします。
セキュリティグループの詳細設定画面が表示されるので、画面下のアウトバウンドルールタブをクリックし、右下の [アウトバウンドのルールを編集] をクリックします。
アウトバウンドルールの右にある [削除] をクリックしてルールを削除し、[ルールを保存] をクリックします。
セキュリティグループの詳細画面に戻り、アウトバウンドのルールが削除されていることが確認できます。
準備ができましたので、pingを実行します。
セキュリティグループはステートフルですので、インバウンドが許可されていればアウトバウンドは明示的に許可していなくても通信できます。このことを実際に設定してみて確認しました。
③ネットワークACLのアウトバウンドの許可ルールを削除した状態
許可と拒否の関係は以下になります。
セキュリティグループ | ネットワークACL | |
インバウンド | 許可 | 許可 |
アウトバウンド | 拒否(許可ルールがない) | 拒否 |
ネットワークACLのアウトバウンドのルールを削除します。
EC2のコンソール画面を開き、ナビゲーションペイン(左メニュー)の [インスタンス] をクリックしてインスタンス一覧の画面を表示した後、作成したEC2インスタンスにチェックを入れます。
画面下のネットワークタブをクリックし、表示されたサブネットIDのリンクをクリックします。
表示されたサブネットにチェックを入れ、画面下のネットワークACLタブをクリックし、表示されたネットワークACLのリンクをクリックします。
表示されたネットワークACLにチェックを入れ、画面下のアウトバウンドルールタブをクリックし、右下の [アウトバウンドルールを編集] をクリックします。
アウトバウンドルールの右にある [削除] をクリックしてルールを削除し、[変更を保存] をクリックします。
ネットワークACLの詳細画面に戻り、アウトバウンドルールが削除されていることが確認できます。
準備ができましたので、pingを実行します。
今回は要求がタイムアウトとなり、通信できない状態になりました。
ネットワークACLはステートレスですので、インバウンドとアウトバウンドをそれぞれ明示的に許可しなければ通信できなくなります。アウトバウンドを拒否したため通信できなくなったことを確認しました。
4. 後片付け
AWSのリソースは従量課金のため、作ったまま放置しておくとお金がかかってしまいます。そのため、ハンズオンが終わったら不要なリソースは削除しておきましょう。
今回のハンズオンで料金が発生するのはEC2インスタンスだけですが、不要な設定は削除して整理しておきましょう。
EC2インスタンスを削除します。
EC2のコンソール画面を開き、ナビゲーションペイン(左メニュー)の [インスタンス] をクリックしてインスタンス一覧を開きます。今回作成したインスタンスにチェックを入れ、右上の [インスタンスの状態] - [インスタンスの終了] をクリックします。
確認の画面が表示されるので、 [終了] をクリックします。
インスタンスの削除が始まり、数分経つとインスタンスの状態が終了済みに変わり、削除が完了します。
今回作成したVPCを削除します。VPCを削除すると関連するサブネットやセキュリティグループなどをまとめて削除してくれます。
VPCのコンソール画面を開き、ナビゲーションペイン(左メニュー)の [お使いのVPC] をクリックしてVPC一覧を開きます。今回作成したVPCにチェックを入れ、右上の [アクション] - [VPCの削除] をクリックします。
VPCの削除の確認画面が表示されるので、入力フィールドに 削除 と入力して、[削除] をクリックします。
これで今回のハンズオンは以上となります。
まとめ
今回はセキュリティグループとネットワークACLの動作の確認を行いました。ステートフルとステートレスの処理を混同することがありますが、実際に動作を確認することで理解がしやすくなると考えています。AWSはすぐに作れて、不要になればすぐに削除もできますので、いろいろなものを作って確認してみましょう。
参考資料
小倉 大(記事一覧)
アプリケーションサービス部エデュケーショナルサービス課 札幌在住
AWSトレーニングの講師をしています。
最近は7歳の息子と遊ぶのが楽しいです!
Twitter: @MasaruOgura