Instalar ModSecurity 3.0 en Elastic Beanstalk con NGINX gratis!

Si quieres aprender a configurar e instalar ModSecurity 3.0 en Elastic Beanstalk con NGINX gratis estas leyendo el artículo indicado. Gracias a este artículo no tendrás que pagar por servicios, como el WAF de AWS, que “conectan” ModSecurity a tus instancias. Al termino de este artículo habrás aprendido:

  1. Instalar dependencias necesarias para ModSecurity 3.0 con YUM
  2. Instalar, compilar y cargar conector para ModSecurity de NGINX como un modulo dinamico
  3. Configurar regla para probar la instalación de ModSecurity 3.0
  4. Probar la instalación de ModSecurity 3.0
  5. Habilitar ModSecurity 3.0 en Elastic Beanstalk
  6. Configurar las reglas OWASP v3 conforme al tipo de tu aplicación
  7. Configurar Elastic Beanstalk para trabajar con ModSecurity

Antes de continuar asegúrate de tener lo siguiente:

  1. Ambiente de Elastic Beanstalk creado. (Te puede interesar: Arquitectura de Alta Disponibilidad en AWS con Elastic Beanstalk paso a paso)
  2. Que tu ambiente sea una instancia de Linux amzn2.x86_64.
  3. Acceso a SSH a tu instancia de EC2 creada con Elastic Beanstalk
  4. Sabes subir nuevas versiones de código a tu instancia con Elastic Beanstalk

Te recomiendo mucho que antes de continuar ya tengas listos los puntos antes mencionados para evitar complicaciones. De cualquier forma, si tienes alguna duda puedes escribirla en la sección de comentarios o preguntarme por Instagram en @andres.gtz.

Hice un script de bash que realiza todo este procedimiento (junto con las instrucciones) el cual te puedo enviar una vez que hagas una donación que ayude a mantener este script.

Realiza una donación por PayPal y obtén el script en bash

Por qué usar ModSecurity?

Si ya conoces que es ModSecurity y cómo funciona puedes saltarte esta sección.

ModSecurity es un modulo bajo licencia de GNU para Apache y NGINX (este artículo solo abarca NGINX) que actúa como un WAF (Web Application Firewall), lo que filtra las peticiones HTTP/HTTPS entrantes y las respuestas del servidor previniendo intrusiones, así como, asegurarse de que la respuesta de la petición en cuestión no contiene información sensible que ponga en riesgo la integridad del servidor.

Las reglas de seguridad que se definen para que ModSecurity pueda evaluar dichas peticiones son aquellas que investiga y define OWASP (Open Web Application Security Project), un proyecto de código abierto dedicado a determinar y combatir las causas que hacen que el software sea inseguro.

Las vulnerabilidades fueron, son y seguirán descubriéndose en el tiempo, por lo que es necesario proteger nuestros sistemas web ante los ataques más utilizados contra los sistemas web y, sobretodo, mantenerse al día con las nuevas vulnerabilidades descubiertas. Si estas buscando tener un servidor del tipo que sea es de vital importancia saber cómo instalar ModSecurity 3.0 en Elastic Beanstalk de Amazon Web Services (o cualquier otro proveedor de servidores).

ModSecurity + OWASP te protege contra los siguientes tipos de ataques informáticos:

  1. SQL Injection
  2. Cross Site (XSS) Scripting
  3. Information Leakage
  4. Frame Injection
  5. URL Redirection
  6. Missing Session Timeout
  7. Sensitive Information Passed as Clear Text in GET URL
  8. Session ID Cookies Not Marked Secure
  9. Cross Frame Scripting (XFS)
  10. Sensitive Information Displayed as Clear Text on Screen
  11. Sensitive Information Cached
  12. Inadequate Encryption Strength
  13. CRLF (Carriage Return and Line Feed) Injection
  14. Trust Boundary Violation
  15. Directory Traversal
  16. Session Fixation
  17. Use of a Risky Cryptographic Algorithm
  18. Credentials Management
  19. SQL Injection Hibernate
  20. Improper Resource Shutdown or Release
  21. Y mucho más!

Guia para instalar ModSecurity 3.0 en Elastic Beanstalk con NGINX gratis

  1. Instalar dependencias para ModSecurity
  2. Instalar y compilar ModSecurity
  3. Instala conector de NGINX para ModSecurity y reinstala NGINX
  4. Instalar configuración de ModSecurity recomendada
  5. Agregar reglas de seguridad OWASP ModSecurity
  6. Junta los archivos de configuración recién creados
  7. Habilitar el modulo de ModSecurity en NGINX
  8. Probar ModSecurity

Instalar dependencias para ModSecurity

Siendo que estamos en un ambiente de Elastic Beanstalk y que este puede llegar a ser regenerado de forma automática y no reinstala automáticamente las dependencias por si solo, debemos crear un archivo de configuración que, entre otras cosas, dará la instrucción a Elastic Beanstalk de reinstalar dichas dependencias cada vez que se regenere.

