Comment créer des règles JSON personnalisées complexes dans AWS WAF ?

Lecture de 4 minute(s)
0

Je souhaite créer des règles JSON personnalisées complexes dans AWS WAF.

Résolution

Créez des règles personnalisées complexes dans l'éditeur JSON de règles sous Listes ACL Web et Groupes de règles dans la console AWS WAF. Accédez à la règle via son groupe de règles ou la liste de contrôle d'accès Web (ACL Web) dans laquelle elle est définie.

Pour créer des règles personnalisées utilisant des instructions imbriquées, vous devez utiliser l'éditeur JSON. Les instructions imbriquées combinent la logique AND, OR ou NOT. Pour plus d'informations, consultez l’article Principes de base des énoncés de règles.

Pour créer des énoncés de règles, utilisez l'éditeur visuel de règles dans la console AWS WAF. Puis, choisissez Éditeur JSON de règles pour afficher les instructions JSON et apporter les modifications nécessaires dans l'éditeur JSON.

Utilisez les exemples suivants comme référence pour créer votre propre logique de règle personnalisée.

Exemple 1

Utilisez l'énoncé de règle personnalisée suivant pour autoriser une requête lorsqu'elle provient des États-Unis - ÉU et qu'elle possède l'URI /wp-admin/ ou /wp-login/ :

{
  "Name": "test",
  "Priority": 100,
  "Statement": {
    "AndStatement": {
      "Statements": [
        {
          "GeoMatchStatement": {
            "CountryCodes": [
              "US"
            ]
          }
        },
        {
          "OrStatement": {
            "Statements": [
              {
                "ByteMatchStatement": {
                  "SearchString": "/wp-admin/",
                  "FieldToMatch": {
                    "UriPath": {}
                  },
                  "TextTransformations": [
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  ],
                  "PositionalConstraint": "CONTAINS"
                }
              },
              {
                "ByteMatchStatement": {
                  "SearchString": "/wp-login/",
                  "FieldToMatch": {
                    "UriPath": {}
                  },
                  "TextTransformations": [
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  ],
                  "PositionalConstraint": "CONTAINS"
                }
              }
            ]
          }
        }
      ]
    }
  },
  "Action": {
    "Allow": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "test"
  }
}

Logique de règle : la requête est (en provenance des États-Unis) ET l'URI est (/a OU /b)).

Exemple 2

Utilisez l'énoncé de règle personnalisé suivant pour bloquer une requête dont le corps contient des signatures XSS. La règle exclut les URI /test, /login et /admin de l'inspection :

{
 "Name": "XSS_Block_Allow_Uploads",
 "Priority": 100,
 "Statement": {
     "AndStatement": {
     "Statements": [
       {
         "XssMatchStatement": {
           "FieldToMatch": {
             "Body": {}
           },
           "TextTransformations": [
             {
               "Priority": 0,
               "Type": "NONE"
             }
           ]
         }
       },
   {
    "NotStatement": {
     "Statement": {
      "OrStatement": {
       "Statements": [
                 {
                   "ByteMatchStatement": {
                     "SearchString": "/test",
                     "FieldToMatch": {
                       "UriPath": {}
                     },
                     "TextTransformations": [
                       {
                         "Priority": 0,
                         "Type": "NONE"
                       }
                     ],
                     "PositionalConstraint": "EXACTLY"
                   }
                 },
                 {
                   "ByteMatchStatement": {
                     "SearchString": "/admin",
                     "FieldToMatch": {
                       "UriPath": {}
                     },
                     "TextTransformations": [
                       {
                         "Priority": 0,
                         "Type": "NONE"
                       }
                     ],
                     "PositionalConstraint": "EXACTLY"
                   }
                 },
                 {
                   "ByteMatchStatement": {
                     "SearchString": "/login",
                     "FieldToMatch": {
                       "UriPath": {}
                     },
                     "TextTransformations": [
                       {
                         "Priority": 0,
                         "Type": "NONE"
                       }
                     ],
                     "PositionalConstraint": "EXACTLY"
                   }
                 }
               ]
             }
           }
         }
       }
     ]
   }
 },
 "Action": {
   "Block": {}
 },
 "VisibilityConfig": {
   "SampledRequestsEnabled": true,
   "CloudWatchMetricsEnabled": true,
   "MetricName": "XSS_Block_Allow_Uploads"
 }
}

Logique de règle : la requête contient (une signature XSS dans le corps) ET l'URI est NOT (/a OU /b OU /c).

Exemple 3

Utilisez l’énoncé de règle personnalisé suivant pour bloquer une requête lorsqu'il contient l'étiquette personnalisée interne. Les requêtes ne peuvent pas non plus avoir une combinaison spécifique pour l'hôte, l'adresse IP et l'URI :

{
  "Name": "Block_internal_unauthorized",
  "Priority": 100,
  "Statement": {
    "AndStatement": {
      "Statements": [
      {
          "LabelMatchStatement": {
            "Scope": "LABEL",
            "Key": "internal"
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "AndStatement": {
                "Statements": [
                {
                    "ByteMatchStatement": {
                      "FieldToMatch": {
                        "UriPath": {}
                      },
                      "PositionalConstraint": "EXACTLY",
                      "SearchString": "/test",
                      "TextTransformations": [{
                        "Type": "NONE",
                        "Priority": 0
                      }]
                    }
                  },
                  {
                    "IPSetReferenceStatement": {
                      "ARN": "arn:aws:wafv2:us-east-1:xxxxxxxxxxxx:regional/ipset/internal_IPs/xxx-xx-xxx"
                    }
                  },
                  {
                    "ByteMatchStatement": {
                      "FieldToMatch": {
                        "SingleHeader": {
                          "Name": "host"
                        }
                      },
                      "PositionalConstraint": "EXACTLY",
                      "SearchString": "example.com",
                      "TextTransformations": [{
                        "Type": "NONE",
                        "Priority": 0
                      }]
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  },
  "Action": {
   "Block": {}
 },
 "VisibilityConfig": {
   "SampledRequestsEnabled": true,
   "CloudWatchMetricsEnabled": true,
   "MetricName": "Block_internal_unauthorized"
 }
}

Logique de règle : si la requête (contient l'étiquette) ET non (l’URI, l’adresse IP et l’hôte), bloquer.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 3 mois