Editor Gutenberg de WordPress y mod_security

por | diciembre 19, 2019

Gutenberg es el nuevo editor de contenido introducido en WordPress 5.0. No es plato de gusto para todos… tampoco para mod_security. Aún si utilizamos las reglas Core Rule Set 3 para adaptarlas a WordPress, sigue dando problemas con una gran cantidad de falsos positivos. Éstos además suelen darse por reglas que saltan en fase 1, por lo que si intentamos realizar exclusiones dentro de directivas como Location no funcionarán como explicaba en este otro artículo.

Si finalmente queremos utilizar Gutenberg en combinación con mod_security como WAF tendremos que realizar una serie de ajustes. Los iremos afinando poco a poco teniendo que hacer uso de los logs de auditoría, ya que en cada caso particular pueden saltar falsos positivos de distintas reglas, especialmente si hacemos uso de plugins que se integran con el editor.

Podemos realizar la exclusión de forma global o a nivel de VirtualHost. En mi caso prefiero esto último ya que me permite ser más específico para los distintos sitios web que sirvo desde un mismo Apache. Un ejemplo de reglas excluídas para el área de administración de WordPress:

SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=941180,id:000001"
SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=941320,id:000002"
SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=942430,id:000003"
SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=949110,id:000004"
SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=980130,id:000005"
SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=942130,id:000006"
SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=942440,id:000007"
SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=941330,id:000008"
SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=942330,id:000009"
SecRule REQUEST_HEADERS:Referer "@beginswith https://www.example.com/wp-admin" "phase:1,nolog,pass,ctl:ruleRemoveById=942260,id:000010"

Como comentaba cada caso podrá variar así que se tendrán que ir ajustando las exclusiones de reglas según necesidades.