Como faço para criar regras personalizadas complexas de JSON no AWS WAF?

Última atualização: 21/07/2022

Como faço para criar regras personalizadas complexas de JSON no AWS WAF?

Resolução

Crie regras personalizadas complexas no editor JSON de regas quando adicionar uma regra personalizada para o AWS WAF. As regras são criadas e gerenciadas em ACLs da Web e grupos de regras no console do AWS WAF. Você pode acessar uma regra pelo nome no grupo de regras ou na ACL da Web em que ela está definida.

Se o caso de uso exigir uma regra personalizada que precisa de uma combinação de lógica AND, OR ou NOT (instruções aninhadas), você deverá criar a regra usando o editor JSON. Para obter mais informações, consulte Instruções de regras do AWS WAF.

Dica: você pode usar o editor visual de regras, localizado no console do AWS WAF, para criar instruções de regras semelhantes ao caso de uso. Depois, para visualizar as instruções JSON, escolha Rule JSON editor (Editor JSON de regras) e faça as alterações necessárias no editor JSON.

Os exemplos a seguir fornecem uma referência que você pode usar para criar sua própria lógica de regras personalizadas:

Exemplo 1

Esta é uma instrução de regra personalizada que permite uma solicitação se ela se for originada nos Estados Unidos - EUA e o URI for /wp-admin/ ou /wp-login/:

Lógica da regra: se uma solicitação for (dos EUA) AND o URI for (/a OR /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"
  }
}

Exemplo 2

Esta é uma instrução de regra personalizada que bloqueia uma solicitação se ela tiver assinaturas XSS no CORPO, mas excluir os URIs /test, /login e /admin da inspeção:

Lógica da regra: se uma solicitação tiver (assinatura XSS no corpo) AND o URI for NOT (/a OR /b, OR /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"
 }
}

Exemplo 3

Esta é uma instrução de regra personalizada que bloqueia uma solicitação se ela contiver um rótulo personalizado interno, mas o host, o IP e o URI não forem uma combinação específica:

Lógica da regra: se a solicitação (contém o rótulo) AND not (URI e IP e host), então bloqueie.

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

Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?