【AWS】WAF v2で、特定のパスにアクセスできるIPを制限してみる


初めに

オークファンのライです。
一年ぶりの記事ですね!

この時期は、AWSがre:Inventを開催し、いろいろ新機能を発表し、記事を読むだけで一日終わりますねw
その中に、WAFに大きなアップデートがあり、AWS WAFはv2になりました。

早速WAFv2をやってみます
今回は 特定のパスにアクセスできるIPを制限してみる

作ってみる

IP set

  • IPを登録して作成する
  • CIDR何個も登録した場合は、改行区切りで書く

Rule Group

  • Rule Group をいい感じに作ります

  • ルールはあとに作成するので、一旦パス
  • キャパシティはとりあえず 100 にした
    • ※ 注意、あとに変更できない

  • ルールがまだ作ってないので、すきっぷ

  • 作成する

Rule

  • ルールの作成


  • 最初は試しに、 特定のIP指定のパス(/test) だとブロックするルールを作成し、検証する

    • 設定は画像に参考してください〜

  • このルールのキャパシティは 3 ですね

  • また試しにもう一個条件入れてみる
    • Querytest が入るとブロックする条件を追加する
  • 現在のブロック条件は 指定したIPかつパスが/testかつQueryがtest 入るリクエストですね

  • キャパシティが 13 になった
    • 計算式が不明

ACL

  • ACLを作る

  • 別途で作ったALBとアタッチする

    • ALBの作り方は割愛させていただきます
  • 先程作ったルールクループを入れる

  • 100 キャパシティを消費した
  • Default ActionAllow にする

  • ルールが1個しかないので、rule priority設定なし

  • 確認し、作成する

アクセスしてみる

  • http://{ALB_HOST}/ にアクセス

    • 制限されたIPだが、特定のパスではないので、ブロックしてない
  • http://{ALB_HOST}/test?test=1 にアクセスすると

    • 特定のパスにアクセスと、IP制限されたので、ブロックされた
  • 次は本番の 特定のパスにアクセスできるIPを制限してみる

特定のパスにアクセスできるIPを制限してみる

  • まあ、 NOT Statementを使えばいいよね

  • えっ、ちょっと待って、 AND Statementと併用できない

    • これで特定のパスだけ、特定のIPしかアクセスできないことを設定できない
  • この場合、現在はJsonで自分が書くしかないみたい

    • 右上の Rule JSON editor をクリックする

{
  "Name": "test-rule2",
  "Priority": 0,
  "Statement": {
    "AndStatement": {
      "Statements": [
        {
          "NotStatement": {
            "Statement": {
              "IPSetReferenceStatement": {
                "ARN": "arn:aws:wafv2:ap-northeast-1:{AWSのアカウントID}:regional/ipset/{IPset Name}/{IPset ID}"
              }
            }
          }
        },
        {
          "ByteMatchStatement": {
            "SearchString": "/test2",
            "FieldToMatch": {
              "UriPath": {}
            },
            "PositionalConstraint": "STARTS_WITH",
            "TextTransformations": [
              {
                "Priority": 0,
                "Type": "NONE"
              }
            ]
          }
        }
      ]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "test-rule2"
  }
}
  • 保存して終了

  • test-rule2 が作成できました
    • test-rule2 を選択し、 Edit をクリックして修正画面に入る
  • 何故か "SearchString": "/test2" のところが、勝手に Buffer に変更されている

  • とりあえず、テストしてみよう。。。

アクセスしてみる

  • 指定したIPで http://{ALB_HOST}/test2 にアクセス

    • できました
  • 他のIPで http://{ALB_HOST}/test2 にアクセス

    • ブロックされた
      • Buffer に変更されましたが、一応ブロックしてますね

最後に

ACLごとのルールの数が緩和され、AWSマネージドルールグループも使えるWAFv2ですが、色々設定が便利になった反面、使いにくくなったところもありますね。

特に以下数点気になる事があります

  • ルールグループやACL内にしかルールを定義できない
    • ルールを使い回す事ができない
  • ルールグループのキャパシティが変更できない
    • 簡単に変更できるのも問題になるけどね
  • GUIで簡単に複雑なルール条件を作ることができない
    • Json Editorの利用が必要
  • WAFv2のJson Editorで作成したルールの中身を勝手に変更される
    • 正直、使いにくい
  • 日本語のドキュメントが整っていない

現在はまだ使い勝手が悪いですが、
いつか上記のことを更新で改善されたら、今の旧WAFのACLをWAFv2に移行しようと思います