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

Dernière mise à jour : 21/07/2022

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

Solution

Créez des règles personnalisées complexes dans l'éditeur de règles JSON lors de l'ajout d'une règle personnalisée pour AWS WAF. Les règles sont créées et gérées dans des ACL Web et les groupes de règles dans la console AWS WAF. Vous pouvez accéder à une règle par son nom dans le groupe de règles ou la l'ACL Web où elle est définie.

Si votre cas d'utilisation exige une règle personnalisée qui nécessite une combinaison de logique AND, OR ou NOT (déclarations imbriquées), vous devez créer la règle à l'aide de l'éditeur JSON. Pour plus d'informations, consultez Déclarations de règles AWS WAF.

Conseil : vous pouvez utiliser l'éditeur visuel de règles, situé dans la console AWS WAF, pour créer des déclarations de règles similaires à votre cas d'utilisation. Ensuite, pour afficher les déclarations JSON, choisissez Rule JSON editor (Éditeur de règles JSON) et apportez les modifications nécessaires dans l'éditeur JSON.

Les exemples suivants fournissent une référence que vous pouvez utiliser pour créer votre propre logique de règle personnalisée :

Exemple 1

Il s'agit d'une déclaration de règle personnalisée qui autorise une demande si elle provient des États-Unis – USA et que l'URI est /wp-admin/ ou /wp-login/ :

Logique de la règle : si une demande provient (des États-Unis) ET que l'URI est ( /a OU /b ) ).

{
  "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"
  }
}

Exemple 2

Il s'agit d'une déclaration de règle personnalisée qui bloque une demande si elle contient des signatures XSS dans BODY, mais exclut les URI /test, /login et /admin de l'inspection :

Logique de la règle : si une demande a (signature XSS dans body) ET l'URI n'est PAS ( /a OU /b, OU /c ).

{
 "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"
 }
}

Exemple 3

Il s'agit d'une déclaration de règle personnalisée qui bloque une demande si elle contient une étiquette interne personnalisée, mais que l'hôte, l'IP et l'URI ne sont pas une combinaison spécifique :

Logique de la règle : si la demande (contient l'étiquette) ET pas (URI et IP et hôte), alors bloquer.

{
  "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"
 }
}

Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?