mod_security
es un módulo de Apache que actua como cortafuegos,
protegiendo contra diversos tipos de ataque, y permitiendo monitorizar
el tráfico HTTP en tiempo real.
Por sí solo, el módulo no provee la protección, sino que deben añadirse reglas. Afortunadamente, existen conjuntos de reglas predefinidos, como el OWASP ModSecurity Core Rule Set Project, que nos facilitan la tarea. Al contrario que los sistemas de detección de intrusos, basados en firmas de vulnerabilidades conocidas, este conjunto de reglas protege contra vulnerabilidades desconocidas que pueda haber en las aplicaciones web.
Instalación de mod_security
Podemos descargarnos el código desde su web, desde su repositorio de versiones o desde el repositorio de paquetes de la distribución. Para descargarlo desde el repositorio de Ubuntu:
$ sudo aptitude install libxml2 libxml2-dev libxml2-utils libaprutil1 libaprutil1-dev
$ sudo aptitude install libapache-mod-security
La versión que se instala es la 2.5.11-1. Aunque la última versión estable en su web es la 2.6.2, esta vez utilizaremos la del repositorio de Ubuntu.
Para activar el módulo:
$ sudo a2enmod mod-security
Y reiniciamos Apache:
$ sudo apache2ctl restart
Configuración inicial
Podemos crear un archivo donde configuremos algunas directivas en
/etc/apache2/conf.d/modsecurity.conf
. Por ejemplo, donde se encuentra
el fichero de log:
SecAuditLog /var/log/apache2/mod-security.log
Reiniciamos Apache para que los cambios tengan efecto:
$ sudo apache2ctl restart
Reglas OWASP
Descargamos la última versión de las reglas (2.2.4) y lo descomprimimos
en el directorio /etc/apache2
. Para evitar problemas, las
descargaremos en el directorio /etc/apache2
:
$ cd /etc/apache2
$ sudo wget http://downloads.sourceforge.net/project/mod-security/modsecurity-crs/0-CURRENT/modsecurity-crs_2.2.4.tar.gz
$ sudo tar xvzf modsecurity-crs_2.2.4.tar.gz
$ sudo chown -R root:root modsecurity-crs_2.2.4
$ sudo mv modsecurity-crs_2.2.4 modsecurity-crs
Hay cinco directorios de reglas con diferentes tipos de regla:
activated_rules
base_rules
experimental_rules
optional_rules
slr_rules
Configuración básica
Empezaremos con la configuración básica que viene de ejemplo. Copiamos el archivo de configuración:
$ cd /etc/apache2/modsecurity-crs
$ sudo cp modsecurity_crs_10_config.conf.example modsecurity_crs_10_config.conf
Para que se tengan en cuenta las reglas, añadiremos al final del fichero
/etc/apache2/apache2.conf
:
Include modsecurity-crs/modsecurity_crs_10_config.conf
Include modsecurity-crs/base_rules/*.conf
Deberemos reiniciar Apache.
$ sudo apache2ctl restart
Error creating rule: Unknown variable: REQBODY_ERROR
Si al reiniciar el Apache nos aparece este error, se debe a que esta
versión de las reglas es para mod_security
versión 2.6 o superior. Sin
embargo, basta renombrar esta variable por su valor anterior en el
fichero
modsecurity-crs/base_rules/modsecurity_crs_20_protocol_violations.conf
,
para que se solucione el error:
$ cd /etc/apache2/modsecurity-crs/base_rules
$ sudo sed -i 's/^SecRule REQBODY_ERROR/SecRule REQBODY_PROCESSOR_ERROR/' modsecurity_crs_20_protocol_violations.conf
Más reglas
Podemos crear una configuración personalizada, utilizando el directorio
activated_rules
para incluir enlaces simbólicos a las reglas que
queremos activar. En el fichero README
hay una explicación detallada
de cada regla.
Primero, modificaremos el archivo /etc/apache2/apache2.conf
para que
contenga:
Include modsecurity-crs/modsecurity_crs_10_config.conf
Include modsecurity-crs/activated_rules/*.conf
Por ejemplo, para incluir las reglas básicas:
$ cd /etc/apache2/modsecurity-crs/activated-rules
$ for f in $(ls /etc/apache2/modsecurity-crs/base_rules); do
sudo ln -s ../base_rules/$f $f
done
Para incluir las reglas de spam:
$ cd /etc/apache2/modsecurity-crs/activated_rules
$ for f in $(ls /etc/apache2/modsecurity-crs/optional_rules | grep comment_spam); do
sudo ln -s ../optional_rules/$f $f
done
Para incluir todas las reglas opcionales:
$ cd /etc/apache2/modsecurity-crs/activated_rules
$ for f in $(ls /etc/apache2/modsecurity-crs/optional_rules); do
sudo ln -s ../optional_rules/$f $f
done
Reiniciamos Apache:
$ sudo apache2ctl restart
Actualización de las reglas
Si ya tenemos las reglas instaladas y queremos comprobar si hay
actualizaciones, en el directorio modsecurity-crs/util
hay un script
que facilita el proceso. Para comprobar si hay reglas nuevas:
$ ./rules-updater.pl -rhttps://www.modsecurity.org/autoupdate/repository/ -l
Could not load GnuPG module - cannot verify ruleset signatures
Repository: https://www.modsecurity.org/autoupdate/repository
modsecurity-crs {
2.0.0: modsecurity-crs_2.0.0.zip
2.0.1: modsecurity-crs_2.0.1.zip
2.0.2: modsecurity-crs_2.0.2.zip
2.0.3: modsecurity-crs_2.0.3.zip
2.0.4: modsecurity-crs_2.0.4.zip
2.0.5: modsecurity-crs_2.0.5.zip
2.0.6: modsecurity-crs_2.0.6.zip
2.0.7: modsecurity-crs_2.0.7.zip
2.0.8: modsecurity-crs_2.0.8.zip
2.0.9: modsecurity-crs_2.0.9.zip
2.0.10: modsecurity-crs_2.0.10.zip
2.1.0: modsecurity-crs_2.1.0.zip
2.1.1: modsecurity-crs_2.1.1.zip
2.1.2: modsecurity-crs_2.1.2.zip
2.2.0: modsecurity-crs_2.2.0.zip
2.2.1: modsecurity-crs_2.2.1.zip
2.2.2: modsecurity-crs_2.2.2.zip
2.2.3: modsecurity-crs_2.2.3.zip
2.2.4: modsecurity-crs_2.2.4.zip
}
Para actualizar a la última versión, primero crearemos un directorio donde se van a descargar y después las descargamos:
$ cd /tmp
$ mkdir crs
$ ./rules-updater.pl -rhttp://www.modsecurity.org/autoupdate/repository/ -pcrs -Smodsecurity-crs
Esto nos descarga el fichero con las últimas reglas, en este caso
modsecurity-crs_2.2.4.zip
.
Actualización a 2 de junio de 2013
Parece ser que, actualmente, al intentar actualizar las reglas, nos encontremos con un error 404:
$ sudo ./rules-updater.pl -rhttp://www.modsecurity.org/autoupdate/repository/ -pcrs -Smodsecurity-crs
Could not load GnuPG module - cannot verify ruleset signatures
Fetching: modsecurity-crs/modsecurity-crs_2.2.5.zip ...
Failed to retrieve ruleset modsecurity-crs/modsecurity-crs_2.2.5.zip: 404 Not Found
Podemos encontrar el fichero de reglas para la última versión de
mod_security
, la 2.2.7, en el repostorio en GitHub. Pero si
queremos descargar una versión anterior, podemos recurrir al paquete
modsecurity-crs en Launchpad.
$ wget https://launchpad.net/ubuntu/+archive/primary/+files/modsecurity-crs_2.2.5.orig.tar.gz
$ md5sum modsecurity-crs_2.2.5.orig.tar.gz
aaeaa1124e8efc39eeb064fb47cfc0aa modsecurity-crs_2.2.5.orig.tar.gz
$ tar xvzf modsecurity-crs_2.2.5.orig.tar.gz
$ sudo cp -R modsecurity-crs_2.2.5 /etc/apache2/
$ sudo rm /etc/apache2/modsecurity-crs
$ cd /etc/apache2
$ sudo ln -s modsecurity-crs_2.2.5 modsecurity-crs
Después de copiarlo al directorio de apache, deberemos crear un fichero de configuración, por ejemplo a partir del fichero de ejemplo que viene tal como hicimos al instalarlo sólo que ahora tiene un nombre diferente, y reiniciar apache para que los cambios tengan efecto:
$ cd /etc/apache2/modsecurity-crs
$ sudo cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
Si utilizamos la nueva nomenclatura para el fichero, deberemos
actualizar el fichero /etc/apache2/apache2.conf
:
Include modsecurity-crs/modsecurity_crs_10_setup.conf
Include modsecurity-crs/base_rules/*.conf
Una vez más, deberemos reiniciar Apache.
Crypt::SSLeay or IO::Socket::SSL not installed
Si nos aparece este error, es que nos faltan módulos:
$ sudo aptitude install libcrypt-ssleay-perl libio-socket-ssl-perl
Mediante mod_security
se puede cambiar el valor de la cabecera
Server
.
Lo primero será asegurarnos de que en el fichero
/etc/apache2/conf.d/security
contiene el valor:
ServerTokens Full
Añadimos al fichero /etc/apache2/conf.d/modsecurity.conf
:
SecServerSignature "incognito"
Desactivamos y volvemos a activar el módulo, para que se cree el enlace simbólico a nuestro archivo de configuración, y reiniciamos Apache:
$ sudo a2dismod mod-security
$ sudo a2enmod mod-security
$ sudo apache2ctl restart
Ya podemos comprobar cómo la cabecera Server
ha cambiado:
$ curl -sI localhost/k/ | grep ^Server
Server: incognito
Referencias
» mod_security » mod_security wiki » mod_security on Apache » Howto: Mod_security » OWASP ModSecurity Core Rule Set Project