AWS WAF Classic を使ってリファラーでアクセス制限する

とあるサイトで負荷が高くなっていたので、アクセスログを見てみたところ、とあるURLからのアクセスが不自然に集中していました。

それは「s0.2mdn.net」で、調べてみると悪質なマルウェアであることが分かりました。確かにアクセス元のIPはバラバラだったので、最初は不正アクセスでないように見えたのですが盲点でした。

それはそうと、このマルウェアからのアクセスは遮断したほうがよい、との判断に至ったのでどう制御しようか悩んだところ、ちょうど AWS WAF を使っていたので、リファラーでアクセス制限してみました。
ちなみに、Classic での設定方法となります。

今回は、AWS マネジメントコンソールで設定していきます。

Web ACLs の作成

Web ACLs の作成は割愛します。
「test-acl」がある前提で以下記載します。

対象条件の作成

特定の条件に当てはまるアクセスを制御するために、何を条件とするかここで設定します。つまり、今回の例ではリファラーが「//s0.2mdn.net」になっていることを条件とします。

String and regex match conditions → Create condition

下記図の赤枠のボタンを順番にクリックし、設定画面に遷移します。

設定画面に遷移したら、以下入力します。

  • Name:test-confitions
  • Region:Asia Pacific(Tokyo)
  • Type:String match
  • Part of the request to filter on:Header
  • Header:Referer
  • Match type:Contains
  • Transformation:Convert to lowercase
  • Value is base64-encoded:未チェック
  • Value to match://s0.2mdn.net

Add filter

入力したら、Add filter 押します。すると、「Part of the request to filter on」のところに作成した条件が表示されます。

Create

そして Create 押します。
これで対象条件の作成は完了です。

ルールの作成

WAF はルールに従ってアクセス制御します。
そこで上記で作成した対象条件を適用したルールを作成します。

Rules → Create rule

下記図の赤枠のボタンを順番にクリックし、設定画面に遷移します。

設定画面に遷移したら、以下入力します。

  • Name : test-rule
  • CloudWatch metric name : 自動でCloudWatch metric名が入ります。
  • Rule type : Regular rule
  • Region : Asia Pacific(Tokyo)

Add conditions

ここでどの対象条件を適用するか選択します。対象条件と一致している場合に適用する「does」、一致していない場合に適用する「does not」を選択します。
また、今回は文字列マッチなので、フィルタリングの種類をそのように設定します。

  • does or does not:does
  • match at least one of the filters in the string match condition を選択
  • 先ほど作成した「test-confitions」を選択

Create

そして Create 押します。
これでルールの作成は完了です。

WAF にルールを適用してアクセス制御する

適用させたい Web ACL を選択し、上記で作成したルールを適用させます。

Web ACLs → ACL(test-acl) 選択 → [Rules]タブ → Edit web ACL

下記図の赤枠のボタンを順番にクリックし、設定画面に遷移します。

設定画面に遷移したら、以下入力します。

  • Rules:先ほど作成した「test-rule」を選択
  • Add rule to web ACL 押す
  • 作成したルールにマッチしたら拒否(Block), ルールにマッチしない場合は許可(Allow)なので、今回は「Block」

Update

そして Update 押します。
これでアクセス制御の設定は完了です。