AWS セキュリティグループ ハンズオン
はじめに
本記事は、JAWS DAYS 2021内で実施したセキュリティグループのハンズオン資料をZenn記事化したものとなります。
オリジナルのハンズオン資料は以下になります。
対象者
- AWSに入門したばかりの初心者
- セキュリティグループを知らない人
- セキュリティグループを知ってはいるが、使ったことが無い人
必要なもの
- AdministratorAccess権限を持つ、マネジメントコンソールにログイン可能なIAMユーザー
注意事項
本ハンズオンでは以下のような有料のリソースを一部作成します。
- NATゲートウェイ * 1
- ALB * 1
- t2.microのEC2インスタンス * 2
ハンズオンを終了させたら、作成したリソースを忘れずに削除するようにしてください(削除方法は最後に記載しています)。
ハンズオンは20分〜40分程度で完了すると思うので、発生する料金は0.1USD以内で収まるかと思いますが、自己責任でお願いします。
思わぬ高額請求が不安な方は、以下の記事などを参考に、予想請求額が一定額を超えたら通知メールが飛ぶ設定を入れることをお勧めします。
本ハンズオンのゴール
AWSの仮想ファイアウォールであるセキュリティグループを使って、任意の通信を許可/拒否できるようになる
ハンズオン全体の流れ
- ハンズオン用の環境を構築する
- ハンズオン用環境の構成図の解説
- 各ケースに沿ったセキュリティグループを作成、使用してみる
- IPアドレスを限定せず、Webサービスを利用させるケース
- 特定のIPアドレスに対してのみ、Webサービスを利用させるケース
- 特定のリソース同士を相互に通信可能とさせるケース
- ハンズオン用環境を削除する
ハンズオン用の環境を構築する
流れ
- CloudShellの起動
- CloudFormation用ファイルのダウンロード
- CloudFormationの実行
CloudShellの起動の目的
本ハンズオン用の環境構築では、GitやAWS CLIというものを使用します。
GitやAWS CLIは、準備をすればお手元のPC(WindowsやMac)でも使用することはできます。
しかし、本ハンズオンでは、受講者のみなさんがPC環境の差異を理由につまずくことの無いよう、AWSのCloudShellを利用することにします。
CloudShellはブラウザから利用可能で、GitやAWS CLIがインストール済みとなっています。
[作業]CloudShellの起動
- マネジメントコンソール(以下、マネコン)へのログイン
- 以下のURLから、ご自身のAWSアカウントにログインしてください
- https://xxxxxxxxxxxx.signin.aws.amazon.com/console
- xxxxxxxxxxxxxの部分は、ご自身のアカウントID (12桁) またはアカウントエイリアスとなります。
- 以下のURLから、ご自身のAWSアカウントにログインしてください
- CloudShellの起動
- 画面右上に表示されている、以下のマークをクリックし、CloudShellを起動してください
CloudFormationの実行の目的
CloudFormationは、所定の形式のファイルを読み込み、その内容に従ってAWSの各種リソースを自動で作成してくれる、AWSのサービスです。
本ハンズオンではCloudFormation用のファイルを別途用意してありますので、これを使ってAWS上に環境を構築します。
CloudFormationの実行
- CloudFormation用ファイルのダウンロード
- ここでは、GitHub上に存在する本ハンズオン用のCloudFormation用ファイルをダウンロードします。
- CloudShellの画面に、以下コマンドを貼り付けてエンターキーを押してください。
git clone https://github.com/shonansurvivors/security-group-hands-on.git
- CloudFormationの実行
- ここでは、先ほどダウンロードしたファイルを使って、ハンズオン用の環境を構築します。
- CloudShellの画面に、以下コマンドを貼り付けてエンターキーを押してください。
aws cloudformation create-stack --stack-name jaws-sg --template-body file://security-group-hands-on/cloudformation.yml
- 環境構築が完了するまで4〜5分程度かかるので、その間に解説を先に進めます。
ハンズオン用環境の構成図の解説
こちらが、今回のハンズオンで使用する環境の構成図です。
この2台のEC2はWebサーバーの役割を持ちます。
「Hello JAWS!」という内容の画面を表示するように設定済みです。
2台のEC2の手前にあるのはALB(アプリケーションロードバランサー)です。
ユーザーからのアクセスを2台のEC2に振り分け(負荷分散)します。
ALBの手前にあるのはインターネットゲートウェイです。
インターネットとの通信の出入り口となります。
つまり、ユーザーのブラウザからALBにアクセスすると、どちらかのEC2が返却する「Hello JAWS!」が表示されることになります。
次からは、各ケースに沿ったセキュリティグループを作成、使用してみます。
ケース1
IPアドレスを限定せず、誰でもWebサービスにアクセス(HTTP通信)できる。
構成図によるケース1の解説
「Hello JAWS!」を表示するためにブラウザでALBにアクセスします。
ALBにアクセスするには、ALBのDNS名をブラウザのアドレスバーに入力します。
[作業]ALBのDNS名を調べる
マネコンの検索欄にEC2と入力し、EC2を選んでください(ALBはEC2の画面に存在します)。
EC2ダッシュボード画面から、ロードバランサーを選択してください。
jaws-sg-albという名前のALBの説明タブにDNS名が表示されています。
これをコピーしてください。
[作業]ALBにアクセスする
- マネコンが表示されているタブとは別のタブで、アドレスバーにALBのDNS名 + /jaws.htmlと入力してください
- 例 : jaws-sg-alb-0123456789.ap-northeast-1.elb.amazonaws.com/jaws.html
- しかし、ブラウザには何も表示されないはずです
アクセスできない理由
アクセスできない理由は、ALBのセキュリティグループが、インターネットからの通信を拒否しているためです。
この通信を許可するセキュリティグループを作成します。
[作業]セキュリティグループを作成する
マネコンの検索欄にEC2と入力し、EC2を選んでください(セキュリティグループはEC2またはVPCの画面で作成できます)。
EC2ダッシュボード画面から、セキュリティグループを選択してください。
右上の「セキュリティグループを作成」ボタンを押してください。
- セキュリティグループ名と説明欄は何でも良いのですが、それぞれjaws-sg-webと入力してください
- VPCは、jaws-sg-vpcを選んでください
- インバウンドルールのパネルの「ルールを追加」ボタンを押してください
-
タイプ欄では許可する通信の種類を指定します。ここではHTTPを選択してください。
-
ソース欄では許可するIPアドレスの範囲を指定します。ここでは0.0.0.0/0を選択してください。これは全IPアドレスを意味します。
入力が終わったら、右下の「セキュリティグループを作成」ボタンを押してください。
以下のような画面が表示されればセキュリティグループの作成は完了です。
[作業]セキュリティグループをALBに付ける
- 左側のメニューの上部のEC2ダッシュボードを押してください
- 次にロードバランサーを選択してください
jaws-sg-albという名前のALBが選択された状態で、アクションボタンを押し、セキュリティグループの編集を選択してください。
- jaws-sg-webのチェックボックスにチェックを入れてください
- 次に保存ボタンを選択してください
[作業]ALBにアクセスする
- ブラウザでALBのDNS名 + /jaws.htmlにアクセスしてください
- 例 : jaws-sg-alb-0123456789.ap-northeast-1.elb.amazonaws.com/jaws.html
- 以下のようにHello JAWS!と表示されれば成功です
アクセスできた理由
ALBのセキュリティグループが全てのIPアドレスからのHTTP通信を許可するようになったため、「Hello JAWS!」が表示されるようになりました。
[補足]セキュリティグループ以外に必要な条件
なお、VPC内のリソース(ALBやEC2など)が、インターネットからの通信を受け付けるためには、セキュリティグループ以外にも設定が必要なものがあります。
VPCに、インターネットゲートウェイが設置されていること
リソース(今回でいうとALB)の属するサブネットのルートテーブルにおいて、VPC外のIPアドレスに対する通信の向き先がインターネットゲートウェイになっていること
リソース(今回でいうとALB)の属するサブネットと関連付けられているネットワークACLにおいて、VPC外との通信が拒否されていないこと
インターネットからの通信受付に必要な条件は、まとめると以下になります。
- ハンズオン環境構築用のCloudFormationであらかじめ設定済み
- VPCに、インターネットゲートウェイを設置
- ルートテーブルにおいて、VPC外のIPアドレスに対する通信の向き先がインターネットゲートウェイとなっている
- ネットワークACLにおいて、VPC外との通信を許可(AWSのデフォルト設定)
- 本ハンズオンで、みなさん自身で設定したこと
- セキュリティグループにおいて、VPC外のIPアドレスからの通信を許可
以上でケース1は終了です。
ケース2
特定のIPアドレスからのみ、Webサービスにアクセス(HTTP通信)できる。
ケース2 前編
まず最初は、アクセスできない側を体験することにします。
[作業]セキュリティグループの設定変更
マネコンの検索欄にEC2と入力し、EC2を選んでください(セキュリティグループはEC2またはVPCの画面にあります)。
EC2ダッシュボード画面から、セキュリティグループを選択してください。
- jaws-sg-webのチェックボックスにチェックを入れてください
- 右上のアクションを押し、「インバウンドルールを編集」を選択してください
まず、0.0.0.0/0のバツボタンを押して削除してください
次に、適当なIPアドレスとして、192.0.2.1/32を入力してください。
入力が終わったら、右下の「ルールを保存」ボタンを押してください。
[作業]ALBにアクセスする
- ブラウザでALBのDNS名 + /jaws.htmlと入力してください
- 例 : jaws-sg-alb-0123456789.ap-northeast-1.elb.amazonaws.com/jaws.html
- しかし、ブラウザには何も表示されないはずです
アクセスできない理由
アクセスできない理由は、ALBのセキュリティグループが「皆さんのPCがインターネットと通信する時に使用されているIPアドレス」からのHTTP通信を拒否するようになったためです。
ケース2 後編
続いて、アクセスできる側を体験します。
[作業]セキュリティグループの設定変更
- jaws-sg-webのチェックボックスにチェックを入れてください
- 右上のアクションを押し、「インバウンドルールを編集」を選択してください
まず、192.0.2.1/32のバツボタンを押して削除してください。
次にマイIPを選択してください。
- マイIPを選択すると「あなたのPCがインターネットと通信する時に使用されているIPアドレス」が自動入力されます
- そのまま「ルールを保存」ボタンを押してください
[作業]ALBにアクセスする
- ブラウザでALBのDNS名 + /jaws.htmlにアクセスしてください
- 例 : jaws-sg-alb-0123456789.ap-northeast-1.elb.amazonaws.com/jaws.html
- 以下のようにHello JAWS!と表示されれば成功です
アクセスできた理由
ALBのセキュリティグループが「あなたのPCがインターネットと通信する時に使用されているIPアドレス」からのHTTP通信を許可するようになったため「Hello JAWS!」が表示されるようになりました。
以上でケース2は終了です。
ケース3
特定のリソース同士を、相互に通信可能とする。
ケース3はもう実現済みです。
何故そうなっているのか、設定を確認していきましょう。
ALBからEC2への通信について
ALBからは、2台あるEC2それぞれに通信が可能となっています。
通信を受ける側のEC2のセキュリティグループはどうなっているのでしょうか?
確認してみます。
[作業]EC2のセキュリティグループの確認
まず、EC2の設定を確認します。
そのために、マネコンの検索欄にEC2と入力し、EC2を選んでください。
EC2ダッシュボード画面から、実行中のインスタンスを選択してください。
まず、jaws-sg-private-ec2-aにチェックを入れてください。
次にセキュリティタブを選択し、表示されているセキュリティグループのIDをクリックしてください。
これが、このEC2に付けられているセキュリティグループとなります。
jaws-sg-private-ec2-aに付けられているセキュリティグループの情報が表示されます。
なお、セキュリティグループの名前はdefaultです。
インバウンドルールでは、タイプがすべてのトラフィックとなっており、HTTPに限らず、全ての通信種類が許可されています。
ソース欄には許可するアクセス元を指定しますが、IPアドレスではなく、セキュリティグループのIDが表示されています。
ソース欄に表示されているセキュリティグループのIDは、このセキュリティグループ自身のIDです。
これは、つまりどういうことでしょうか?
EC2のセキュリティグループの解説
private-ec2-aにはdefaultという名前のセキュリティグループが付けられていますが、同じセキュリティグループが付けられている他のリソースと通信できることになります。
ALBのセキュリティグループについて
続いて、ALBのセキュリティグループがどうなっているか確認します。
[作業]ALBのセキュリティグループ確認
マネコンの検索欄にEC2と入力し、EC2を選んでください(ALBはEC2の画面に存在します)。
EC2ダッシュボード画面から、ロードバランサーを選択してください。
jaws-sg-albという名前のALBが選択された状態で、説明タブの下の方を見てみてください。
jaws-sg-albにはdefaultという名前のセキュリティグループが付いています。
これは、private-ec2-aに付いていたものと同じセキュリティグループです。
EC2とALBのセキュリティグループ解説
private-ec2-aと、ALBには、同じセキュリティグループが付けられていました。
そして、このセキュリティグループは、アクセス許可元として自分自身のセキュリティグループIDが指定されています。
つまり、private-ec2-aとALBは相互に通信が可能となっています。
ちなみにprivate-ec2-bにも同じセキュリティグループが付けられています。
よって、VPC内のリソースは相互に通信可能となっています(AWSのデフォルト設定)。
本当にそうなのか確認してみましょう。
ケース3 後編
ALBに付けられているdefaultのセキュリティグループを外してみます。
すると、EC2はALBからの通信を受け付けず、「Hello JAWS!」が表示されなくなるはずです。
[作業]セキュリティグループを外す
マネコンの検索欄にEC2と入力し、EC2を選んでください(ALBはEC2の画面に存在します)。
EC2ダッシュボード画面から、ロードバランサーを選択してください。
jaws-sg-albという名前のALBが選択された状態で、アクションボタンを押し、セキュリティグループの編集を選択してください。
- defaultのチェックボックスのチェックを外してください
- 次に保存ボタンを選択してください
[作業]ALBにアクセスする
- ブラウザでALBのDNS名 + /jaws.htmlにアクセスしてください
- 例 : jaws-sg-alb-0123456789.ap-northeast-1.elb.amazonaws.com/jaws.html
- 「Hello JAWS!」が表示されなければ、想定通りです
アクセスできない理由
ALBに付けられているdefaultのセキュリティグループを外したことで、EC2はALBからの通信を受け付けず、「Hello JAWS!」が表示されなくなりました。
以上でケース3は終了です。
ハンズオン全体まとめ
- セキュリティグループは、仮想のファイアウォール機能
- インバウンドルールにおいて、アクセスを許可する通信を指定できる
- タイプ欄では許可する通信の種類を指定する
- HTTPと指定すればHTTPを許可
- すべてのトラフィックと指定すれば全ての通信種類を許可
- ソース欄では許可する通信元を指定する
- 0.0.0.0/0と指定すれば、インターネットなどVPC外からの通信を許可
- xxx.xxx.xxx.xxx/32と指定すれば、IPアドレスxxx.xxx.xxx.xxxからの通信を許可
- セキュリティグループIDを指定すれば、そのセキュリティグループが付けられた他のリソースからの通信を許可
ハンズオン用環境を削除する
流れ
- CloudFormationで構築した環境の削除の開始
- セキュリティグループ jaws-sg-webの削除
- CloudFormationで構築した環境が削除されたことを確認
[作業]CloudFormationで構築した環境の削除開始
- (もしCloudShellの画面を閉じていたら)CloudShellの起動
- 画面右上に表示されている、以下のマークをクリックし、CloudShellを起動してください
- CloudShellの画面に以下コマンドを貼り付けてエンターキーを押してください
aws cloudformation delete-stack --stack-name jaws-sg
[作業]セキュリティグループを削除する
マネコンの検索欄にEC2と入力し、EC2を選んでください(セキュリティグループはEC2またはVPCの画面にあります)。
EC2ダッシュボード画面から、セキュリティグループを選択してください。
- jaws-sg-webのチェックボックスにチェックを入れてください
- 右上のアクションを押し、下の方にあるセキュリティグループを削除を選択してください
以下の画面が表示されたら、削除ボタンを選択してください。
もしこのような画面が表示されない場合は、数秒待ってから前の手順をもう一度試してみてください。
[作業]CloudFormationで構築した環境が削除されたことを確認
CloudShellの画面に以下コマンドを貼り付けてエンターキーを押してください。
aws cloudformation describe-stacks --stack-name jaws-sg
以下のメッセージの最後にあるようにStack with id jaws-sg does not exist
と表示されれば削除は成功しています。
An error occurred (ValidationError) when calling the DescribeStacksoperation: Stack with id jaws-sg does not exist
表示されない場合は、しばらく待ってからもう一度コマンドを実行してみてください。
終わりに
以上でセキュリティグループのハンズオンは終了です。お疲れ様でした!
本ハンズオンを通じてセキュリティグループへの理解が深まりましたら幸いです。
Discussion