Ajusta las reglas preconfiguradas de WAF de Google Cloud Armor

Google Cloud Armor proporciona Reglas de WAF preconfiguradas, cada una de las cuales consiste en varias firmas originadas del Conjunto de reglas principales (CRS) de ModSecurity. Cada firma corresponde a una regla de detección de ataques en el conjunto de reglas. Las solicitudes entrantes se evalúan en función de las reglas de WAF preconfiguradas. Una solicitud coincide con una regla de WAF preconfigurada si coincide con alguna de las firmas asociadas con la regla de WAF preconfigurada. Se genera una coincidencia cuando la expresión evaluatePreconfiguredWaf() o evaluatePreconfiguredExpr() muestra el valor true.

Elige un nivel de sensibilidad

Cada firma tiene un nivel de sensibilidad que corresponde a un nivel de paranoia de ModSecurity. Puedes seleccionar una sensibilidad entre 0 y 4, aunque el nivel de sensibilidad 0 significa que no hay reglas habilitadas de forma predeterminada.

Un nivel de sensibilidad más bajo indica firmas de confianza más alta, que tienen menos probabilidades de generar un falso positivo. Un nivel de sensibilidad más alto aumenta la seguridad, pero también aumenta el riesgo de generar un falso positivo. Cuando seleccionas un nivel de sensibilidad para tu regla de WAF, debes habilitar firmas en los niveles de sensibilidad inferiores o iguales al nivel de sensibilidad seleccionado. En el siguiente ejemplo, se selecciona el nivel de sensibilidad de 1 para ajustar una regla de WAF preconfigurada:

evaluatePreconfiguredWaf('sqli-v33-stable', {'sensitivity': 1})

Inhabilita las firmas de reglas

Si decides que una regla de WAF preconfigurada coincide con más solicitudes de lo necesario o si la regla bloquea el tráfico que se debe permitir, esta se puede ajustar para inhabilitar firmas ruidosas o innecesarias. Para inhabilitar firmas en una regla de WAF preconfigurada en particular, proporciona una lista de los IDs de las firmas no deseadas a la expresión evaluatePreconfiguredWaf().

En el siguiente ejemplo, se excluyen dos ID de reglas CRS de la regla de WAF sqli-v33-stable (CRS 3.3) preconfigurada:

evaluatePreconfiguredWaf('sqli-v33-stable', {'sensitivity': 4, 'opt_out_rule_ids': ['owasp-crs-v030301-id942350-sqli', 'owasp-crs-v030301-id942360-sqli']})

Cuando inhabilitas el ID de firma de conjuntos de reglas de CRS preconfiguradas, debes hacer coincidir la versión del ID de firma con la versión del conjunto de reglas (CRS 3.0 o 3.3) para evitar errores de configuración.

También puedes inhabilitar los IDs de firma mediante la expresión heredada evaluatePreconfigureExpr(). Para obtener más información sobre las expresiones de reglas de WAF preconfiguradas, consulta la referencia del lenguaje de reglas personalizadas.

Habilita las firmas de reglas

En lugar de inhabilitar las firmas de reglas, puedes habilitarlas en niveles de sensibilidad inhabilitados. Te recomendamos que habilites las firmas de reglas cuando haya menos firmas que desees usar en un nivel de sensibilidad determinado que reglas que desees inhabilitar. Para habilitar las firmas de reglas, el nivel de sensibilidad debe ser 0. En el siguiente ejemplo, se inhabilitan todas las firmas cve-canary en todos los niveles de sensibilidad y, luego, se habilitan de forma explícita owasp-crs-v030001-id044228-cve y owasp-crs-v030001-id144228-cve:

evaluatePreconfiguredWaf('cve-canary', {'sensitivity': 0, 'opt_in_rule_ids': ['owasp-crs-v030001-id044228-cve', 'owasp-crs-v030001-id144228-cve']})

Excluye los campos de solicitud de la inspección

