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>