LoginSignup
13
6

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-16

初めに

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

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

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

作ってみる

IP set

スクリーンショット 2019-12-05 17.32.25.png

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

Rule Group

  • Rule Group をいい感じに作ります スクリーンショット 2019-12-05 17.51.56.png

スクリーンショット 2019-12-05 17.57.45.png

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

スクリーンショット 2019-12-05 17.58.00.png

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

スクリーンショット 2019-12-05 17.58.11.png

  • 作成する

Rule

  • ルールの作成
    スクリーンショット 2019-12-05 18.05.44.png
    スクリーンショット 2019-12-05 18.06.11.png
    スクリーンショット 2019-12-05 18.06.17.png

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

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

スクリーンショット 2019-12-06 12.59.14.png

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

スクリーンショット 2019-12-06 13.01.34.png

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

スクリーンショット 2019-12-06 13.05.57.png

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

ACL

  • ACLを作る
    スクリーンショット 2019-12-06 13.07.14.png

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

    • ALBの作り方は割愛させていただきます スクリーンショット 2019-12-06 13.17.20.png
  • 先程作ったルールクループを入れる

スクリーンショット 2019-12-06 13.09.27.png

  • 100 キャパシティを消費した
  • Default ActionAllow にする
    スクリーンショット 2019-12-06 13.10.25.png

  • ルールが1個しかないので、rule priority設定なし
    スクリーンショット 2019-12-06 13.11.39.png

  • 確認し、作成する

アクセスしてみる

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

    • 制限されたIPだが、特定のパスではないので、ブロックしてない スクリーンショット 2019-12-06 13.23.00.png
  • http://{ALB_HOST}/test?test=1 にアクセスすると

    • 特定のパスにアクセスと、IP制限されたので、ブロックされた スクリーンショット 2019-12-06 13.23.53.png
  • 次は本番の 特定のパスにアクセスできるIPを制限してみる

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

  • まあ、 NOT Statementを使えばいいよね
    スクリーンショット 2019-12-06 13.26.40.png

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

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

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

スクリーンショット 2019-12-06 13.34.16.png

{
  "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"
  }
}
  • 保存して終了

スクリーンショット 2019-12-06 13.43.59.png

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

スクリーンショット 2019-12-06 13.41.00.png

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

アクセスしてみる

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

    • できました スクリーンショット 2019-12-06 13.48.15.png
  • 他のIPで http://{ALB_HOST}/test2 にアクセス

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

スクリーンショット 2019-12-06 13.49.04.png

最後に

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

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

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

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

13
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6