タケユー・ウェブ日報

Webシステム受託会社の業務の中での気づきや調べごとのメモ。

AWS WAF v2 を使って特定のURLパスにアクセス元IPアドレス制限をかける

やりたかったこと

  • ALB 配下のWebサーバーの特定のURLパス( /admin/ )には特定のIPアドレスからのみアクセスできるようにする
  • IPアドレスの数は1個~たくさん

断念したこと

CloudFormation テンプレート

ポイント

  • AWS::WAFv2::IPSetIPアドレス(プレフィクス付き)を指定すること
  • CloudFrontで使う場合は Scope: "CLOUDFRONT" にすることと、米国東部 (バージニア北部) リージョン (us-east-1) にリソースを作成すること。ALBで使う場合は Scope: "REGIONAL"
  • ルールの順番は次の通り
    1. 「特定のURLパス」以外なら許可
    2. 「特定のIPアドレス」なら許可
    3. どちらでもない場合は拒否

YAML

Parameters:
  LoadBalancerArn:
    Type: String
  PathPattern:
    Type: String
    Default: /admin/

Resources:
  WlitelistIpAddressSet:
    Type: "AWS::WAFv2::IPSet"
    Properties:
      Addresses:
        -  200.100.0.0/24
        -  100.200.100.200/32
      IPAddressVersion: IPV4
      Scope: "REGIONAL"

  WhitelistPathPatternSet:
    Type: AWS::WAFv2::RegexPatternSet
    Properties: 
      RegularExpressionList: 
        - !Sub "^${PathPattern}*"
      Scope: "REGIONAL"

  WebACLAssociation:
    Type: AWS::WAFv2::WebACLAssociation
    Properties: 
      ResourceArn: !Ref LoadBalancerArn
      WebACLArn: !GetAtt WhitelistWAFv2WebACL.Arn

  WhitelistWAFv2WebACL:
    Type: "AWS::WAFv2::WebACL"
    Properties:
      DefaultAction:
        Block: {}
      Rules:
        - Name: "WhitelistWAFv2WebACLRulePathPattern"
          Action:
              Allow: {}
          Priority: 100
          Statement:
            NotStatement:
              Statement:
                RegexPatternSetReferenceStatement:
                  Arn: !GetAtt WhitelistPathPatternSet.Arn
                  FieldToMatch: 
                    UriPath: {}
                  TextTransformations: 
                    - Type: "URL_DECODE"
                      Priority: 0
          VisibilityConfig:
            CloudWatchMetricsEnabled: true
            MetricName: "WhitelistWAFv2WebACLRulePathPatternMetric"
            SampledRequestsEnabled: true
        - Name: "WhitelistWAFv2WebACLRuleIPSet"
          Action:
              Allow: {}
          Priority: 1000
          Statement:
            IPSetReferenceStatement:
              Arn: !GetAtt WlitelistIpAddressSet.Arn
          VisibilityConfig:
            CloudWatchMetricsEnabled: true
            MetricName: "WhitelistWAFv2WebACLRuleIPSetMetric"
            SampledRequestsEnabled: true
      Scope: "REGIONAL"
      VisibilityConfig:
        CloudWatchMetricsEnabled: true
        MetricName: "WhitelistWAFv2WebACLMetric"
        SampledRequestsEnabled: true