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:
-
- 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
-
- 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:
- Buscar los logs relevantes de ModSecurity:
En los logs del Ingress Controller debe buscar las entradas que contengan
[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
.