【AWS_28】ハンズオンの検証_AWS WAF

AWSのハンズオンに、EC2、RDS、ELB、Wordpressを構築した環境を流用して「AWS WAF」を体験できるとありましたので検証してみたいと思います。
AWSのハンズオン(EC2、RDS、ELB、Wordpressの構築)は、以下の記事にまとめています。
AWS WAF を設定し、Web アプリケーション (WordPress) に対する攻撃の防御を行います。以下の記事を参考にしました。
【構成図】

目次
AWS WAF の設定
検索ボックスに WAF と入力し、表示される WAF & Shield をクリックします。
Getting Started のページから、まずは Web ACL を作っていきます。
Web ACL の作成
オレンジ色の Create web ACL をクリックします。

Resource type を Regional resources にします。
Region を Asia Pacific (Tokyo) にします。
Name に waf-ユーザ名(例:waf-user1)と入力します。
Description は空白のままとします。
CloudWatch metric name が自動的に waf-ユーザ名(例:waf-user1)と入力されていることを確認します。

Web ACL を適用するロードバランサーの設定
Web ALC を適用する AWS リソースを選択します。 今回は、作成済みのロードバランサー(ALB)を選択します。
Add AWS resources をクリックします。

Resource type で Application Load Balancer を選択します。
作成済みの ロードバランサー elb-ユーザ名 (例: elb-user1) にチェックを入れます。
Add をクリックします。

「Resource level DDoS protection – new」は、「Always on」を選択します。
「Next」 をクリックして、次に WAF ルールの作成を行います。

WAF ルールの設定
WAF ルール(防御ルール)を設定します。 ここでは、事前に構成済みのルールセットの”AWS マネージドルールグループ “を利用します。
Add rules をクリックし、その後表示される Add managed rule groups をクリックします。

AWS managed rule groups をクリックして、詳細な情報を表示します。

今回は以下の2つの マネージドルールグループを有効にします。
・管理者保護マネージドルールグループ(Admin protection)
・WordPress アプリケーションマネージドルールグループ
少し下にスクロールして、Admin protection を見つけ、その横の Add to Web ACL のトグルをクリックして、 Admin protection ルールグループを有効にします。

また少し下にスクロールして、WordPress applicationn を見つけ、その横の Add to Web ACL のトグルをクリックして、WordPress application ルールグループを有効にします。

一番下にスクロールして、Add rules をクリックします。
2つのルールセットが追加されました。
それ以外は何も変更せず、デフォルトのまま Next をクリックします。

何も変更せず、デフォルトのまま Next をクリックします。

何も変更せず、デフォルトのまま Next をクリックします。

設定内容を確認し、画面右下の Create web ACL をクリックして、Web ACL を作成します。

Web ACL の作成が完了しました。

AWS WAF の動作確認
先ほど作成した AWS WAF の動作確認を行います。
具体的には、WordPressの管理ページにアクセスしても、アクセスができない(Admin Protection ルールが効いている)ことを確認します。

WordPress を表示
作成済みの WordPress の URL にアクセスして、Wordpress が表示されることを確認します。

WordPress の管理ページにアクセスできないことを確認
次に作成済みの WordPress の 管理ページURL にアクセスして、Wordpress の管理ページが表示されないことを確認します。
WordPress の管理ページは、ブログURLの後ろに /wp-admin/ を追加します。
http://elb-user1-1705250014.ap-northeast-1.elb.amazonaws.com/wp-admin/
AWS WAF のAdmin Protection ルールが有効になっているため、管理ページにアクセスできない(403 Forbidden と表示される)ことを確認します。

AWS WAF の設定変更(Count)
先ほど動作確認をした Admin protection ルールを ブロックせず、検知だけ(Count)するように設定変更を行います。
この設定により、通信自体はブロックせずに該当ルールに合致したアクセスを検知することできます。

Admin protection ルールの変更
Web ACL の一覧ページにアクセスします。
先ほど作成した waf-ユーザ名(例:waf-user1)をクリックします。