Dicho eso, vamos a crear el archivo .ebextensions/02-modsec.config (en la raíz de tu proyecto), y agrega el siguiente bloque de código:

# ~/projects/mostsecurewebsite/.ebextensions/02-modsec.config
packages:
    yum:
        autoconf: []
        automake: []
        curl: []
        doxygen: []
        gcc : []
        GeoIP: []
        GeoIP-devel: []
        GeoIP-data: []
        GeoIP-update: []
        httpd-devel: []
        libcurl: []
        libcurl-devel: []
        libtool: []
        libtool-ltdl : []
        libtool-ltdl-devel : []
        libxml2: []
        libxml2-devel: []
        lua: []
        lua-static: []
        lua-devel: []
        make: []
        mod_security: []
        mod_security_crs: []
        mod_security-mlogc: []
        mod_ssl : []
        nginx-mod-http-geoip: []
        nginx-mod-http-perl : []
        pcre: []
        pcre-devel: []
        pcre-tools: []
        pkgconfig: []
        wget: []
        yajl: []
        yajl-devel: []

El código anterior permitirá la instalación de las dependencias necesarias para ModSecurity cada vez que se genere una instancia de EC2 en Elastic Beanstalk.

Instalar y compilar ModSecurity

Abre una conexión por SSH a tu instancia de EC2 en la que quieres instalar ModSecurity. Ejecuta los siguientes comandos para instalar y compilar ModSecurity.

git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity;
mv ModSecurity /tmp/
cd /tmp/ModSecurity
git submodule init
git submodule update
./build.sh
./configure
make
make install

Instala conector de NGINX para ModSecurity y reinstala NGINX

Si estas ejecutando esto correctamente quiere decir que tienes una instancia Linux amzn2 y tienes NGINX actualmente instalado. Pues NGINX desarrolló un modulo dinámico llamado ModSecurity-nginx para poder integrarlo a ModSecurity, por lo tanto, debemos descargar el modulo dinámico y reinstalar NGINX pero agregando en modulo dinámico para fusionarlos. Ejecuta estos comandos para proceder a realizar el proceso antes mencionado.

cd /tmp
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
nginxVersion=`nginx -v 2>&1 | sed 's/nginx version: nginx\///'`
wget http://nginx.org/download/nginx-${nginxVersion}.tar.gz
tar -xvxmf /tmp/nginx-${nginxVersion}.tar.gz;
cd /tmp/nginx-${nginxVersion}
./configure --with-compat --add-dynamic-module=/tmp/ModSecurity-nginx
make modules
sudo mkdir /etc/nginx/modules/
sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/

Instalar configuración de ModSecurity recomendada

ModSecurity tiene una configuración inicial recomendada la cual debemos copiar dentro de /etc/nginx. Utiliza los siguientes comandos para descargar y modificar el archivo configuración para que cuando se ejecute ModSecurity pueda funcionar. Puedes conseguirlo así:

wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' modsecurity.conf-recommended
sudo mkdir /etc/nginx/modsec
sudo mv modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
sudo cp /tmp/ModSecurity/unicode.mapping /etc/nginx/modsec

Agregar reglas de seguridad OWASP ModSecurity

Para que ModSecurity pueda evaluar si las peticiones a nuestro servidor son buenas o malas es necesario proveerle las reglas de seguridad mas actuales, las de OWASP ModSecurity 3.3 Core Rule Set (CRS). A continuación, los comandos:

cd /tmp
git clone -b v3.3/master https://github.com/coreruleset/coreruleset.git
sudo mkdir /etc/nginx/modsec/crs
sudo mv /tmp/coreruleset /etc/nginx/modsec/crs/
sudo cp /etc/nginx/modsec/crs/coreruleset/crs-setup.conf.example /etc/nginx/modsec/crs/coreruleset/crs-setup.conf
sudo cp /etc/nginx/modsec/crs/coreruleset/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example /etc/nginx/modsec/crs/coreruleset/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
sudo cp /etc/nginx/modsec/crs/coreruleset/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example /etc/nginx/modsec/crs/coreruleset/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

Junta los archivos de configuración recién creados

A lo largo de los pasos anteriores se crearon archivos de configuración que debemos de poner a la vista de NGINX. Para lograrlo debemos de crear el archivo /etc/nginx/modsec/main.conf en la raíz de tu proyecto e incluirlos, así:

sudo touch /etc/nginx/modsec/main.conf
echo 'Include "/etc/nginx/modsec/modsecurity.conf"' | sudo tee -a /etc/nginx/modsec/main.conf;
echo 'Include "/etc/nginx/modsec/crs/coreruleset/crs-setup.conf"' | sudo tee -a /etc/nginx/modsec/main.conf;
echo 'Include "/etc/nginx/modsec/crs/coreruleset/rules/*.conf"' | sudo tee -a /etc/nginx/modsec/main.conf;

Agrega tus propias reglas (opcional)

