✍️

AWS セキュリティグループ ハンズオン

2021/03/21に公開

はじめに

本記事は、JAWS DAYS 2021内で実施したセキュリティグループのハンズオン資料をZenn記事化したものとなります。

オリジナルのハンズオン資料は以下になります。

https://speakerdeck.com/shonansurvivors/sekiyuriteigurupututehe-shi-ifang-woji-chu-karaxue-bou

対象者

  • AWSに入門したばかりの初心者
  • セキュリティグループを知らない人
  • セキュリティグループを知ってはいるが、使ったことが無い人

必要なもの

  • AdministratorAccess権限を持つ、マネジメントコンソールにログイン可能なIAMユーザー

注意事項

本ハンズオンでは以下のような有料のリソースを一部作成します。

  • NATゲートウェイ * 1
  • ALB * 1
  • t2.microのEC2インスタンス * 2

ハンズオンを終了させたら、作成したリソースを忘れずに削除するようにしてください(削除方法は最後に記載しています)。

ハンズオンは20分〜40分程度で完了すると思うので、発生する料金は0.1USD以内で収まるかと思いますが、自己責任でお願いします。

思わぬ高額請求が不安な方は、以下の記事などを参考に、予想請求額が一定額を超えたら通知メールが飛ぶ設定を入れることをお勧めします。

https://blog.shonansurvivors.com/entry/aws-budgets

本ハンズオンのゴール

AWSの仮想ファイアウォールであるセキュリティグループを使って、任意の通信を許可/拒否できるようになる

ハンズオン全体の流れ

  1. ハンズオン用の環境を構築する
  2. ハンズオン用環境の構成図の解説
  3. 各ケースに沿ったセキュリティグループを作成、使用してみる
    1. IPアドレスを限定せず、Webサービスを利用させるケース
    2. 特定のIPアドレスに対してのみ、Webサービスを利用させるケース
    3. 特定のリソース同士を相互に通信可能とさせるケース
  4. ハンズオン用環境を削除する

ハンズオン用の環境を構築する

流れ

  1. CloudShellの起動
  2. CloudFormation用ファイルのダウンロード
  3. CloudFormationの実行

CloudShellの起動の目的

本ハンズオン用の環境構築では、GitやAWS CLIというものを使用します。

GitやAWS CLIは、準備をすればお手元のPC(WindowsやMac)でも使用することはできます。

しかし、本ハンズオンでは、受講者のみなさんがPC環境の差異を理由につまずくことの無いよう、AWSのCloudShellを利用することにします。

CloudShellはブラウザから利用可能で、GitやAWS CLIがインストール済みとなっています。

[作業]CloudShellの起動

  • マネジメントコンソール(以下、マネコン)へのログイン
    • 以下のURLから、ご自身のAWSアカウントにログインしてください
  • CloudShellの起動
    • 画面右上に表示されている、以下のマークをクリックし、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!」という内容の画面を表示するように設定済みです。

EC2


2台のEC2の手前にあるのはALB(アプリケーションロードバランサー)です。

ユーザーからのアクセスを2台のEC2に振り分け(負荷分散)します。

ALB


ALBの手前にあるのはインターネットゲートウェイです。

インターネットとの通信の出入り口となります。

インターネットゲートウェイ


つまり、ユーザーのブラウザからALBにアクセスすると、どちらかのEC2が返却する「Hello JAWS!」が表示されることになります。

ユーザーのブラウザからALBにアクセスする

次からは、各ケースに沿ったセキュリティグループを作成、使用してみます。

ケース1

IPアドレスを限定せず、誰でもWebサービスにアクセス(HTTP通信)できる。

誰でもWebサービスにアクセス

構成図によるケース1の解説

「Hello JAWS!」を表示するためにブラウザでALBにアクセスします。

ALBにアクセスするには、ALBのDNS名をブラウザのアドレスバーに入力します。

構成図によるケース1の解説

[作業]ALBのDNS名を調べる

マネコンの検索欄にEC2と入力し、EC2を選んでください(ALBはEC2の画面に存在します)。

