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.

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 encabezado de solicitud cuyo valor se excluye de la inspección durante la evaluación de reglas de WAF preconfigurada.

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 reglas 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 reglas 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 URIs de la línea de solicitud que excluye los datos de la cadena de consulta que se excluirán 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 de EQUALS_ANY.

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

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

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

Para los URI de solicitud, el valor del campo debe proporcionarse en formato de URI, como se muestra a continuación:

  • Se permite un esquema, pero está restringido a http o https solamente.
  • Se permite un host, y puede ser una dirección IP.
  • Se permite un puerto.
  • Se permite una ruta.
  • No se permite una consulta.
  • No se permite un fragmento.

Cuando se aplican exclusiones para URI de solicitud, los valores de campo configurados se comparan con los URI (distingue mayúsculas de minúsculas, después de la transformación) de la línea de solicitud, y se excluye la cadena de consulta. Los URI de la línea de solicitud pueden ser relativos o absolutos. Ten esto en cuenta cuando configures las exclusiones de 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 encabezado Content-Type indica el formato de los datos en el cuerpo de la solicitud. De forma predeterminada, Google Cloud Armor trata el contenido del cuerpo de POST como una string, que es apta para la inspección y coincidencia de tus 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 es compatible con los siguientes tipos de codificación:

  • JSON
  • GraphQL

A fin de configurar la lista de valores de encabezado Content-Type personalizados para los que se aplica el análisis alternativo, usa el siguiente ejemplo. En el ejemplo, se actualiza la política de seguridad POLICY_NAME para habilitar el análisis de JSON y se especifican los tipos de contenido application/json, application/vnd.api+json, application/vnd.collection+json y application/vnd.hyper+json:

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD \
    --json-custom-content-types "application/json,application/vnd.api+json,application/vnd.collection+json,application/vnd.hyper+json"

Como alternativa, si tu política de seguridad protege una aplicación que usa GraphQL o recibe contenido codificado en GraphQL, puedes usar el argumento STANDARD_WITH_GRAPHQL para analizar el contenido del cuerpo de POST como contenido de GraphQL, como en el siguiente ejemplo:

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD_WITH_GRAPHQL

La inspección del cuerpo de POST se limita a los primeros 8 KB. Para obtener más información, consulta Limitaciones de las políticas de seguridad.

  • Si el contenido JSON supera los 8 KB, Google Cloud Armor aplica el análisis de JSON a los primeros 8 KB de contenido utilizado inspeccionado por cualquier regla de WAF preconfigurada.

  • Si el analizador de JSON no muestra ningún resultado, se puede intentar el análisis de URI. Si el analizador de URI no muestra parámetros de nombre-valor o muestra solo parámetros nombre-valor parciales, la string completa o parcial podría tratarse como el nombre de parámetro para la inspección.

¿Qué sigue?