【目次】

  1. 1. はじめに
  2. 2. ルールの構成
  3. 3. new AWS WAF と AWS WAF Classic の切り替え方
  4. 4. Web ACL の作成
  5. 5. おわりに

1. はじめに

2019/11/25 AWS から new AWS WAF がリリースされました。今回は画面【オリジナルルール】について解説していきます。
 
第1回 : 【new AWS WAF】変更点まとめ
第2回 : 【new AWS WAF】AWS マネジメントコンソール操作(マネージドルール編)
第3回 : 【new AWS WAF】AWS マネジメントコンソール操作(オリジナルルール編)(本記事)
第4回 : 【new AWS WAF】AWS マネジメントコンソール操作(パターンセット・ルールグループ編)
第5回 : 【new AWS WAF】JSON 解説
 

2. ルールの構成

まず最初におさえておきたいことは、「ルールの仕組み」です。
AWS WAF Classic の場合は、ルール配下に condition があって、その中に filter を設定するイメージでした。※詳細は以下のブログを参照ください。
それに対して new AWS WAF では、 ルール配下に statement という単位で条件を構成していきます。
AND や OR で、statement を組み合わせることが可能なので、「文字列一致 statement 」と「国一致 statement 」を AND 条件で組み合わせて「特定の国からの特定文字が入ったアクセス」をブロックするといったルールの作り方も可能になります。
 
参照:AWS WAF 解説 【第2回 Condition と Filter の関係性】
https://www.wafcharm.com/jp/blog/aws-waf-condition-filter/
 

3. new AWS WAF と AWS WAF Classic の切り替え方

 
new AWS WAF の画面

 

AWS WAF Classic の画面

それぞれ画面に切り替えるリンクがあります。
 

4. Web ACL の作成

第2回 : マネージドルール編」の「Web ACL の作成」を参照して下さい。
 

オリジナルルール選択画面

画面上部では、ルールの選択を行うことが出来ます。
項目は以下となります。
 
IP set
 IP 制限の一覧( IP のルールセット)を選択する項目です。
 事前に IP のルールセットを登録することで設定が出来ます。
Rule builder
 ルールの作成を行うことが出来ます。この後具体的に確認します。
Rule group
 いくつかのルールをまとめた「独自のルールグループ」を選択する項目です。
 事前にルールグループ作成し、登録することで設定出来ます。
 
「 Rule builder 」 で進めていきます。
 

ルールのタイプを聞かれるので「 Regular Rule 」を選びます。

「If a request」に続く項目は、リクエストに対しての論理条件を選択します。
単独の論理条件の場合には、「マッチする」、「マッチしない」、複数の条件を連結する場合には、「AND」 、「OR」 から選択します。
今回は単独の論理条件として「マッチする」場合の、「 matches the statement 」を選びます。
 

statement の項目には、検査するフィールドとして、「どのヘッダ」や「国別」、「 IP 」と項目があります。設定できる内容は、AWS WAF Classic と同様です。論理条件が、増やせるようになっただけなので、これまでのイメージ通りで指定できます。今回はクエリ部分で特定文字列で検知するルールを作成します。

クエリを選択すると、マッチする条件を設定する項目が出てきました。
内容は、 文字列一致を行う場合、AWS WAF Classicでも存在した「完全一致」や「前方一致」などで条件を指定します。XSS、SQL インジェクションの条件もここで指定することになります。正規表現一致は事前に作成することで指定が可能になります。

今回は「完全一致」で進みます。

String to match に文字列を入れます。
Text transformation で変換処理を入れます。Text transformation は、複数指定も可能になりました。

これで完成です。
Add Rule を押下すると、以下の画面に遷移します。

ルールのプライオリティをこの画面で変更出来ます。save を押して次に進みます。
 

ACL の画面で見ると、作成したルールが紐づいていることがわかります。
 
複数の条件を AND で評価するルールも作成してみましょう。
クエリ部分で文字列一致する条件と国別一致の条件をAND条件でつなげた構成で作成します。
 
まずはクエリ部分で文字列一致を作りました。
 

「 matches the statement 」を「 matches all the statements(AND) 」に変えます。
「 Add another statement 」が表示されました。
 

「 Add another statement 」を押下します。
AND で繋がり、新しく statement を入力する欄ができました。画面上でも直感的に理解しやすくなっています。
 

追加の条件となる、国の制限を設定します。
 

JSON 上の表示も見てみましょう。
 

{
    "Name": "test_rule2",
    "Priority": 0,
    "Action": {
        "Block": {}
    },
    "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "test_rule2"
    },
    "Statement": {
        "AndStatement": {
            "Statements": [
                {
                    "ByteMatchStatement": {
                        "FieldToMatch": {
                            "QueryString": {}
                        },
                        "PositionalConstraint": "STARTS_WITH",
                        "SearchString": "test_2",
                        "TextTransformations": [
                            {
                                "Type": "COMPRESS_WHITE_SPACE",
                                "Priority": 0
                            },
                            {
                                "Type": "LOWERCASE",
                                "Priority": 1
                            }
                        ]
                    }
                },
                {
                    "GeoMatchStatement": {
                        "CountryCodes": [
                            "JP"
                        ]
                    }
                }
            ]
        }
    }
}

 

5. おわりに

操作は簡単で、認識もしやすいものでした。AND 条件や OR 条件も問題なく作成できました。