echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【AWS】Web ACLを設定する方法&CloudFormationでの注意点

概要

前回前々回と、CloudFrontに関する記事でしたが、今回もCloudFrontです。
今回は前々回に触れられなかった、WAF Web ACL(※)の作成について。

※Web Application Firewall - Web Access Control Listの略。WAFと同じもの...という認識でOK。

やること

  • Web ACLの前提条件作成
  • 条件の作成
  • ルールの作成
  • Web ACLの作成
  • CloudFrontへの適用

Webの前提条件作成

AWS WAF and AWS Shield」から「AWS WAF」を選択し、「Configure Web ACL」を選択します。
※「Concepts overview」では、条件(Condition)・ルール(Rules)・Web ACLについての説明があるので、読んでおくとよいかも。

「Next」ボタンをクリックすると「Name web ACL」画面でWeb ACLの前提条件を設定します。

項目は以下の通り。

項目名 説明
Web ACL name(必須) Web ACL nameの名前
CloudWatch metric name(必須) Web ACLのCloudWatch上でのメトリクス名。(Web ACL Nameを設定すると自動で設定されます。任意設定も可能)
Region(必須) Web ACL nameを設定するWeb ACLのリージョン(下記参照)
AWS resource to associate Web ACLを関連付けするAWSリソース。(後から設定することも可能)

【Regionについて】

  • CloudFrontに関連付けを行う場合、「Global」を選択してください。
  • 個別リージョンは、CloudFront以外のリソース(API Gatewayなど)に関連付けする場合に設定します。

f:id:Makky12:20190812181252p:plain

条件(Condition)の作成

「Create conditions」で、Web ACLに適用する条件(=フィルタ)を設定します。
設定可能なのは、下記の通り。

項目名 説明
Cross-site scripting match conditions XSS攻撃に対応するフィルタ
Geo match conditions アクセスされた地域(国)でのフィルタ
IP match conditions アクセス元のIPアドレスに対応するフィルタ
Size constraint conditions リクエストデータのデータ量でのフィルタ
SQL injection match conditions SQLインジェクション攻撃に対応するフィルタ
String and regex match conditions リクエストデータに含まれる文字列に対応するフィルタ

個々項目の詳細設定については、公式サイトを参考。
(項目名を見ればわかるようなものばかりだけど)

とりあえず、ちょっと分かりにくそうなものだけ抜粋。

項目名 説明
Part of the request to filter on フィルタ対象の項目(ヘッダ、クエリ文字列、など)
Transformation チェック前にフィルタ対象項目の値に実施させる処理。
(「Simplify Command Line」は、コマンドラインと思われる文字列を無効化する処理。OSコマンドインジェクション対応用です)
Comparison operator データ量比較の不等号の設定(=、<=、< など)
Match type 文字列比較のパターン(部分一致、完全一致、など)

f:id:Makky12:20190812181323p:plain

ルール(Rule)の作成

「Create rules」でルールを作成します。
「条件とルールって、何が違うの?」と思うかもしれませんが、Web ACLでの「ルール」は、「1つ以上の条件をまとめて管理する入れもの」となります。

「Create Rule」ボタンをクリック後、ルールの内容、及び「Add Conditions」で関連付けする条件を設定します。

  • 「Add Conditions」は、「Geo Match」及び「IP Address」が「指定した条件と一致」、それ以外は「指定した条件と少なくとも1つが一致」です。
  • 「Rule Type」は、下記の通り。
項目名 説明
Regular Rule 「Add Conditions」で設定した内容を満たしたとき、ルールを適用する
Rate-Based Rule 「Add Conditions」で設定した内容を満たし、かつ5分間のリクエスト回数が「Rate Limit」以上のとき、ルールを適用する

「Add rules to a web ACL」で作成したルールを選んで、「Add Rule to web ACL」をクリックすると、そのルールをWeb ACLへ採用できます(複数選択可能です)。
その後、以下の2項目&その際の動作を設定します。

項目名 説明
If a request matches all of the conditions in a rule 個々のルールについて、設定した条件をすべて満たした場合の動作(上から順に評価)
If a request doesn't match any rules どのルールも、ルールに設定したどの条件も満たさなかった場合(=デフォルトの動作)

最後に「Review And Create」をクリックします。

f:id:Makky12:20190812181348p:plain

Web ACLの作成

最後の「Web ACLの作成」ですが、これは「Review and create」で「Confirm and Create」ボタンをクリックするだけです。
また各項目の「Edit」ボタンをクリックすると、その項目の再設定ができます。

f:id:Makky12:20190812181405p:plain

CloudFrontへの適用

最後にCloudFrontへの適用ですが、これはCloudFrontの[Distribution Settings] - [AWS WAF Web ACL]で、作成したWeb ACLを選択するだけです。

f:id:Makky12:20190812181419p:plain

CloudFromationでWeb ACLを作成する際の注意

ここからは、CloudFormationでWeb ACLを作成する際の注意になります。

※CloudFormationの詳細はここでは説明しないので「CloudFormation?よくわからないし、関係ないな」って人は、スルーでOKです。

WAFリソースの違い

CloudFormationのWAFリソースには、下記2種類があります。

これの違いですが、WAFのリージョンになります。(下表参照)

リソース名 リージョン
AWS::WAF Global(CloudFront)
AWS::WAFRegional Regional WAF Resource(リージョン別WAF)
  • CloudFrontに適用するWAFは「AWS::WAF」で定義しなければなりません。
  • AWS::WAFRegionalで定義すると、デプロイした際のCloudFrontとの紐づけ時に「指定されたリソースにアクセスできない(「アクセス権限がない」だったかも)」というエラーが発生します。
「Geo match conditions」設定時の注意

条件の「Geo match conditions」(=地域(国)でのフィルタ条件)ですが、CloudFromationの場合、下記の事項があるので注意しましょう。

  • AWS::WAFRegionalでのみ設定可能。(AWS::WAFでは設定不可)
    • AWS::WAFで作成すると、ルールとの紐づけ時に「指定されたIDのリソースがありません」というエラーが発生します。
  • 公式の「AWS WAF Regional リソースタイプのリファレンス」ページを表示しても、表示言語を「日本語」にしていると「AWS::WAFRegional::GeoMatchSet」へのリンクが表示されない。
    • 表示言語を「English」にすれば表示されます。
  • 今のところ、CloudFrontに「Geo match conditions」を適用する場合、コンソールで行うしかない?

まとめ

と、またちょっと長くなりましたが、今回はここまで。

最近、Cognito&AWS Amplifyを使った認証コードをガッツリ書いてたので、次のネタはそれにしようかな?

てか、Azureは...