Tu aplicación personalizada puede incluir contenido en campos de solicitud (como encabezados, cookies, parámetros de consulta o URI) que coincida con las firmas de las reglas de WAF preconfiguradas, pero que sabes que es legítimo. En este caso, puedes reducir los falsos positivos si excluyes esos campos de solicitud mediante la asociación de una lista de exclusiones para los campos de solicitud con la regla de política de seguridad. Ten en cuenta que cuando tienes una exclusión de campo de solicitud adjunta a una regla de WAF, no puedes usar la acción allow.

Cuando configuras una exclusión de campos de solicitud, la asocias con un destino, que puede ser una regla completa de WAF preconfigurada o una lista de firmas en una regla de WAF preconfigurada. Puedes especificar una coincidencia exacta o una coincidencia parcial con un operador de campo y un valor de campo. Los operadores de campo disponibles son los siguientes:

  • EQUALS: El operador coincide si el valor del campo es igual al valor especificado.
  • STARTS_WITH: El operador coincide si el valor del campo comienza con el valor especificado.
  • ENDS_WITH: El operador coincide si el valor del campo termina con el valor especificado.
  • CONTAINS: El operador coincide si el valor del campo contiene el valor especificado.
  • EQUALS_ANY: El operador coincide si el valor del campo es cualquier valor.

En las siguientes secciones, se proporciona más información sobre los campos de solicitud que puedes excluir de la inspección, seguidas de ejemplos.

Encabezados de la solicitud

Una lista de nombres de encabezados de solicitud cuyo valor se excluye de la inspección durante evaluación de reglas de WAF preconfiguradas.

La exclusión solo se aplica a las firmas en el destino que inspeccionarían el valor del encabezado de solicitud originalmente. Esto incluye las firmas que están asociadas con la siguiente marca de solicitud del conjunto de reglas principales de ModSecurity:

  • REQUEST_HEADERS

Solo se excluye de la inspección el valor de los encabezados de solicitud especificados. El nombre se inspecciona de todos modos.

Cookies de solicitud

Una lista de nombres de cookies de solicitud cuyo valor se excluye de la inspección durante la evaluación de la regla de WAF preconfigurada.

La exclusión solo se aplica a las firmas en el destino que inspeccionarían el valor de la cookie de solicitud originalmente. Esto incluye las firmas que están asociadas con la siguiente marca de solicitud del conjunto de reglas principales de ModSecurity:

  • REQUEST_COOKIES

Solo se excluye de la inspección el valor de las cookies de solicitud especificadas. El nombre se inspecciona de todos modos.

Parámetros de consulta de solicitud

Una lista de nombres de parámetros de consulta de solicitud cuyo valor se excluye de la inspección durante la evaluación de la regla de WAF preconfigurada.

La exclusión solo se aplica a las firmas en el destino que inspeccionarían los parámetros de solicitud originalmente. Esto incluye las firmas que están asociadas con las siguientes marcas de solicitud del conjunto de reglas principales de ModSecurity:

  • ARGS
  • ARGS_GET
  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE

Solo el valor de los parámetros de consulta especificados se excluye de la inspección, que puede ser en la string de consulta o en el cuerpo de POST. El nombre se inspecciona de todos modos.

Debido a que los parámetros de consulta son parte del URI y la línea de solicitud, estos campos se vuelven a ensamblar para inspeccionarlos después de excluir los parámetros de consulta especificados. Sin embargo, para las firmas que inspeccionan todo el cuerpo de la solicitud (como las firmas asociadas con la marca de la solicitud REQUEST_BODY), no se aplica la exclusión de los parámetros de consulta.

Por ejemplo, si excluyes un parámetro de consulta llamado “args”, es posible que aún veas una coincidencia en una firma que inspeccione todo el cuerpo de la solicitud si la solicitud tiene un parámetro “args” en el cuerpo de POST y el valor de “args” coincide.

URI de solicitud

Una lista de URI de la línea de solicitud que excluye los datos de la cadena de consulta para excluirlos de la inspección durante la evaluación de la regla de WAF preconfigurada

La exclusión solo se aplica a las firmas en el destino que inspeccionarían los URI de solicitud originalmente. Esto incluye las firmas que están asociadas con las siguientes marcas de solicitud del conjunto de reglas principales de ModSecurity:

  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE
  • REQUEST_FILENAME
  • REQUEST_BASENAME