マネコンの検索欄にEC2と入力し、EC2を選んでください


EC2ダッシュボード画面から、ロードバランサーを選択してください。

EC2ダッシュボード画面から、ロードバランサーを選択してください


jaws-sg-albという名前のALBの説明タブにDNS名が表示されています。

これをコピーしてください。

jaws-sg-albという名前のALBの説明タブにDNS名が表示されています。これをコピーしてください。

[作業]ALBにアクセスする

  • マネコンが表示されているタブとは別のタブで、アドレスバーにALBのDNS名 + /jaws.htmlと入力してください
    • 例 : jaws-sg-alb-0123456789.ap-northeast-1.elb.amazonaws.com/jaws.html
  • しかし、ブラウザには何も表示されないはずです

ブラウザには何も表示されない

アクセスできない理由

アクセスできない理由は、ALBのセキュリティグループが、インターネットからの通信を拒否しているためです。

アクセスできない理由は、ALBのセキュリティグループが、インターネットからの通信を拒否しているためです

この通信を許可するセキュリティグループを作成します。

[作業]セキュリティグループを作成する

マネコンの検索欄にEC2と入力し、EC2を選んでください(セキュリティグループはEC2またはVPCの画面で作成できます)。

マネコンの検索欄にEC2と入力し、EC2を選んでください


EC2ダッシュボード画面から、セキュリティグループを選択してください。

EC2ダッシュボード画面から、セキュリティグループを選択してください


右上の「セキュリティグループを作成」ボタンを押してください。

右上のセキュリティグループを作成ボタンを押してください。


  1. セキュリティグループ名と説明欄は何でも良いのですが、それぞれjaws-sg-webと入力してください
  2. VPCは、jaws-sg-vpcを選んでください
  3. インバウンドルールのパネルの「ルールを追加」ボタンを押してください

セキュリティグループ名と説明欄は何でも良いのですが、それぞれjaws-sg-webと入力してください


  1. タイプ欄では許可する通信の種類を指定します。ここではHTTPを選択してください。

  2. ソース欄では許可するIPアドレスの範囲を指定します。ここでは0.0.0.0/0を選択してください。これは全IPアドレスを意味します。

タイプ欄では許可する通信の種類を指定します。ソース欄では許可するIPアドレスの範囲を指定します。ここでは0.0.0.0/0を選択してください。


入力が終わったら、右下の「セキュリティグループを作成」ボタンを押してください。

入力が終わったら、右下のセキュリティグループを作成ボタンを押してください


以下のような画面が表示されればセキュリティグループの作成は完了です。

以下のような画面が表示されればセキュリティグループの作成は完了です

[作業]セキュリティグループをALBに付ける

  1. 左側のメニューの上部のEC2ダッシュボードを押してください
  2. 次にロードバランサーを選択してください

左側のメニューの上部のEC2ダッシュボードを押してください。次にロードバランサーを選択してください。


jaws-sg-albという名前のALBが選択された状態で、アクションボタンを押し、セキュリティグループの編集を選択してください。

jaws-sg-albという名前のALBが選択された状態で、アクションボタンを押し、セキュリティグループの編集を選択してください


  1. jaws-sg-webのチェックボックスにチェックを入れてください
  2. 次に保存ボタンを選択してください

jaws-sg-webのチェックボックスにチェックを入れてください。次に保存ボタンを選択してください。

[作業]ALBにアクセスする

  • ブラウザでALBのDNS名 + /jaws.htmlにアクセスしてください
    • 例 : jaws-sg-alb-0123456789.ap-northeast-1.elb.amazonaws.com/jaws.html
  • 以下のようにHello JAWS!と表示されれば成功です

Hello JAWS!

アクセスできた理由

ALBのセキュリティグループが全てのIPアドレスからのHTTP通信を許可するようになったため、「Hello JAWS!」が表示されるようになりました。

ALBのセキュリティグループが全てのIPアドレスからのHTTP通信を許可

[補足]セキュリティグループ以外に必要な条件

なお、VPC内のリソース(ALBやEC2など)が、インターネットからの通信を受け付けるためには、セキュリティグループ以外にも設定が必要なものがあります。