Rules タブをクリックします。
Rules から AWS-AWSManagedRulesAdminProtectionRuleSet のチェックボックスにチェックを入れます。
Edit をクリックします。

AdminProtection_URIPATH を Override to Count に変更します。
それ以外はデフォルトのまま、画面右下の Save rule をクリックします。

それ以外は、何も変更せず Save をクリックします。
Web ACL の詳細画面に戻れば、変更完了です。

WordPress の管理ページが表示されることを確認
WordPress 管理ページにアクセスして、さきほどはアクセスできなかった管理ページが表示されることを確認します。

AWS WAF の設定変更(Rate-based rule)
AWS WAF では、送信元 IP アドレスごとにリクエストのレートを追跡するレートベースのルール があるそうです。
具体的に 5 分以内に 100 回以上アクセスが発生した送信元 IP アドレスをブロックする設定を行い、実際に動作確認(自分の端末からのアクセスがブロックされる)してみます。

Rate-based rule の追加
Rules タブをクリックします。
Add Rules をクリックすると表示される Add my own rules adn rules groups をクリックします。

名前(Name)を rate-based-rule と入力します。
Typeを rate-based-rule をクリックすると表示される Add my own rules adn rules groups をクリックします。
Rate limit の値を 100 にします。
それ以外はすべてデフォルトのまま Add ruleをクリックします。



何も変更せず Save をクリックします。

3つ目の rule として rate-based-rule が追加されました。

Rate-based ルールの動作確認
5 分以内に WordPress に 100 回以上アクセスして、アクセスがブロックされることを確認します。
私は、Windows端末を利用していますのでAWSで紹介されているPowerShellスクリプトを利用してアクセスを試みてみます。URLにアクセスできれば OK を、アクセスできなければ NG を返します。
$statusCode = 0
$response = $null
for($i=1 ; $i -le 300 ; $i++){
try
{
$response = Invoke-WebRequest http://<自身のWordPressのURLに置き換えてください>/ -UseBasicParsing
$statusCode = $response.StatusCode
}
catch [System.Net.WebException]
{
$statusCode = $_.Exception.Response.StatusCode.value__
}
if($statusCode -eq 200) {"OK"} else {"NG"}
Start-Sleep -Milliseconds 100
}
しばらくするとOKからNGに変わります。追加したルールの条件に一致したので適用されました。

~ 中略 ~

ブラウザでWordpressへアクセスしても表示されないことを確認します。

AWS WAF のメトリクス確認
AWS WAF のメトリクス(検知状況)の確認を行います。
Web ACL の一覧ページにアクセスします。
先ほど作成した waf-ユーザ名(例:waf-user1)をクリックします。
Traffice Overview タブをクリックすることでいろいろと確認することができます。
AWS WAF の削除
作成した AWS WAF (Web ACL) の削除を行います。
Web ACL の一覧ページにアクセスします。
先ほど作成した waf-ユーザ名(例:waf-user1)をクリックします。
ロードバランサーの関連付けを解除
Associated AWS resources タブをクリックします。
関連付けているロードバランサー elb-ユーザ名 (例: elb-user1) にチェックを入れます。
Disassociate をクリックします。

入力ボックスに disassociate と入力します。
Disassociate をクリックします。

Associated AWS resources に何も表示されていなければ、関連付け解除完了です。

画面左上の Web ACLs をクリックして Web ACL の一覧ページを表示します。
削除する waf-ユーザ名(例:waf-user1)にチェックを入れます。
Delete をクリックします。

入力ボックスに delete と入力します。
Delete をクリックします。

waf-ユーザ名(例:waf-user1)が表示されていなければ、削除完了です。

まとめ
AWSのハンズオンに、EC2、RDS、ELB、Wordpressを構築した環境を流用して「AWS WAF」を検証しました。こちらもAuto Scalingと同じで設定値の意味を知らないと感覚だけでは設定できないですね。まだ自身の中で腹落ちしないところも多いですが繰り返し検証していきたいと思います。
以下、他の記事をまとめた一覧です。AWSもまとめています。