Actualización: la respuesta actual se actualiza por completo.
De acuerdo con esta discusión , creé un repositorio de GitHub llamado WWW Security Assistant . Hay una rama, llamada ask_ubuntu
, dedicada a esta respuesta. Todas las referencias, anteriormente disponibles aquí , se eliminan debido al límite de caracteres: están disponibles en GitHub.
A continuación, se analizan algunas formas, involucradas en un mecanismo completo, de cómo aumentar la seguridad de Apache2 en Ubuntu 16.04.
Tabla de contenidos:
- WWW Security Assistant Script (WSAS) ► Iptables
- Iptables - Configuración básica - Guardar y restaurar
- ModEvasive para Apache2
- ModEvasive ► WSAS ► Iptables
- ModSecurity 2.9 para Apache2
- ModSecurity OWASP Core Rule Set 3.x
- Lista blanca de reglas de ModSecurity
- Reglas de ModSecurity ► WSAS ► Iptables
- ModSecurity y archivos de registro de Apache
- Archivos de registro de ModSecurity ► Fail2Ban ► Iptables
- ModSecurity GuardianLog ► HTTPD Guardian ► WSAS ► Iptables
- ModSecurity GuardianLog ► Análisis personalizado HTTPD ► WSAS ► Iptables
Además, digamos que siempre es bueno usar HTTPS:
WWW Security Assistant Script ► Iptables
Aquí se presenta el guión www-security-assistant.bash
. Podría ayudarlo a manejar las direcciones IP maliciosas. El guión tiene dos modos.
Modo automatico
Cuando un programa externo, como el de Apache mod_security
, proporciona una $IP
dirección maliciosa . En este caso, la sintaxis que invoca el script debe ser:
www-security-assistant.bash <ip-address> Guardian
www-security-assistant.bash <ip-address> ModSecurity
www-security-assistant.bash <ip-address> ModEvasive
www-security-assistant.bash <ip-address> a2Analyst
En este modo, el script proporciona dos etapas de acción y para cada acción enviará un correo electrónico a los administradores.
Primera etapa: durante las primeras 'transgresiones' la fuente $IP
será prohibida por un período de tiempo igual al valor de $BAN_TIME
. Este modo usa el comando at
.
Segunda etapa: cuando el número de transgresiones de ciertos $IP
se iguala al valor de $LIMIT
, esta $IP
dirección se prohibirá permanentemente a través de Iptables y se agregará a $BAN_LIST
.
Modo manual
Este modo acepta las siguientes opciones:
www-security-assistant.bash <ip-address>
--DROP "log notes"
Crea una entrada en el archivo /var/www-security-assistant/iptables-DROP.list
y genera una regla como:
iptables -A GUARDIAN -s $IP -j DROP
www-security-assistant.bash <ip-address>
--DROP-CLEAR "log notes"
Crea una entrada en el archivo /var/www-security-assistant/iptables-DROP-CLEAR.list
, elimina la cierta regla de Iptables, elimina la $IP
del historial y de $BAN_LIST
:
iptables -D GUARDIAN -s $IP -j DROP
www-security-assistant.bash <ip-address>
--ACCEPT "log notes"
Crea solo una entrada en el archivo /var/www-security-assistant/iptables-ACCEPT.list
.
www-security-assistant.bash <ip-address>
--ACCEPT-CHAIN "log notes"
Crea una entrada en el archivo /var/www-security-assistant/iptables-ACCEPT.list
y genera una regla como:
iptables -A GUARDIAN -s $IP -j ACCEPT
Dependencias
El script usa iptables-save.sh
y la iptables
cadena GUARDIAN
, explicada en la siguiente sección. Creará y mantendrá pocos archivos dentro de $WORK_DIR
:
www-security-assistant.history
- contiene los datos de las transgresiones de IP anteriores.
www-security-assistant.mail
- el contenido del último correo electrónico enviado por el script.
iptables-ACCEPT.list
; iptables-DROP.list
y iptables-DROP-CLEAR.list
.
El script necesita una configuración mínima para enviar correos electrónicos:
sudo apt install s-nail mutt mailutils postfix
sudo dpkg-reconfigure postfix # For General type: Internet Site
echo 'Test passed.' | mail -s Test-Email email@example.com
Si hay algún servicio HTTPS configurado, su certificado TLS se puede usar dentro del servicio Postfix.
Además, el script usa at
: sudo apt install at
.
Instalación
Crear directorio de trabajo, llamémoslo /var/www-security-assistant
. Descargar www-security-assistant.bash
y hacerlo ejecutable:
sudo mkdir /var/www-security-assistant
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/www-security-assistant.bash -O /var/www-security-assistant/www-security-assistant.bash
sudo chmod +x /var/www-security-assistant/www-security-assistant.bash
Poner a www-security-assistant.bash
disposición como comando personalizado:
sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
Conceder permiso para www-data
ejecutar www-security-assistant.bash
sin contraseña a través de sudo
. Use el siguiente comando para crear y editar de forma segura un nuevo archivo con una sudoers
regla adicional ' ':
sudo visudo -f /etc/sudoers.d/www-security-assistant
Agregue la siguiente línea dentro del archivo: guarde el archivo y salga:
www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
Tweak www-security-assistant.bash
. Cambie al menos el valor de la variable $EMAIL_TO
.
Chequeo
Represéntese como $AGENT
y verifique si el MODO automático funciona correctamente:
www-security-assistant.bash 192.168.1.177 Guardian
Luego revise su correo electrónico, escriba iptables -L GUARDIAN -n
, revise los archivos www-security-assistant.history
y www-security-assistant.mail
. Ejecute el comando anterior 5 veces y revise los archivos iptables-DROP.list
y iptables-CURRENT.conf
.
Compruebe si el MODO manual funciona correctamente; agregue su host local a la Lista blanca:
www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"
Luego verifique el archivo iptables-ACCEPT.list
.
El resto de este tutorial es cómo integrarse www-security-assistant
con su sistema.
Iptables - Configuración básica - Guardar y restaurar
Configuracion basica
Lea este manual antes de agregar las siguientes reglas.
sudo iptables -F
sudo iptables -I INPUT 1 -i lo -j ACCEPT
sudo iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# This rule may lock you out of the system!
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
Antes de realizar las siguientes acciones, abra una nueva conexión SSH e intente iniciar sesión en su sistema para verificar si todo funciona bien.
Guardar y restaurar
Esto podría lograrse a través de scripts personalizados, que guardarán y restaurarán el iptables
coning durante el proceso de parada de arranque (o reinicio) del sistema. (Si usamos UFW para configurar las reglas de Iptables, este paso no es necesario).
printf '#!/bin/sh\n/sbin/iptables-save > /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-save.sh
printf '#!/bin/sh\n/sbin/iptables-restore < /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-restore.sh
sudo chmod +x /var/www-security-assistant/iptables-restore.sh /var/www-security-assistant/iptables-save.sh
sudo ln -s /var/www-security-assistant/iptables-save.sh /etc/network/if-post-down.d/iptables-save
sudo ln -s /var/www-security-assistant/iptables-restore.sh /etc/network/if-pre-up.d/iptables-restore
Crear nueva cadena
Cree una nueva cadena, llamada GUARDIAN
e insértela como número 3 en la INPUT
cadena:
sudo iptables -N GUARDIAN
sudo iptables -I INPUT 3 -j GUARDIAN
Chequeo
Reinicie el sistema y verifique la configuración. Por favor, use sudo systemctl reboot
(no use la opción de fuerza reboot -f
). Cuando el sistema vuelve a estar en línea, podemos verificar si la cadena recién creada existe:
sudo iptables -L GUARDIAN -n
ModEvasive para Apache2
ModEvasive es un módulo de maniobras evasivas para Apache para proporcionar acciones evasivas en caso de un ataque HTTP DoS o DDoS o un ataque de fuerza bruta. Lee mas...
Instalación
Instalar y habilitar el módulo:
sudo apt install libapache2-mod-evasive
sudo a2enmod evasive
Cree un directorio de registros y hágalo accesible para www-data
:
sudo mkdir -p /var/log/apache2_mod_evasive
sudo chown www-data /var/log/apache2_mod_evasive
Ajuste la configuración básica: descomente y edite ciertas directivas en el archivo de configuración:
/etc/apache2/mods-enabled/evasive.conf
Reinicia Apache: sudo systemctl restart apache2.service
.
Chequeo
- Abra una página web desde su servidor y actualice la ventana del navegador varias veces de forma intensiva (presione
F5
): debe obtener un mensaje de error prohibido 403 . En el directorio de registro, se generará un nuevo archivo de bloqueo. Este archivo debe eliminarse para detectar más transgresiones de esta dirección IP.
ModEvasive ► WSAS ► Iptables
Aquí lo configuraremos mod_evasive
para hablar a iptables
través de www-security-assistant.bash
, creado en la sección anterior.
Edite /etc/apache2/mods-available/evasive.conf
de esta manera:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 9
DOSSiteCount 70
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
#DOSEmailNotify your@email.foo
DOSLogDir "/var/log/apache2_mod_evasive"
DOSSystemCommand "sudo /var/www-security-assistant/www-security-assistant.bash %s 'ModEvasive' 'AutoMode' >> /var/www-security-assistant/www-security-assistant.execlog 2>&1"
</IfModule>
Cree un archivo de registro y reinicie Apache:
sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog
Para probar esta configuración se puede simular ataque DDoS a través del F5
método, mencionado anteriormente, o se puede utilizar una comandos como ab
, hping3
, etc.
Atención: tenga cuidado porque la iptables
regla, utilizada en WSAS, DROP todas las conexiones nuevas de la fuente $IP
, incluidas sus conexiones SSH. Es bueno tener una forma de respaldo para conectarse al servidor durante las pruebas. Puede cambiar esta regla para que funcione solo con los puertos HTTP / HTTPS.
ModSecurity 2.9 para Apache2
ModSecurity es un motor de firewall de aplicaciones web que proporciona muy poca protección por sí solo. Para ser útil, ModSecurity debe configurarse con reglas. Con el fin de permitir a los usuarios aprovechar al máximo ModSecurity de fábrica, Trustwave's Spider Labs proporciona un conjunto de reglas certificado y gratuito ... Leer más ...
Instalación
Instalar y habilitar el módulo:
sudo apt install libapache2-mod-security2
sudo a2enmod security2
Crear archivo de configuración:
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
¡Lee y edita /etc/modsecurity/modsecurity.conf
cuidadosamente! Agregue o cambie al menos las siguientes directivas:
# -- Rule engine initialization ----------------------------------------------
SecRuleEngine On
# -- Debug log configuration -------------------------------------------------
SecDebugLogLevel 2
SecDebugLog "/var/log/apache2_mod_security/modsec_debug.log"
# -- Audit log configuration -------------------------------------------------
SecAuditLog "/var/log/apache2_mod_security/modsec_audit.log"
# -- Guardian log configuration -------------------------------------------------
SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
El archivo /etc/apache2/mods-enabled/security2.conf
involucra /etc/modsecurity/modsecurity.conf
la configuración de Apache. En esta etapa security2.conf
se verá así:
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
IncludeOptional /etc/modsecurity/*.conf
</IfModule>
Crear directorio de registro:
sudo mkdir -p /var/log/apache2_mod_security
Configurar la rotación del registro. Primero cree el archivo de configuración:
sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec
Luego edite el nuevo archivo de esta manera:
/var/log/apache2_mod_security/*.log { … }
Reinicia Apache.
Chequeo
Cree un archivo de configuración adicional /etc/modsecurity
, llámelo, por ejemplo z-customrules.conf
, y agregue la siguiente regla como su contenido:
# Directory traversal attacks
SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"
Reiniciar el servidor: sudo systemctl restart apache2.service
. Abre tu navegador y escribe https://example.com/?abc=../
. El resultado será: 403 Prohibido . Consulte los archivos de registro /var/log/apache2_mod_security
para obtener más detalles.
Para hacer las cosas más divertidas, coloque el script issues.php
en un lugar apropiado dentro de usted DocumentRoot
(aquí supongo que este lugar es /var/www/html
):
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/appendix/var/www/html/issues.php -O /var/www/html/issues.php
Luego modifique la regla anterior de la siguiente manera:
# Directory traversal attacks with redirection (or use URL instead of URI: redirect:'https://example.com/issues.php')
SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109, redirect:'/issues.php'"
Reinicie Apache, luego abra su navegador y escriba https://example.com/?abc=../
;-) La idea está tomada del script del SE BotLovin.cs
.
Edite /etc/modsecurity/z-customrules.conf
una vez más y comente (desactive) la regla: este fue solo un ejemplo de prueba y está cubierto por OWASP CRS, que se describe en la siguiente sección.
Aquí hay otro ejemplo en el que redirigiremos todas las wp-admin
solicitudes de página, pero excepto estas de ciertas direcciones IP (tenga en cuenta la chain
):
# Block wp-admin access
SecRule REQUEST_URI "^/wp-admin" "id:108, log, deny, status:403, t:lowercase, chain, redirect:'/issues.php'"
SecRule REMOTE_ADDR "!@ipMatch 192.168.1.11,99.77.66.12"
Aquí tenemos dos acciones disruptivas: (1) deny, status:403
y (2) redirect:'/issues.php'
. En realidad, no necesitamos la deny
acción porque será anulada por la redirect
acción.
ModSecurity OWASP Core Rule Set 3.x
En Ubuntu 16.04 puede instalar 2.x RSE: apt install modsecurity-crs
. Aquí instalaremos CSR 3.x , se proporcionan instrucciones detalladas en el manual de instalación ( git
es obligatorio).
Instalación
Clonar CSR en la carpeta /usr/share/modsecurity-crs.3
:
sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
Actualice y renueve automáticamente la base de datos GeoIP. (GeoIP DB ya no se incluye con el CRS. En su lugar, se recomienda descargarlo regularmente). El script util/upgrade.py
ofrece esta funcionalidad. Puede usarlo de la siguiente manera en cron - sudo crontab -e
:
0 2 * * * /usr/share/modsecurity-crs.3/util/upgrade.py --geoip --crs --cron >> /var/log/apache2_mod_security/owasp-crs-upgrade.log 2>&1
Crear archivos de configuración:
sudo cp /usr/share/modsecurity-crs.3/crs-setup.conf{.example,}
sudo cp /usr/share/modsecurity-crs.3/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf{.example,}
sudo cp /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf{.example,}
¡Lea y edite estos archivos con cuidado! Descomente al menos la SecGeoLookupDB
directiva:
SecGeoLookupDB util/geo-location/GeoIP.dat
Aplica la configuración de Apache. Edite /etc/apache2/mods-available/security2.conf
de esta manera:
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
IncludeOptional /etc/modsecurity/*.conf
IncludeOptional /usr/share/modsecurity-crs.3/crs-setup.conf
IncludeOptional /usr/share/modsecurity-crs.3/rules/*.conf
</IfModule>
Guarde el archivo y luego reinicie Apache.
Lista blanca de reglas de ModSecurity
La inclusión en la lista blanca de las reglas de ModSecurity se puede realizar a través de las siguientes directivas de ModSec, que se pueden usar en todo el sistema o dentro de la configuración del host virtual, también globalmente, para directorios específicos o coincidencias de ubicación:
SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById
Deshabilitar mod_security2
para PhpMyAdmin. Cambiar /etc/phpmyadmin/apache.conf
de esta manera:
<Directory /usr/share/phpmyadmin>
<IfModule security2_module>
SecRuleEngine Off
</IfModule>
</Directory>
Deshabilitar reglas específicas para cierto directorio:
<Directory /var/www/html>
<IfModule security2_module>
SecRuleRemoveById 973301
</IfModule>
</Directory>
Deshabilitar reglas a nivel mundial. Para este propósito, debemos agregar nuestras directivas en algún lugar de los archivos de configuración de Apache: /etc/modsecurity/z-customrules.conf
es un buen lugar.
Deshabilite las reglas dentro de toda la configuración de Apache:
SecRuleRemoveById 973301 950907
Incluya en la lista blanca una dirección IP para que pueda pasar por ModSecurity:
SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
Deshabilitar reglas dentro de la coincidencia de directorio:
<Directory /var/www/mediawiki/core>
SecRuleRemoveById 973301 950907
</Directory>
Actualice la acción de la regla por su ID dentro de la coincidencia de ubicación:
<LocationMatch "/index.php.*">
SecRuleUpdateActionById 973301 "pass"
SecRuleUpdateActionById 950907 "pass"
</LocationMatch>
En los ejemplos anteriores asumimos eso 973301
y 950907
son ID de reglas que obstruyen el trabajo normal de nuestras aplicaciones web. Podemos encontrar reglas como estas mediante un análisis de modsec_audit.log
.
Reglas de ModSecurity ► WSAS ► Iptables
Aquí se dan algunos ejemplos más de cómo crear SecRules personalizadas, y también cómo podemos llamar a WWW Security Assistant Script (WSAS) a través de ellas.
Configuración inicial
Necesitamos un script de inicio adicional modsecurity-assistant.sh
. La razón es que la exec
acción de ModSecurity tiene una sintaxis demasiado simple y limitada.
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/modsecurity-assistant.sh -O /var/www-security-assistant/modsecurity-assistant.sh
sudo chmod +x /var/www-security-assistant/modsecurity-assistant.sh
Si mira dentro del script, verá algunas variables que ModSecurity exporta. Estos son: $REQUEST_URI
, $ARGS
, $SERVER_NAME
, $REMOTE_ADDR
, $REMOTE_HOST
y $UNIQUE_ID
. Las otras variables se explican dentro del script.
Crea una regla personalizada y llama a nuestros scripts a través de ella
Primero, creemos una regla que se ejecutará modsecurity-assistant.sh
(y llamará www-security-assistant.bash
) cuando el URI de solicitud contenga una palabra incluida en nuestra lista negra. Abra /etc/modsecurity/z-customrules.conf
y agregue las siguientes líneas en la parte inferior:
# REQUEST_URI words blacklist
#
SecRule REQUEST_URI "@pmFromFile /var/www-security-assistant/modsecurity-uri-black.list" \
"id:150, log, t:lowercase, chain, \
drop, deny, status:403, redirect:'/issues.php'"
SecRule REMOTE_ADDR "!@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
"setenv:REMOTE_HOST=%{REMOTE_HOST}, \
setenv:ARGS=%{ARGS}, \
exec:/var/www-security-assistant/modsecurity-assistant.sh"
REQUEST_URI
- esta variable contiene el URI completo de la solicitud actual. La regla podría ser más amplia:SecRule REQUEST_URI|ARGS|REQUEST_BODY ...
@pmFromFile
leerá el archivo modsecurity-uri-black.list
que contiene la lista de frases, donde cada frase o palabra específica se coloca en una nueva línea. Puede recopilar palabras y frases interesantes de los archivos de registro. Si hay una coincidencia particular entre REQUEST_URI
y nuestra lista de patrones, se aplicará la regla. El archivo puede estar vacío, pero debe crearlo ( touch
).
La log
acción creará entradas de registro en los archivos de registro para esta regla con id:150
.
drop
, deny
(con status
) y las redirect
acciones pertenecen al grupo de acciones disruptivas , deben estar al comienzo de la regla chain
(si hay una cadena). La segunda acción anulará la primera y la tercera anulará la segunda, por lo que debe elegir qué desea realizar y puede eliminar las demás.
chain
acción llamará a la siguiente regla de la cadena, tenga en cuenta que la segunda regla, no tiene id
.
REMOTE_ADDR
contiene la dirección IP de la solicitud.
@ipMatchFromFile
aparecerá el archivo modsecurity-ip-white.list
que contiene una lista blanca de direcciones IP, separadas en nuevas líneas. Las entradas CIDR también son aceptables. Debido a que la acción disruptiva siempre se encuentra en la regla principal de la cadena, se aplicará, pero cuando cierta IP está en esta lista blanca, la exec
acción no se aplicará. El archivo puede estar vacío, pero debe crearlo ( touch
).
exec
action llamará a nuestro script externo. Esta acción no es disruptiva y se ejecutará cuando la regla actual regrese verdadero. Cuando se aplica esta acción, la IP remota se procesará a través de nuestros scripts.
setenv
esta acción exportará ciertas variables internas =%{...}
como envvars, los nombres exportados pueden ser diferentes de los internos. Algunas variables deben exportarse manualmente, otras se exportan automáticamente, probablemente sea un pequeño error (en algunos casos, la exportación manual con los mismos nombres, por ejemplo setenv:REQUEST_URI=%{REQUEST_URI}
, causará un valor en blanco de la variable exportada).
Chequeo
Supongamos que no tiene Joomla en su servidor, edite el archivo modsecurity-uri-black.list
y agregue una línea con contenido /joomla
. Luego escriba su navegador https://exemple.com/joomla
. Debería ser redirigido y bloqueado a través de Iptables. Borre los registros sudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note'
, agregue su IP modsecurity-ip-white.list
y vuelva a hacer el ejercicio. Ahora debería ser redirigido, pero no bloqueado.
Conecte nuestros scripts con OWASP Core Rule Set 3.x
Para hacerlo, actualizaremos la acción predeterminada de las Reglas de modo de anomalía (949110 y 959100). Para este propósito, edite el archivo /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
y agregue las siguientes líneas en la parte inferior:
# -- Anomaly Mode - Update actions by ID -----
#
SecRuleUpdateActionById 949110 "t:none, drop, deny, status:403, redirect:'/issues.php', \
setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
exec:/var/www-security-assistant/modsecurity-assistant.sh"
SecRuleUpdateActionById 959100 "t:none, drop, deny, status:403, redirect:'/issues.php', \
setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
exec:/var/www-security-assistant/modsecurity-assistant.sh"
# -- Anomaly Mode - Whitelist some URI and IP addresses -----
#
SecRule REQUEST_URI "^/wp-admin/admin-ajax.php*|^/index\.php\?title=.*&action=(submit|raw&ctype=text/javascript|raw&ctype=text/css)$" \
"id:'999010', t:none, phase:1, pass, \
ctl:ruleRemoveById=949110, \
ctl:ruleRemoveById=959100"
SecRule REMOTE_ADDR "@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
"id:'999020', t:none, phase:1, pass, \
ctl:ruleRemoveById=949110, \
ctl:ruleRemoveById=959100"
Chequeo
No olvide reiniciar (o volver a cargar) Apache para aplicar los cambios de configuración. No olvide borrar los registros periódicamente durante las pruebas, de lo contrario puede ser bloqueado permanentemente :-)
Simular el ataque transversal del directorio:
https://example.com/?abc=../../../ # This should be redirected and blocked
https://example.com/wp-admin/admin-ajax.php?abc=../../../ # This should pass because of the whitelist rule
Simular ataque de inyección SQL:
https://example.com/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
https://example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo
ModSecurity y archivos de registro de Apache
El servidor web Apache se puede configurar para brindarle al administrador del servidor información importante sobre cómo está funcionando ... La principal vía para proporcionar comentarios al administrador es mediante el uso de archivos de registro. Lee mas...
ModSecurity tiene un poderoso mecanismo de registro. Según la directiva SecGuardianLog
, proporciona una fuente de registro especialmente diseñada para trabajar con scripts externos.
Actualmente, la única herramienta que se sabe que funciona con el registro de guardian es
httpd-guardian
, que forma parte del proyecto de herramientas httpd de Apache . La httpd-guardian
herramienta está diseñada para defenderse contra ataques de denegación de servicio. Utiliza el blacklist tool
para interactuar con un cortafuegos basado en iptables ... y pone en una lista negra dinámicamente las direcciones IP infractoras. Lee mas...
Archivos de registro de ModSecurity ► Fail2Ban ► Iptables
Es posible configurar Fail2Ban para el análisis de datos de los archivos de registro de Apache. modsec_audit.log
es probablemente la mejor opción, pero vea también las secciones de las que hablamos SecGuardianLog
.
Tenga cuidado de que SecAuditLogRelevantStatus
en /etc/modsecurity/modsecurity.conf
se comente. De lo contrario, todos los que reciban una página de error 404 serían bloqueados por fail2ban.
SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"
Actualmente Fail2Ban no está implementado de ninguna manera en este proyecto.
ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► Iptables
httpd-guardian
- detectar ataques DoS mediante el monitoreo de solicitudes Apache Security, Copyright (C) 2005 Ivan Ristic - está diseñado para monitorear todas las solicitudes del servidor web a través del mecanismo de registro canalizado. Realiza un seguimiento de la cantidad de solicitudes enviadas desde cada dirección IP ... httpd-guardian puede emitir una advertencia o ejecutar un script para bloquear la dirección IP ...
Este script se puede usar con el mecanismo de registro de Apache2 o con
ModSecurity (mejor).
Instalación y configuración dentro de las circunstancias actuales
Descargar httpd-guardian
y hacerlo ejecutable:
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-guardian.pl -O /var/www-security-assistant/httpd-guardian.pl
sudo chmod +x /var/www-security-assistant/httpd-guardian.pl
Lea las líneas 98-119
para ver cómo se conecta el script con nuestro script WSAS.
Aplique el siguiente cambio dentro de la configuración de Apache ( /etc/modsecurity/modsecurity.conf
), luego reinícielo:
#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
Chequeo
Para probar el script, desactive ModEvasive ( sudo a2dismod evasive
no olvide habilitarlo más tarde) y reinicie Apache. Luego tail
el registro ejecutivo:
tail -F /var/www-security-assistant/www-security-assistant.execlog
Y desde otra instancia, realice un ataque DoS, por ejemplo, use ab
de esta manera:
for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done
ModSecGuardianLog ► Análisis personalizado ► WSAS ► Iptables
Aquí se presenta un script simple, llamado httpd-custom-analyze.bash
, que no es algo especial, pero podría ser un buen ejemplo. Sus características se describen dentro del cuerpo del script.
Instalación y configuración
Descargar httpd-custom-analyze.bash
y hacerlo ejecutable:
sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-custom-analyze.bash -O /var/www-security-assistant/httpd-custom-analyze.bash
sudo chmod +x /var/www-security-assistant/httpd-custom-analyze.bash
Aplique el siguiente cambio dentro de la configuración de Apache ( /etc/modsecurity/modsecurity.conf
) y reinícielo:
#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
#SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
SecGuardianLog "|/var/www-security-assistant/httpd-custom-analyze.bash"
El script llamará a WSAS cuando se alcance el umbral: lea la línea 86
y 35
.
Para que ambos httpd-
scripts funcionen simultáneamente, edite modsecurity.conf
y canalice SecGuardianLog
a ambos.
Para realizar una prueba, siga los consejos de la sección anterior.