VPC


VPCに、インターネットゲートウェイが設置されていること

インターネットゲートウェイ


リソース(今回でいうとALB)の属するサブネットのルートテーブルにおいて、VPC外のIPアドレスに対する通信の向き先がインターネットゲートウェイになっていること

ルートテーブル


リソース(今回でいうとALB)の属するサブネットと関連付けられているネットワークACLにおいて、VPC外との通信が拒否されていないこと

ネットワークACL


インターネットからの通信受付に必要な条件は、まとめると以下になります。

  • ハンズオン環境構築用のCloudFormationであらかじめ設定済み
    • VPCに、インターネットゲートウェイを設置
    • ルートテーブルにおいて、VPC外のIPアドレスに対する通信の向き先がインターネットゲートウェイとなっている
    • ネットワークACLにおいて、VPC外との通信を許可(AWSのデフォルト設定)
  • 本ハンズオンで、みなさん自身で設定したこと
    • セキュリティグループにおいて、VPC外のIPアドレスからの通信を許可

以上でケース1は終了です。

ケース2

特定のIPアドレスからのみ、Webサービスにアクセス(HTTP通信)できる。

特定のIPアドレスからのみ、Webサービスにアクセス(HTTP通信)できる

ケース2 前編

まず最初は、アクセスできない側を体験することにします。

まず最初は、アクセスできない側を体験することにします

[作業]セキュリティグループの設定変更

マネコンの検索欄にEC2と入力し、EC2を選んでください(セキュリティグループはEC2またはVPCの画面にあります)。

マネコンの検索欄にEC2と入力し、EC2を選んでください


EC2ダッシュボード画面から、セキュリティグループを選択してください。

EC2ダッシュボード画面から、セキュリティグループを選択してください


  1. jaws-sg-webのチェックボックスにチェックを入れてください
  2. 右上のアクションを押し、「インバウンドルールを編集」を選択してください

jaws-sg-webのチェックボックスにチェックを入れてください。右上のアクションを押し、インバウンドルールを編集を選択してください。


まず、0.0.0.0/0のバツボタンを押して削除してください

まず、0.0.0.0/0のバツボタンを押して削除してください


次に、適当なIPアドレスとして、192.0.2.1/32を入力してください。

次に、適当な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通信を拒否するようになったためです。

アクセスできない理由は、ALBのセキュリティグループが「皆さんのPCがインターネットと通信する時に使用されているIPアドレス」からのHTTP通信を拒否するようになったためです

ケース2 後編

続いて、アクセスできる側を体験します。

続いて、アクセスできる側を体験します

[作業]セキュリティグループの設定変更

  1. jaws-sg-webのチェックボックスにチェックを入れてください
  2. 右上のアクションを押し、「インバウンドルールを編集」を選択してください

jaws-sg-webのチェックボックスにチェックを入れてください。右上のアクションを押し、インバウンドルールを編集を選択してください。


まず、192.0.2.1/32のバツボタンを押して削除してください。

まず、192.0.2.1/32のバツボタンを押して削除してください


次にマイIPを選択してください。

次にマイIPを選択してください


  • マイIPを選択すると「あなたのPCがインターネットと通信する時に使用されているIPアドレス」が自動入力されます
  • そのまま「ルールを保存」ボタンを押してください

そのままルールを保存ボタンを押してください

[作業]ALBにアクセスする

  • ブラウザでALBのDNS名 + /jaws.htmlにアクセスしてください
    • 例 : jaws-sg-alb-0123456789.ap-northeast-1.elb.amazonaws.com/jaws.html
  • 以下のようにHello JAWS!と表示されれば成功です

Hello JAWS!

アクセスできた理由

ALBのセキュリティグループが「あなたのPCがインターネットと通信する時に使用されているIPアドレス」からのHTTP通信を許可するようになったため「Hello JAWS!」が表示されるようになりました。

ALBのセキュリティグループが「あなたのPCがインターネットと通信する時に使用されているIPアドレス」からのHTTP通信を許可するようになったため「Hello JAWS!」が表示されるようになりました

