Saltar al contenido principal
Version: Next

Modsecurity

ModSecurity

Por defecto cualquier entrada de ingress a través del cluster esta protegida por el ModSecurity, es posible que se provoque algún falso positivo en las reglas de validación. Para poder saltar este caso hay que agregar una excepción a la regla que provoca el problema.

Detectar cual es la regla que falla

Cuando se produce un error 403 (Acceso Denegado) en la aplicación, es posible que una regla de ModSecurity esté bloqueando la solicitud. Para confirmar esto y corregir el problema, puede serguir los siguientes pasos:

    1. Acceder a los logs del Ingress Controller: El Ingress Controller (como NGINX) en Kubernetes generalmente guarda los logs de ModSecurity. Puede utilizar el siguiente comando para revisar los logs:
kubectl logs -n <namespace-del-ingress> <nombre-del-pod-ingress-controller> --tail=1000
    1. Buscar los logs relevantes de ModSecurity: En los logs del Ingress Controller debe buscar las entradas que contengan ModSecurity y se debe ver si la solicitud fue bloqueada. Dentro de los logs se debe visualizar algo como lo siguiente:
[client <IP>] ModSecurity: Access denied with code 403 (phase 1). Matched "Operator ...." at ARGS. [file "/etc/nginx/modsec/rules.conf"] [line "XX"] [id "949110"] [msg "SQL Injection Attack Detected"] [uri "/v1/nodes"]

Lo que se debe obtener es el número de regla, y la uri bloqueada, ejemplo:

Número de regla: (generalmente 949110) Uri: /v1/nodes

Nota: Este proceso de diagnóstico manual puede simplificarse considerablemente si tienes configurado un dashboard de monitoreo como Grafana

Agregar excepción a la regla

Para agregar las excepciones al ModSecurity se debe agregar en el achivo uunn-overlay/common/ingress/kustomization debajo de modsecurity-snippet y justo después de SecRequestBodyAccess On las siguientes líneas:

      - op: add
path: /metadata/annotations/nginx.ingress.kubernetes.io~1modsecurity-snippet
value: |
SecRuleEngine On
SecRequestBodyAccess On
SecRule REQUEST_URI "@beginsWith /v1/nodes" "id:1007,phase:1,pass,nolog,ctl:ruleRemoveById=949110"

Debe cambiar la URI por la correspondiente asi como tambien el ID.

Sugerencia

Se pueden poner reglas mas genéricas a / pero esto reduce la seguridad, es conveniente que las reglas sean más especificas. Por ejemplo: si el error es en /v1/nodes/node y /v1/nodes/node2 ponemos la excepción en /v1/nodes.