Cuando se excluye cualquiera de los campos anteriores, el campo se excluye por completo de la inspección y no se vuelve a ensamblar.

Valores de campo

Debes especificar un valor de campo si usas un operador de campo distinto del EQUALS_ANY

En el caso de los encabezados de solicitud, las cookies de solicitud y los parámetros de consulta de solicitud, el conjunto de caracteres permitido para los valores de campo incluye los siguientes caracteres:

  • !, #, $, %, &, *, +, -, ., ^, _, `, |, ~
  • Caracteres alfa de A a Z (mayúsculas y minúsculas)
  • Caracteres de dígitos 0 a 9

Cuando se aplican exclusiones para estos campos de solicitud, los valores de campo configurados se comparan como están con los valores (sin distinción entre mayúsculas y minúsculas, después de la transformación) de la solicitud. No se espera que realices una codificación adicional si quieres excluir un carácter específico que no está en el conjunto de caracteres permitido.

En el caso de los URIs de solicitud, el valor del campo debe proporcionarse en un formato de URI de la siguiente manera:

  • Se permite un esquema, pero solo se restringe a http o https.
  • Se permite un host, que puede ser una dirección IP.
  • Se permite un puerto.
  • Se permite una ruta de acceso.
  • No se permite realizar una consulta.
  • No se permite un fragmento.

Cuando se aplican exclusiones para los URIs de solicitud, los valores de campo configurados se comparan como están en los URIs (no distingue mayúsculas de minúsculas, después de la transformación) de la línea de solicitud, sin incluir la cadena de consulta. Los URIs de la línea de solicitud pueden ser relativos o absolutos. Ten esto en cuenta cuando configures para los URI de solicitud.

Ejemplos

En el primer ejemplo, se actualiza la regla en la política de seguridad POLICY_1 en PRIORITY a fin de agregar una configuración de exclusión para todas las firmas en la regla de WAF sqli-v33-stable a fin de excluir todas las cookies de solicitud de la inspección:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_1 \
    --target-rule-set "sqli-v33-stable" \
    --request-cookie-to-exclude "op=EQUALS_ANY"

En el segundo ejemplo, se actualiza la regla en la política de seguridad POLICY_2 en PRIORITY a fin de agregar una configuración de exclusión para las firmas owasp-crs-v030301-id941140-xss y owasp-crs-v030301-id941270-xss en la regla de WAF xss-v33-stable, para excluir de la inspección los encabezados de solicitud que comienzan con abc o terminan con xyz:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_2 \
    --target-rule-set "xss-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id941140-xss" "owasp-crs-v030301-id941270-xss" \
    --request-header-to-exclude "op=STARTS_WITH,val=abc" \
    --request-header-to-exclude "op=ENDS_WITH,val=xyz"

En el tercer ejemplo, se actualiza la regla en la política de seguridad POLICY_3 en PRIORITY a fin de quitar todas las exclusiones del campo de solicitud para los IDs de regla owasp-crs-v030301-id942110-sqli y owasp-crs-v030301-id942120-sqli en sqli-v33-stable.

gcloud compute security-policies rules remove-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_3 \
    --target-rule-set "sqli-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id942110-sqli,owasp-crs-v030301-id942120-sqli"

Aplica el análisis en los valores de encabezado Content-Type personalizados

Cuando Google Cloud Armor evalúa el cuerpo de POST con las reglas de WAF preconfiguradas, el El encabezado Content-Type indica el formato de los datos en el cuerpo de la solicitud. De de forma predeterminada, Google Cloud Armor trata el contenido del cuerpo de POST como uno de salida, las cuales son aptas para inspeccionarse y hacer coincidir en tu reglas de WAF preconfiguradas. Sin embargo, puedes configurar un análisis más preciso si tus solicitudes entrantes tienen una codificación diferente. Google Cloud Armor admite los siguientes tipos de codificación:

  • JSON
  • GraphQL

Para obtener más información, consulta Análisis de contenido del cuerpo de POST.

¿Qué sigue?