以上でケース2は終了です。

ケース3

特定のリソース同士を、相互に通信可能とする。

特定のリソース同士を、相互に通信可能とする

ケース3はもう実現済みです。

何故そうなっているのか、設定を確認していきましょう。

ALBからEC2への通信について

ALBからは、2台あるEC2それぞれに通信が可能となっています。

ALBからは、2台あるEC2それぞれに通信が可能となっています

通信を受ける側のEC2のセキュリティグループはどうなっているのでしょうか?

確認してみます。

[作業]EC2のセキュリティグループの確認

まず、EC2の設定を確認します。

そのために、マネコンの検索欄にEC2と入力し、EC2を選んでください。

マネコンの検索欄にEC2と入力し、EC2を選んでください


EC2ダッシュボード画面から、実行中のインスタンスを選択してください。

EC2ダッシュボード画面から、実行中のインスタンスを選択してください


まず、jaws-sg-private-ec2-aにチェックを入れてください。

まず、jaws-sg-private-ec2-aにチェックを入れてください


次にセキュリティタブを選択し、表示されているセキュリティグループのIDをクリックしてください。

これが、このEC2に付けられているセキュリティグループとなります。

次にセキュリティタブを選択し、表示されているセキュリティグループのIDをクリックしてください


jaws-sg-private-ec2-aに付けられているセキュリティグループの情報が表示されます。

なお、セキュリティグループの名前はdefaultです。

セキュリティグループの名前はdefaultです


インバウンドルールでは、タイプがすべてのトラフィックとなっており、HTTPに限らず、全ての通信種類が許可されています。

インバウンドルールでは、タイプがすべてのトラフィックとなっており、HTTPに限らず、全ての通信種類が許可されています


ソース欄には許可するアクセス元を指定しますが、IPアドレスではなく、セキュリティグループのIDが表示されています。

ソース欄には許可するアクセス元を指定しますが、IPアドレスではなく、セキュリティグループのIDが表示されています


ソース欄に表示されているセキュリティグループのIDは、このセキュリティグループ自身のIDです。

ソース欄に表示されているセキュリティグループのIDは、このセキュリティグループ**自身**のIDです

これは、つまりどういうことでしょうか?

EC2のセキュリティグループの解説

private-ec2-aにはdefaultという名前のセキュリティグループが付けられていますが、同じセキュリティグループが付けられている他のリソースと通信できることになります。

private-ec2-aにはdefaultという名前のセキュリティグループが付けられています

ALBのセキュリティグループについて

続いて、ALBのセキュリティグループがどうなっているか確認します。

続いて、ALBのセキュリティグループがどうなっているか確認します

[作業]ALBのセキュリティグループ確認

マネコンの検索欄にEC2と入力し、EC2を選んでください(ALBはEC2の画面に存在します)。

マネコンの検索欄にEC2と入力し、EC2を選んでください


EC2ダッシュボード画面から、ロードバランサーを選択してください。

EC2ダッシュボード画面から、ロードバランサーを選択してください


jaws-sg-albという名前のALBが選択された状態で、説明タブの下の方を見てみてください。

jaws-sg-albという名前のALBが選択された状態で、説明タブの下の方を見てみてください


jaws-sg-albにはdefaultという名前のセキュリティグループが付いています。

これは、private-ec2-aに付いていたものと同じセキュリティグループです。

jaws-sg-albにはdefaultという名前のセキュリティグループが付いています

EC2とALBのセキュリティグループ解説

private-ec2-aと、ALBには、同じセキュリティグループが付けられていました。

private-ec2-aと、ALBには、同じセキュリティグループが付けられていました


そして、このセキュリティグループは、アクセス許可元として自分自身のセキュリティグループIDが指定されています。

つまり、private-ec2-aとALBは相互に通信が可能となっています。

そして、このセキュリティグループは、アクセス許可元として自分自身のセキュリティグループIDが指定されています。つまり、private-ec2-aとALBは相互に通信が可能となっています。


ちなみにprivate-ec2-bにも同じセキュリティグループが付けられています。

