Quiero crear reglas JSON personalizadas y complejas en AWS WAF.
Resolución
Cómo crear una regla personalizada compleja
Sigue estos pasos:
- Abre la consola de AWS WAF.
- En el panel de navegación, selecciona Rule groups (Grupos de reglas).
- Elige tu grupo de reglas.
- Selecciona Manage rules (Administrar reglas) y, a continuación, Add rule (Agregar regla).
- Selecciona Custom rule (Regla personalizada) y, a continuación, selecciona Next (Siguiente).
- Selecciona JSON para abrir el editor JSON de reglas.
- Actualiza el editor JSON de reglas con tu regla personalizada.
- Selecciona Add rule (Agregar regla).
Nota: Para crear reglas personalizadas que usen enunciados anidados, debes usar el editor JSON. Los enunciados anidados combinan la lógica de AND, OR o NOT. Para obtener más información, consulta Uso de enunciados de reglas en AWS WAF.
Utiliza los siguientes ejemplos como referencia para crear tu propia lógica de reglas personalizada.
Ejemplo 1
Usa el siguiente enunciado de regla personalizada para permitir una solicitud cuando se origine en Estados Unidos (EE. UU.) y tenga el URI /wp-admin/ o /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"
}
}
Lógica de la regla: La solicitud es (de EE. UU.) AND el URI es ( /a OR /b ).
Ejemplo 2
Utiliza el siguiente enunciado de regla personalizada para bloquear una solicitud cuando tenga firmas de XSS en el cuerpo. La regla excluye de la inspección los URI /test, /login y /admin:
{
"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"
}
}
Lógica de la regla: La solicitud tiene (la firma de XSS en el cuerpo) AND el URI es NOT ( /a OR /b OR /c ).
Ejemplo 3
Utiliza el siguiente enunciado de regla personalizada para bloquear una solicitud cuando tenga la etiqueta personalizada internal. Las solicitudes tampoco pueden tener una combinación específica para el host, la dirección IP y el 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:555555555555:regional/ipset/internal_IPs/###-##-###"
}
},
{
"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"
}
}
Lógica de la regla: Si la solicitud (contiene la etiqueta) AND NOT (URI e IP y host), se bloqueará.