set_owasp_rules
set_owasp_rules(){
clear
f_banner
echo -e "\e[34m---------------------------------------------------------------------------------------------------------\e[00m"
echo -e "\e[93m[+]\e[00m Setting UP OWASP Rules for ModSecurity"
echo -e "\e[34m---------------------------------------------------------------------------------------------------------\e[00m"
echo ""
for archivo in /usr/share/modsecurity-crs/base_rules/*
do ln -s $archivo /usr/share/modsecurity-crs/activated_rules/
done
for archivo in /usr/share/modsecurity-crs/optional_rules/*
do ln -s $archivo /usr/share/modsecurity-crs/activated_rules/
done
spinner
echo "OK"
sed s/SecRuleEngine\ DetectionOnly/SecRuleEngine\ On/g /etc/modsecurity/modsecurity.conf-recommended > salida
mv salida /etc/modsecurity/modsecurity.conf
echo 'SecServerSignature "AntiChino Server 1.0.4 LS"' >> /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf
echo 'Header set X-Powered-By "Plankalkül 1.0"' >> /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf
echo 'Header set X-Mamma "Mama mia let me go"' >> /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf
a2enmod headers
service apache2 restart
say_done
}
La Función set_owasp_rules, se encarga de crear los respectivos links simbólicos para que apache pueda hacer uso de estas reglas y proteger nuestras aplicaciones web.
for archivo in /usr/share/modsecurity-crs/base_rules/*
do ln -s $archivo /usr/share/modsecurity-crs/activated_rules/
done
for archivo in /usr/share/modsecurity-crs/optional_rules/*
do ln -s $archivo /usr/share/modsecurity-crs/activated_rules/
done
spinner
echo "OK"
Por defecto ModSecurity se instala en Modo Detección, es decir, hace logging de los ataques pero no los detiene. Jshielder se encarga de activar ModSecurity en la ejecución mediante el comando:
sed s/SecRuleEngine\ DetectionOnly/SecRuleEngine\ On/g /etc/modsecurity/modsecurity.conf-recommended > salida
mv salida /etc/modsecurity/modsecurity.conf
Cambiamos además los Headers de respuesta para dar la menor información posible de nuestro servidor en caso de reconocimiento pasivo.
echo 'SecServerSignature "AntiChino Server 1.0.4 LS"' >> /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf
echo 'Header set X-Powered-By "Plankalkül 1.0"' >> /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf
echo 'Header set X-Mamma "Mama mia let me go"' >> /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf
Es bueno mencionar y esto va igual para la configuración de ModSecurity tanto para apache como para Nginx, ya que Jshielder lo activa por defecto, es posible que tengamos algunos temas con nuestra aplicación en caso de que algo de la aplicación llegue a matchear con alguna regla de ModSecurity, además de que tampoco podremos acceder a la aplicación via la IP que por seguridad tambien se bloquea. Vamos a darle algunos pasos a seguir y voy a iniciar con lo de la IP.
Si es necesario que durante el despliegue de la aplicación necesiten acceder por la IP, pueden crear una entrada en su archivo de Hosts, con un nombre apuntando a la IP de nuestro servidor.
Ejemplo:
Tengo un Servidor Linux con IP 10.0.0.5 y Asegurado con ModSecurity, aún no le he asignado un Dominio por lo que debo trabajar vía la IP, que puedo Hacer?
Accedemos a /etc/hosts y agregamos
10.0.0.5 prueba.com
Si la aplicación está disparando reglas y bloqueando el acceso, lo que debemos hacer es colocar ModSecurity en modo DetectionOnly y mediante los Logs ir viendo los ID de las reglas que matchean. Usando esta información podemos ir creando excepciones en apache para que ModSecurity nos los bloquee. Para colocar ModSecurity en DetectionOnly deben seguir los siguientes pasos:
$ vi /etc/modsecurity/modsecurity.conf
SecRuleEngine DetectionOnly
$ service apache2 reload
Luego interactuan con la aplicación y miren los logs de errores, cuando algo es detectado por ModSecurity verán algo así.
[Mon Jan 04 08:42:41.378340 2016] [:error] [pid 1280] [client 23.92.*.*] ModSecurity: Warning. Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/share/modsecurity-crs/base_rules/modsecurity_crs_21_protocol_anomalies.conf"] [line "47"] [id "960015"] [rev "1"] [msg "Request Missing an Accept Header"] [severity "NOTICE"] [ver "OWASP_CRS/2.2.8"] [maturity "9"] [accuracy "9"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER_ACCEPT"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [hostname "www.host.com"] [uri "/wp-cron.php"] [unique_id "VopowRdcFcwAAAUACUUAAAAG"]
[Mon Jan 04 08:42:42.019281 2016] [:error] [pid 1280] [client 23.92.*.*] ModSecurity: Warning. Operator LT matched 5 at TX:inbound_anomaly_score. [file "/usr/share/modsecurity-crs/base_rules/modsecurity_crs_60_correlation.conf"] [line "33"] [id "981203"] [msg "Inbound Anomaly Score (Total Inbound Score: 2, SQLi=0, XSS=0): Request Missing an Accept Header"] [hostname "www.host.com"] [uri "/wp-cron.php"] [unique_id "VopowRdcFcwAAAUACUUAAAAG"]
El valor que nos interesa es el ID y con este podremos crear las excepciones en Apache, solo es acceder al virtual host agregar una entrada como esta:
<LocationMatch "/wp-admin/update.php">
<IfModule security2_module>
SecRuleRemoveById 981173
</IfModule>
</LocationMatch>
Si queremos deshabilitar por completo ModSecurity para un directorio lo hacemos así:
<Directory "/var/www/wp-admin">
<IfModule security2_module>
SecRuleEngine Off
</IfModule>
</Directory>