Installeer LibModsecurity Web Application Firewall met Nginx op CentOS 8

LibModSecurity is een gratis en open-source web applicatie firewall die gebruikt kan worden om een Nginx server tegen verschillende soorten cyberaanvallen te beschermen. Het komt met een Core Rule Set waaronder, SQL injectie, cross-site scripting, Trojaanse paarden en nog veel meer. Het werkt door HTTP verkeer in real-time te monitoren en kwetsbaarheden te bestrijden met de OWASP ModSecurity Core Rule Set. Het kan gebruikt worden met Apache, Nginx, en IIS en is ook compatibel met Debian, Ubuntu, & CentOS.

In deze handleiding laten we je zien hoe je LibModSecurity met Nginx ondersteuning kunt downloaden en compileren op CentOS 8.

Vereisten

  • Een server die CentOS 8 draait.
  • Een root wachtwoord is op de server ingesteld.

Aan de slag

Voor je begint, update je je server met de nieuwste versie met het volgende commando:

dnf update

Zodra je server bijgewerkt is, herstart je hem om de veranderingen toe te passen.

Installeer Benodigde Repositories en Afhankelijkheden

Installeer eerst EPEL en REMI repository op je systeem. Je kunt ze installeren met het volgende commando:

dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Installeer vervolgens alle vereiste afhankelijkheden met het volgende commando:

dnf install gcc-c++ flex bison yajl curl-devel zlib-devel pcre-devel autoconf automake git curl make libxml2-devel pkgconfig libtool httpd-devel redhat-rpm-config wget openssl openssl-devel nano

Als alle pakketten geïnstalleerd zijn, kun je andere afhankelijkheden installeren met de PowerTool repository:

dnf --enablerepo=PowerTools install doxygen yajl-devel

Installeer vervolgens GeoIP met behulp van de REMI repository door het volgende commando uit te voeren:

dnf --enablerepo=remi install GeoIP-devel

Als alle pakketten geïnstalleerd zijn, kun je verder gaan met de volgende stap.

Download en compileer LibModsecurity

Eerst moet je de broncode LibModsecurity downloaden en op je systeem compileren. Verander daartoe de directory in /opt en download de nieuwste versie van LibModsecurity uit de Git repository:

cd /opt/
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity

Verander vervolgens de directory in ModSecurity en download libInjection code met het volgende commando:

cd ModSecurity
git submodule init
git submodule update

Configureer vervolgens de LibModsecurity met het volgende commando:

./build.sh
./configure

Tenslotte compileer en installeer je LibModSecurity met het volgende commando:

make
make install

Op dit punt is LibModsecurity op je systeem geïnstalleerd. Je kunt nu verder gaan met de installatie van Nginx met LibModsecurity ondersteuning.

Download en compileer Nginx met LibModsecurity ondersteuning

Eerst moet je een systeemgebruiker en groep maken voor Nginx. Je kunt die aanmaken met het volgende commando:

useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx

Vervolgens moet je Nginx downloaden en compileren met LibModsecurity ondersteuning.

Download daartoe eerst de ModSecurity-nginx connector uit de Git repository met het volgende commando:

cd /opt
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

Download vervolgens de laatste stabiele versie van Nginx met het volgende commando:

wget http://nginx.org/download/nginx-1.17.6.tar.gz

Pak na het downloaden het gedownloade bestand uit met het volgende commando:

tar -xvzf nginx-1.17.6.tar.gz

Verander vervolgens de Nginx directory en configureer hem met het volgende commando:

cd nginx-1.17.6
./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-http_ssl_module --with-http_realip_module --add-module=/opt/ModSecurity-nginx

Installeer vervolgens Nginx met het volgende commando:

make
make install

Op dit punt is Nginx geïnstalleerd met LibModsecurity ondersteuning. Je kunt nu verder gaan met het configureren van Nginx.

Nginx configureren met ModSecurity

Eerst moet je het voorbeeld ModSecurity configuratiebestand uit de Nginx bron-directory kopiëren naar de Nginx configuratie-directory.

Je kunt ze kopiëren met het volgende commando:

cp /opt/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp /opt/ModSecurity/unicode.mapping /usr/local/nginx/conf/

Maak vervolgens een symbolische link van Nginx binary naar /usr/sbin/ pad met het volgende commando:

ln -s /usr/local/nginx/sbin/nginx /usr/sbin/

Maak vervolgens de Nginx log directory aan met het volgende commando:

mkdir /var/log/nginx

Open vervolgens het Nginx configuratiebestand met het volgende commando:

nano /usr/local/nginx/conf/nginx.conf

Breng de volgende veranderingen aan:

user  nginx;
worker_processes  1;
pid  /run/nginx.pid;
events {
    worker_connections  1024;
}


