AWS WAFで特定のUser-Agentだけ通信できるサイトを構築 #reinvent
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」します。
Create conditions
Conditionは通信を引っ掛けるための条件のようなものです。
今回はHTTP Headerの文字列で判断したいので「String match conditions」を選択します。
コンディション名を指定し、「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」というのは比較する際に文字列操作(大文字を小文字にするなど)をしたい場合に設定します。
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は複数指定できます。
作成したRuleの挙動を設定します。
「Allow」「Block」「Count」のうちから選択します。
今回は、「iPhone」のみを許可するので、「Allow」に設定し、「Default action」を「Block all requests that don't match any rules」に設定します。
「Default action」如何で、ホワイトリスト形式にもブラックリスト形式にも設定が可能です。
最後に、内容を確認し、問題なければ「Confirm and create」を押して完了します。
CloudFrontへ設定
Web ACLを作成するだけではWAFの機能はききません。
CloudFrontの画面でWAFを適用して上げる必要があります。
WAFを適用したいDistributionを選択し、Generalの編集画面を開きます。
「AWS WAF Web ACL」という設定項目が増えているので、作成したWeb ACLを選択します。
Originなどを設定してCloudFrontからサイトにアクセスできるようにしておきます。
テスト
CloudFrontのStatusがDeployedになったら、テストしてみます。
まずは、普通にPCからアクセスしてみます。
見事にブロックされました。
次にiPhoneからアクセスしてみます。
あいにく私はAndroidなので、開発者ツールを使って擬似的にアクセスしてみます。
iPhoneではアクセスが出来ました!!
最後に
他のHeaderでConditionを作成することも可能です。
いろいろ試してみようと思います!!