よって、VPC内のリソースは相互に通信可能となっています(AWSのデフォルト設定)。

ちなみにprivate-ec2-bにも同じセキュリティグループが付けられています。よって、VPC内のリソースは相互に通信可能となっています(AWSのデフォルト設定)

本当にそうなのか確認してみましょう。

ケース3 後編

ALBに付けられているdefaultのセキュリティグループを外してみます。

すると、EC2はALBからの通信を受け付けず、「Hello JAWS!」が表示されなくなるはずです。

ALBに付けられているdefaultのセキュリティグループを外してみます

[作業]セキュリティグループを外す

マネコンの検索欄にEC2と入力し、EC2を選んでください(ALBはEC2の画面に存在します)。

マネコンの検索欄にEC2と入力し、EC2を選んでください


EC2ダッシュボード画面から、ロードバランサーを選択してください。

EC2ダッシュボード画面から、ロードバランサーを選択してください


jaws-sg-albという名前のALBが選択された状態で、アクションボタンを押し、セキュリティグループの編集を選択してください。

jaws-sg-albという名前のALBが選択された状態で、アクションボタンを押し、セキュリティグループの編集を選択してください


  1. defaultのチェックボックスのチェックを外してください
  2. 次に保存ボタンを選択してください

defaultのチェックボックスのチェックを外してください。次に保存ボタンを選択してください。

[作業]ALBにアクセスする

  • ブラウザでALBのDNS名 + /jaws.htmlにアクセスしてください
    • 例 : jaws-sg-alb-0123456789.ap-northeast-1.elb.amazonaws.com/jaws.html
  • 「Hello JAWS!」が表示されなければ、想定通りです

504 Gateway Time-out

アクセスできない理由

ALBに付けられているdefaultのセキュリティグループを外したことで、EC2はALBからの通信を受け付けず、「Hello JAWS!」が表示されなくなりました。

ALBに付けられているdefaultのセキュリティグループを外してみます

以上でケース3は終了です。

ハンズオン全体まとめ

  • セキュリティグループは、仮想のファイアウォール機能
  • インバウンドルールにおいて、アクセスを許可する通信を指定できる
  • タイプ欄では許可する通信の種類を指定する
    • HTTPと指定すればHTTPを許可
    • すべてのトラフィックと指定すれば全ての通信種類を許可
  • ソース欄では許可する通信元を指定する
    • 0.0.0.0/0と指定すれば、インターネットなどVPC外からの通信を許可
    • xxx.xxx.xxx.xxx/32と指定すれば、IPアドレスxxx.xxx.xxx.xxxからの通信を許可
    • セキュリティグループIDを指定すれば、そのセキュリティグループが付けられた他のリソースからの通信を許可

ハンズオン用環境を削除する

流れ

  1. CloudFormationで構築した環境の削除の開始
  2. セキュリティグループ jaws-sg-webの削除
  3. CloudFormationで構築した環境が削除されたことを確認

[作業]CloudFormationで構築した環境の削除開始

  • (もしCloudShellの画面を閉じていたら)CloudShellの起動
    • 画面右上に表示されている、以下のマークをクリックし、CloudShellを起動してください

CloudShell

  • CloudShellの画面に以下コマンドを貼り付けてエンターキーを押してください
aws cloudformation delete-stack --stack-name jaws-sg

[作業]セキュリティグループを削除する

マネコンの検索欄にEC2と入力し、EC2を選んでください(セキュリティグループはEC2またはVPCの画面にあります)。

マネコンの検索欄にEC2と入力し、EC2を選んでください


EC2ダッシュボード画面から、セキュリティグループを選択してください。

EC2ダッシュボード画面から、セキュリティグループを選択してください


  1. jaws-sg-webのチェックボックスにチェックを入れてください
  2. 右上のアクションを押し、下の方にあるセキュリティグループを削除を選択してください

セキュリティグループを削除を選択してください


以下の画面が表示されたら、削除ボタンを選択してください。

削除ボタンを選択

もしこのような画面が表示されない場合は、数秒待ってから前の手順をもう一度試してみてください。

[作業]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