AWS WAF v2 で特定の国からのアクセスをブロックしてみた

単一の WebACL で必要であれば単純なルール追加、複数の WebACL で必要であればルールグループとしてルール追加がおすすめです。

コンバンハ、千葉(幸)です。

最近以下のエントリがありました。

ここではさまざまな AWS サービスで特定の国からのアクセスをブロックする方法が記載されています。

AWS WAF を用いてブロックを行う場合の手順が旧世代の WAF(クラシック)で記載されていましたので、AWS WAF v2 の場合の手順を本エントリで記載します。

今回はすでに AWS WAF v2 の WebACL がある前提で、以下のパターンを記載していきます。

  • WebACL への単一のルールの追加
  • ルールグループでのルールの追加

前者は単一の WebACL に埋め込むイメージとなり、後者は複数の WebACL で共有ができる方式となります。

WebACL へのルールの追加

リージョナルな WebACL test-webacl が存在するとし、そこにルールを追加します。CloudFront に関連付ける WebACL の場合はグローバルにする必要があることに注意してください。

「Add rules」から「Add my own rules and rule groups」を押下します。

AWS_WAF_add_rule

ルールビルダーでルールを作成します。

Inspect でOrigin from a country inを選択し、Country codes でブロックしたい国のコードを一つ以上選択します。

国のコードは ISO 3166 国際標準の alpha-2 国 ISO コードから選択します。以下から確認するとよいでしょう。

Action として Block を選択して次へ進みます。(必要に応じて Count での様子見を行ってください。)

AWS_WAF_rule_builder

↑今回はblock-specific-countriesという名称でJPからのアクセスをブロックするルールとしてみました。

作成したルールの優先順位を決定します。今回の例で使用している WebACL では他のルールがありませんが、実際の環境にあわせてご検討ください。WebACL 内のルールは優先度が高い順に評価され、条件に合致した時点でアクションが実行されます。

AWS_WAF_rule_priority

↑上記で「Save」を押下すれば設定完了です。

ルールグループを作成して WebACL に追加する

上記のパターンでは WebACL に直接ルールを追加しました。複数の WebACL で共通してブロックしたい、という場合にはルールグループを活用しましょう。

ルールグループの作成

ルールグループの画面から「Create rule group」を押下します。

AWS_WAF_Rule_Group

4つのステップに分かれます。

ステップ1でルールグループ名、CloudWatchメトリクス名、リージョンを指定します。

AWS_WAF_Rule_Group_step1

ステップ2でルールの追加を行います。「Add rule」を押下します。

AWS_WAF_rule_group_step2

WebACL に直接ルールを追加した時と同じようにルールビルダーが展開されます。必要な情報を入力した上で「Add rule」を押下します。

AWS_WAF_rule_gourp_add_rule

ステップ 2 の画面に戻ります。今回のルールではキャパシティが 1 であることが分かりました。ルールの条件によって変動する部分です。今後のルールの追加も踏まえ、ルールグループ全体として必要になるであろうキャパシティを指定して次に進みます。

AWS_WAF_Rule_Group-6640539

↑キャパシティは後から変更できません。以下から各種ステートメントが必要とするキャパシティ(WCU)が確認できますので参考にしてください。

例では大きめに 10 を指定しましたが、特定の国からのアクセスをブロックするステートメントだけであれば 1 で済みます。(対象の国が増えてもキャパシティは増えない。)

ステップ3では優先順位を決定します。今回は単一のルールしか含まれていないため特に気にせず次に進みます。

AWS_WAF_rule_Group_step3

ステップ4 で最終確認をし、問題なければ作成を行います。

AWS_WAF_rule_group_step4

ルールグループの WebACL への追加

作成したルールグループを WebACL へ追加します。基本的な考え方は冒頭のルール追加と同じです。

「Add rules」から「Add my own rules and rule groups」を押下します。

AWS_WAF_add_rule

ルールタイプとしてRule groupを選択し、ルール名をつけた上で先ほど作成したルールグループを選択し、追加します。

Override rule group actionを有効化するとアクションが Count に上書きされます。

AWS_WAF

これまでと同じようにルールの優先度を決定し、Save を押下すれば設定完了です。

AWS_WAF_rule_Group_priority

WAF v2 による特定の国からのアクセスブロックの確認

今回は以下の条件で確認を行います。

  • internet-facing ALB に WebACL を関連づけ
  • WebACLのルールの内訳は以下の通り
    • JP からのアクセスであればブロック
    • それ以外であれば許可
  • 以下から internet-facing ALB にアクセス
    • 東京リージョンの AWS CloudShell
    • バージニア北部リージョンの AWS CloudShell

「JP からのアクセスであればブロック」は本エントリで記した「直接ルール追加」「ルールグループで作成した上で追加」のいずれかで賄っています。

internet-facing ALB ではリスナールールの設定で固定レスポンスとして以下を返すように設定しています。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    hello
</body>
</html>

東京リージョンからのアクセス

curl でアクセスすると、想定通り WAF によってブロックされました。

AWS_CloudShell_waf_access

403 エラーが返されています。

[cloudshell-user@ip-10-0-71-236 ~]$ curl test-1861108909.ap-northeast-1.elb.amazonaws.com
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
</body>
</html>

バージニア北部リージョンからのアクセス

正常にリスナーに設定した固定レスポンスが表示されました。

AWS_CloudShell_waf_access-6642495

[cloudshell-user@ip-10-0-71-18 ~]$ curl test-1861108909.ap-northeast-1.elb.amazonaws.com
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    hello
</body>
</html>

東京/大阪以外のリージョンからのアクセスであれば、同様にアクセスが成功します。特定の国からのアクセスブロックの挙動が確認できました。

終わりに

AWS WAF v2 で特定の国からのアクセスをブロックしてみました。

既存の WebACL に追加する際は、ルールの優先度を考慮する、一定期間カウントモードで観測するなどを考慮のうえ実施いただければと思います。

以上、 チバユキ (@batchicchi) がお送りしました。

参考