http {
    include	  mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
	listen       80;
        server_name  your-server-ip;
        modsecurity  on;
        modsecurity_rules_file  /usr/local/nginx/conf/modsecurity.conf;
        access_log  /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Sla het bestand op en sluit het als je klaar bent. Controleer Nginx dan op een eventuele syntaxfout met het volgende commando:

nginx -t

Je zou de volgende uitvoer moeten zien:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

Op dit punt is Nginx geconfigureerd. Je kunt verder gaan met het aanmaken van een systemd service bestand voor Nginx.

Maak een Systemd dienstbestand voor Nginx

Vervolgens moet je een systemd bestand aanmaken om de Nginx dienst te beheren. Je kunt het aanmaken met het volgende commando:

nano /etc/systemd/system/nginx.service

Voeg de volgende regels toe:

[Unit]
Description=The nginx server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Sla het bestand op en sluit het als je klaar bent. Herlaad dan de systemd daemon met het volgende commando:

systemctl daemon-reload

Start vervolgens de Nginx service en zet hem aan om te starten na een herstart van het systeem met het volgende commando:

systemctl start nginx
systemctl enable --now nginx

Je zou de volgende uitvoer moeten zien:

Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /etc/systemd/system/nginx.service.

Verifieer vervolgens de Nginx service met het volgende commando:

systemctl status nginx

Je zou de volgende uitvoer moeten zien:

? nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-12-30 10:20:01 EST; 41s ago
  Process: 17730 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 17728 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 17727 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 17732 (nginx)
    Tasks: 2 (limit: 6102)
   Memory: 5.0M
   CGroup: /system.slice/nginx.service
           ??17732 nginx: master process /usr/sbin/nginx
           ??17733 nginx: worker process

Dec 30 10:20:00 nginx systemd[1]: Starting The nginx HTTP and reverse proxy server...
Dec 30 10:20:00 nginx nginx[17728]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
Dec 30 10:20:00 nginx nginx[17728]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Dec 30 10:20:01 nginx systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Dec 30 10:20:01 nginx systemd[1]: Started The nginx HTTP and reverse proxy server.

Op dit punt is Nginx gestart en draait het. Je kunt nu verder gaan met het instellen van ModSecurity.

ModSecurity instellen

Standaard staat ModSecurity ingesteld op alleen detectie. Je zult dus de ModSecurity regel-engine moeten inschakelen. Je kunt dat doen door het bestand modsecurity.conf te bewerken:

nano /usr/local/nginx/conf/modsecurity.conf

Zoek de volgende regel:

SecRuleEngine DetectionOnly

En vervang die door de volgende regel:

SecRuleEngine On

Zoek ook de volgende regel:

/var/log/modsec_audit.log

En vervang die door de volgende regel:

/var/log/nginx/modsec_audit.log

Bewaar en sluit het bestand als je klaar bent.

Download vervolgens de nieuwste versie van ModSecurity Core Rule Set uit de Git repository met het volgende commando:

git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs

Eenmaal gedownload, hernoem het CRS voorbeeld configuratiebestand met het volgende commando:

mv /usr/local/nginx/conf/owasp-crs/crs-setup.conf.example /usr/local/nginx/conf/owasp-crs/crs-setup.conf

Configureer vervolgens de ModSecurity om deze regels te gebruiken door het bestand /usr/local/nginx/conf/modsecurity.conf te bewerken:

nano /usr/local/nginx/conf/modsecurity.conf

Voeg de volgende regels toe aan het eind van het bestand:

Include owasp-crs/crs-setup.conf
Include owasp-crs/rules/*.conf

Sla het bestand op en sluit het als je klaar bent. Herstart daarna de Nginx dienst om de veranderingen door te voeren:

systemctl restart nginx

Test ModSecurity

ModSecurity is nu geïnstalleerd en geconfigureerd. Het is tijd om te testen of het werkt of niet.

Om ModSecurity te testen tegen commando injectie, open je je web browser en typ je de URL http://localhost/index.html?exec=/bin/bash. Je zou de 403 Forbidden fout moeten zien op de volgende pagina:

Test ModSecurity

Om ModSecurity te testen tegen CSS aanval, open je je terminal en voer het volgende commando uit:

curl http://localhost/?q="><script>alert(1)</script>"

Je zou de volgende uitvoer moeten krijgen:

<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.6</center>
</body>
</html>

Conclusie

Gefeliciteerd! je hebt met succes LibModSecurity gedownload en gecompileerd met Nginx. Je server is nu beveiligd tegen verschillende aanvallen. Voor meer informatie kun je de ModSecurity documentatie bekijken op ModSecurity Doc.