Ademas de las reglas de OWASP, tenemos la posibilidad de crear nuestras propias reglas. Yo agregare algunas para probar la instalación, te recomiendo hagas lo mismo.

# Permite bloquear el valor de un argumento en especifico
echo 'SecRule ARGS:instagram "@contains andres.gtz" "id:8888,deny,status:403"' | sudo tee -a /etc/nginx/modsec/main.conf;
# Permite bloquear el acceso a una URI en especifico
echo 'SecRule REQUEST_URI "@beginsWith /admin" "phase:2,t:lowercase,id:8889,deny,msg:'block admin'"' | sudo tee -a /etc/nginx/modsec/main.conf;

Habilitar el modulo ModSecurity en NGINX

Crea o modifica el archivo .platform/nginx/nginx.conf (en la raíz de tu proyecto) el cual servirá para:

  1. Cargar el modulo de ModSecurity
  2. Habilitar el modulo de ModSecurity en NGINX
  3. Registrar la configuración de ModSecurity en NGINX

Si ya tienes el archivo nginx.conf en .platform/nginx

# ~/project/mostsecurewebsite/.platform/nginx/nginx.conf
# Agrega el ejecutable del modulo ModSecurity al principio
load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;
# tu configuración actual...
http {
    # tu configuración actual...
    server {
        # tu configuración actual...
        modsecurity on;
        modsecurity_rules_file /etc/nginx/modsec/main.conf;
        # tu configuración actual...
    }
}

Si no has creado el archivo nginx.conf en .platform/nginx

Te recomiendo que revises el contenido y configures a tus necesidades.

# ~/project/mostsecurewebsite/.platform/nginx/nginx.conf
load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;

user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    32136;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include       conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
        default     "upgrade";
    }

    server {

        large_client_header_buffers 8 64k;
        client_body_buffer_size     32k;
        client_header_buffer_size   8k;

        modsecurity on;
        modsecurity_rules_file /etc/nginx/modsec/main.conf;

        listen      80 default_server;

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
        }

        access_log    /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
        access_log    /var/log/nginx/access.log main;

        charset               utf-8;
        sendfile              on;
        tcp_nopush            on;
        tcp_nodelay           on;
        server_tokens         off;
        log_not_found         off;
        client_header_timeout 60;
        client_body_timeout   60;
        keepalive_timeout     600;
        gzip                  on;
        gzip_comp_level       4;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        # Security headers
        add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload" always;
        add_header X-Content-Type-Options nosniff always;
        add_header X-XSS-Protection "1;mode=block" always;
        add_header X-Frame-Options DENY always;

        # Configuration to redirect
        location / {
            try_files $uri $uri/ =404;

            # Descomenta lo siguiente si estas usando una instancia que no está detrás de un balanceador de cargas
            #set $redirect 0;
            #if ($http_x_forwarded_proto != "https") {
            #    set $redirect 1;
            #}
            #if ($http_user_agent ~* "ELB-HealthChecker") {
            #    set $redirect 0;
            #}
            #if ($redirect = 1) {
            #    return 301 https://$host$request_uri;
            #}

        }

        # Include the Elastic Beanstalk generated locations
        include conf.d/elasticbeanstalk/*.conf;
    }
}

Probar ModSecurity

Para probar si ModSecurity fue instalado correctamente comprime el código fuente de tu aplicación y cargarla como una nueva versión a Elastic Beanstalk. Una vez cargada la nueva versión del código realiza el proceso a continuación para probar que efectivamente ModSecurity este activo:

  1. En una terminal en tu computadora lanza una petición a nuestras propias reglas, debes recibir un “403 Forbidden” (cambia a https:// las rutas si tienes https configurado)
    1. curl -Ik “http://mostsecurewebsite.com/admin”
    2. curl -Ik “http://mostsecurewebsite.com/?instagram=andres.gtz”
  2. Ejecuta los siguientes comandos, revisa recibir la respuesta indicada
    1. Disponibles en el punto #6 de https://support.plesk.com/hc/en-us/articles/360000321773-How-to-test-ModSecurity-Atomic-Basic-rule-set-in-Plesk-

Si no recibes una respuesta “403 Forbbiden”, revisa que los pasos anteriores fueron ejecutados de forma correcta y vuelta a intentar.

Hasta la próxima!

Espero que te haya gustado y ayudado este artículo, de ser así, suscríbete para que seas notificad@ siempre que suba artículos sobre automatización y seguridad informática, me lo agradecerás después.

También puedes seguirme en Instagram en @andres.gtz y hacerme las preguntas que desees. Así mismo, agradezco tu generosidad si deseas donar criptomonedas a alguna de las siguientes direcciones:

Please Add coin wallet address in plugin settings panel

Si te quedaron dudas, puedes escribirlas aquí en los comentarios, o bien, escríbeme a mi Instagram @andres.gtz.

Habilitar SSL en un Single Instance de Elastic Beanstalk con NGINX Configurar un acceso SSH a instancias EC2 en AWS
View Comments
There are currently no comments.