AWS WAFで特定のUser-Agentだけ通信できるサイトを構築 #reinvent

AWS WAF

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

re:Invent2015 Global Partner Summitの会場で書いてます。森永です。

突如現れたAWS WAFでHTTP Headerの内容で通信を許可・拒否出来るようになったようなので試してみました。
今回はiPhoneからのアクセスを許可するという怖いサイトを構築します。

試してみた

「Concept Overview」が出てきたら「Next」してください。

Name Web ACL

「Web ACL name」と「CloudWatch Metric name」を設定します。
「Web ACL name」を設定すると勝手に埋まるので特に問題なければ「Next」します。

AWS_WAF13

Create conditions

Conditionは通信を引っ掛けるための条件のようなものです。

今回はHTTP Headerの文字列で判断したいので「String match conditions」を選択します。

AWS_WAF14

コンディション名を指定し、「Filter settings」で以下のように設定します。

  • Part of the request to filter on: Header
  • Header: User-Agent
  • Match type: Contains
  • Transformation: None
  • Value is base64 encoded: チェックなし
  • Value to match: iPhone

「Transformation」というのは比較する際に文字列操作(大文字を小文字にするなど)をしたい場合に設定します。

AWS_WAF15

Create rules

RuleではConditionで引っかかった内容をどう処理するか指定します。

「Create Rule」をクリックし、新しいルールを作成します。
「Name」「CloudWatch metric name」を設定し、コンディションを追加します。

今回は、「文字列が一致する時」なので「does」「match at least one of the filters in the string match condition」を選択し、作成したConditionを選択します。 もし、文字列が一致しない時にしたい場合は「does not」を選択します。

Conditionは複数指定できます。

AWS_WAF16

作成したRuleの挙動を設定します。
「Allow」「Block」「Count」のうちから選択します。

今回は、「iPhone」のみを許可するので、「Allow」に設定し、「Default action」を「Block all requests that don't match any rules」に設定します。
「Default action」如何で、ホワイトリスト形式にもブラックリスト形式にも設定が可能です。

AWS_WAF17

最後に、内容を確認し、問題なければ「Confirm and create」を押して完了します。

CloudFrontへ設定

Web ACLを作成するだけではWAFの機能はききません。
CloudFrontの画面でWAFを適用して上げる必要があります。

WAFを適用したいDistributionを選択し、Generalの編集画面を開きます。
「AWS WAF Web ACL」という設定項目が増えているので、作成したWeb ACLを選択します。

AWS_WAF18

Originなどを設定してCloudFrontからサイトにアクセスできるようにしておきます。

テスト

CloudFrontのStatusがDeployedになったら、テストしてみます。

まずは、普通にPCからアクセスしてみます。

AWS_WAF20

見事にブロックされました。

次にiPhoneからアクセスしてみます。
あいにく私はAndroidなので、開発者ツールを使って擬似的にアクセスしてみます。

AWS_WAF19

iPhoneではアクセスが出来ました!!

最後に

他のHeaderでConditionを作成することも可能です。
いろいろ試してみようと思います!!