元ネタ
AWSのWell-Architected Frameworkを改めて整理。せっかくなんでハンズオン形式で学べるAWS Well-Architected Labsをやってみよう!ということで、備忘も兼ねて実践&記録をしてみました。
前提条件
- AWSアカウントがあること
ハンズオン開始
0. 概要
このハンズオン ラボでは、Amazon EC2 ワークロードをネットワーク ベースの攻撃から保護するための導入手順を説明します。 AWS マネジメントコンソールと AWS CloudFormation を使用して、多層防御方式で Amazon EC2 ベースのウェブアプリケーションを保護する方法を説明します。
1. EC2インスタンスの起動
ウェブアプリケーションとなるEC2インスタンスを作成します。
EC2インスタンス作成手順
- EC2コンソールを開き、左のナビゲーションより「インスタンス」ー「インスタンス」を選択する。
- 「インスタンスを起動」を選択する。
- 「名前とタグ」の「名前」に「wa-sec-ec2-linux-01」を入力する。
- 「Application and OS Images」はデフォルトのまま、「Amazon Linux 2023 AMI」を選択する。
- 「インスタンスタイプ」はデフォルトのまま、「t2.micro」を選択する。
- 「キーペア(ログイン)」で「新しいキーペアを作成」を選択する。
- 「キーペアを作成」にて、「キーペア名」に「wa-sec-lab」を入力し、「キーペアのタイプ」に「ED25519」を選択、「キーペアを作成」を選択する。
- 「キーペア(ログイン)」の「キーペア名」に「wa-sec-lab」が設定されていることを確認する。
- 「ネットワーク設定」では、「Allow SSH traffic from」で「自分のIP」を選択、「インターネットからのHTTPトラフィックを許可」のチェックボックスをオンにする。
- 「ストレージを設定」はデフォルトのまま。
- 「高度な詳細」を開く。
- 「ユーザーデータ」に以下を入力する。
#!/bin/bash
sudo dnf update -y
sudo dnf install -y httpd.x86_64
sudo systemctl start httpd.service
sudo systemctl enable httpd.service
sudo usermod -a -G apache ec2-user
sudo chown -R ec2-user:apache /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;
- 「インスタンスを起動」を選択する。
- 「インスタンスの起動を正常に開始しました」が表示されるまで待つ。
- 作成したインスタンスの詳細を開く。
- 「インスタンス概要」の右にある「パブリック IPv4 DNS」よりオープンアドレスをクリックし、Webアプリケーションが表示されることを確認する。(httpsではなく、http)
2. セキュリティグループの作成
ポート80を許可するインバウンドルールを含むセキュリティグループを作成します。
セキュリティグループ作成手順
- EC2コンソールの左のナビゲーションより「セキュリティ」ー「セキュリティグループ」を開く。
- 「基本的な詳細」の「セキュリティグループ名」に「wa-lab-sg-alb-webserver」を、「説明」に「Allow port 80 access to Application Load Balancer」を入力する。
- 「インバウンドルール」より「ルールを追加」を選択する。
- 「タイプ」に「HTTP」、「ソース」に「Anywhere-IPV4」を入力する。
- 「セキュリティグループを作成」を選択する。
- 作成完了のメッセージを確認する。
3. ターゲットグループの作成
ロードバランサーのターゲットグループを作成します。
ターゲットグループの作成手順
- EC2コンソールの左のナビゲーションより「ロードバランシング」ー「ターゲットグループ」を開く。
- 「ターゲットグループの作成」を選択する。
- 「基本的な設定」にある「ターゲットタイプの選択」では「インスタンス」を選択する。
- 「ターゲットグループ名」に「wa-lab-tg-webserver」を入力する。
- 「次へ」を選択する。
- 「使用可能なインスタンス」より作成したインスタンスの左のチェックボックスをオンにする。
- 「保留中として以下を含める」をクリックする。
- 「ターゲットを確認」で確認し、「ターゲットグループの作成」を選択する。
- 作成完了のメッセージを確認する。
4. アプリケーションロードバランサーの作成
アプリケーションロードバランサーを作成します。
アプリケーションロードバランサーの作成手順
- EC2コンソールの左のナビゲーションより、「ロードバランシング」ー「ロードバランサー」を開く。
- 「ロードバランサーの作成」を選択する。
- 「ロードバランサータイプ」より「Application Load Balancer」の「作成」を選択する。
- 「基本的な設定」の「ロードバランサー名」に「wa-lab-alb」を入力する。
- 「ネットワークマッピング」の「マッピング」に表示されている全てのアベイラビリティーゾーンをオンにする。
- 「セキュリティグループ」より、既に表示されているセキュリティグループを全て削除し、「wa-lab-sg-alb-webserver」をオンにする。
- 「リスナーとルーティング」より、「プロトコル」に「HTTP」、「ポート」は「80」、「デフォルトアクション」に「wa-lab-tg-webserver」を選択する。
- 「ロードバランサーの作成」を選択する。
- 作成完了のメッセージを確認し、「ロードバランサーを表示」を選択する。
- 作成したロードバランサーの状態が「アクティブ」に変わるまで数分待つ。
- 「アクティブ」になったら、作成したロードバランサーの詳細を開く。
- 「詳細」の右下にある「DNS名」をコピーし、ブラウザのURLに貼り付け、Webアプリケーションが表示されることを確認する。
5. WAF ACLを利用したApplication Load Balancerの構成
Web ACLを作成します。
Web ACLの作成手順
- AWS WAFを開き、左のナビゲーションより「AWS WAF」ー「Web ACLs」を開く。
- 「Create web ACL」を選択する。
- 「Web ACL details」の「Name」に「wa-lab-waf-acl-01」を入力する。
- 「Associated AWS resources - optional」で「Add AWS resources」を選択する。
- 「Add AWS resources」にて、「Resource type」に「Application Load Balancer」、「wa-lab-alb」の右のチェックボックスをオンにし、「Add」を選択する。
- 「Associated AWS resources - optional」に「wa-lab-alb」が追加されていることを確認し、「Next」を選択する。
- 「Add rules and rule groups」の「Rules」で「Add rules」をクリックし、「Add my own rules and rule groups」を選択する。
- 「Rule type」に「Rule builder」を選択する。
- 「Rule」の「Name」に「wa-lab-waf-rule-counting-access」を入力する。
- 「Statement」では、「Inspect」に「HTTP method」、「Match type」に「Exactly matches string」、「String to match」に「GET」を入力する。
- 「Action」では、「Action」に「Count」を選択し、「Add rule」を選択する。
- 「Rules」に「wa-lab-waf-rule-counting-access」が追加されていることを確認する。
- 「Next」を選択する。
- 「Next」を選択する。
- 「Review and create web ACL」で確認する。
- 「Create web ACL」を選択する。
- 作成成功を確認する。
- 「4. アプリケーションロードバランサーの作成」で作成したロードバランサーのDNS名にブラウザでアクセスする。ページを数回更新する。(リクエストのログを残すため)
- 作成したWeb ACLである「wa-lab-waf-acl-01」の詳細を開く。
- ページアクセス後、5分以上経過すると、リクエスト結果が確認できる。
Appendix. クリーンアップ手順
作成したリソースのクリーンアップ手順です。
ロードバランサーの削除手順
- EC2コンソールの左のナビゲーションより、「ロードバランシング」ー「ロードバランサー」を開き、「wa-lab-alb」をオンにし、「アクション」メニューにある「ロードバランサーの削除」を選択する。
- 「ロードバランサーの削除」にて、削除するロードバランサー名を確認し、最下部の入力ボックスに「確認」と入力した上で、「削除」を選択する。
- 削除完了のメッセージを確認する。
EC2インスタンスの削除
- EC2コンソールを開き、左のナビゲーションより「インスタンス」ー「インスタンス」を開き、対象のEC2インスタンスをオンにした上で、「インスタンスの状態」メニューにある「インスタンスを終了」を選択する。
- 「終了インスタンス?」にて、インスタンスIDを確認し、「終了」を選択する。
- 正常終了のメッセージを確認する。
- インスタンスの状態が「シャットダウン」から「終了済み」に変わることを確認する。
不要になったインスタンスは削除できます。これは、インスタンスの終了 と呼ばれます。インスタンスの状態が shutting-down
または terminated
に変わったら、そのインスタンスへの課金は停止します。
インスタンスを削除した後に、接続または起動することはできません。ただし、同じ AMI から別のインスタンスを起動することができます。
インスタンスの削除後、インスタンスはしばらくの間コンソールに表示されたままですが、エントリは自動的に削除されます。終了したインスタンスのエントリを自分で削除することはできません。インスタンスを削除すると、タグやボリュームなどのリソースはインスタンスから徐々に関連付けが解除され、しばらくすると削除されたインスタンスでこれらのリソースが表示されなくなる可能性があります。
インスタンスが終了すると、そのインスタンスに関連付けられたすべてのインスタンスストアボリュームのデータが削除されます。
デフォルトでは、インスタンスの削除時に Amazon EBS のルートデバイスボリュームが自動的に削除されます。ただし、起動時にアタッチした追加の EBS ボリューム、または既存のインスタンスにアタッチした EBS ボリュームがある場合、デフォルトでは、インスタンスの削除後もそれらのボリュームは保持されます。この動作はボリュームの DeleteOnTermination
属性によって制御されますが、変更できます。
ターゲットグループの削除手順(ハンズオンにはないです)
- EC2コンソールの左のナビゲーションより「ロードバランシング」ー「ターゲットグループ」を開き、「wa-lab-tg-webserver」をオンにした上で、「アクション」メニューにある「ターゲットグループの削除」を選択する。
- 「ターゲットグループを削除しますか?」にて、名前を確認し、「はい、削除します」を選択する。
- 削除完了のメッセージを確認する。
セキュリティグループの削除手順(ハンズオンにはないです)
- EC2コンソールの左のナビゲーションより「セキュリティ」ー「セキュリティグループ」を開き、「wa-lab-sg-alb-webserver」をオンにした上で、「アクション」メニューにある「セキュリティグループの削除」を選択する。
- 「セキュリティグループを削除」にて、名前を確認し、「削除」を選択する。
- 削除完了のメッセージを確認する。
Web ACLの削除
- AWS WAFを開き、左のナビゲーションより「AWS WAF」ー「Web ACLs」を開き、「wa-lab-waf-acl-01」を選択の上、「Delete」を選択する。
- 「Delete wa-lab-waf-acs-01?」にて、最下部の入力ボックスに「delete」を入力し、「Delete」を選択する。
- 完了のメッセージを確認する。