Attraverso IPTables abbiamo la possibilità di monitorare il traffico: ad esempio, se il nostro server si occupa di gestire più di un servizio (ad esempio se funge sia da web server che da mail server), ci potrebbe tornare utile sapere quanto traffico è consumato per il web e quanto per la posta elettronica.

Attraverso questo semplice script, creeremo le regole IPTables necessarie per creare  delle tabelle “copia” delle tabelle INPUT e OUTPUT e, quindi, inseriremo le regole per monitorare il traffico di ogni porta.

### creo i nuovi set ###
/sbin/iptables -N INET_IN_PORT
/sbin/iptables -N INET_OUT_PORT
### li collego (usare FORWARD in caso di gateway) ###
/sbin/iptables -A INPUT -j INET_IN_PORT
/sbin/iptables -A OUTPUT -j INET_OUT_PORT
### setto e regole per INPUT ###
/sbin/iptables -A INET_IN_PORT -i eth1 -p tcp --dport 80
/sbin/iptables -A INET_IN_PORT -i eth1 -p tcp --dport 443
/sbin/iptables -A INET_IN_PORT -i eth1 -p tcp --dport 25
/sbin/iptables -A INET_IN_PORT -i eth1 -p tcp --dport 143
/sbin/iptables -A INET_IN_PORT -i eth1 -p tcp --dport 53
/sbin/iptables -A INET_IN_PORT -i eth1 -p udp --dport 53
/sbin/iptables -A INET_IN_PORT -i eth1 -p tcp --dport 22
### setto e regole per OUTPUT ###
/sbin/iptables -A INET_OUT_PORT -o eth1 -p tcp --sport 80
/sbin/iptables -A INET_OUT_PORT -o eth1 -p tcp --sport 443
/sbin/iptables -A INET_OUT_PORT -o eth1 -p tcp --sport 25
/sbin/iptables -A INET_OUT_PORT -o eth1 -p tcp --sport 143
/sbin/iptables -A INET_OUT_PORT -o eth1 -p tcp --sport 53
/sbin/iptables -A INET_OUT_PORT -o eth1 -p udp --sport 53
/sbin/iptables -A INET_OUT_PORT -o eth1 -p tcp --sport 22
/sbin/service iptables save

Una volta inserite le regole, possiamo vedere il traffico registrato con:

iptables -L INET_IN_PORT -v -n
iptables -L INET_OUT_PORT -v -n

Se vogliamo monitorare in tempo reale cosa succede, possiamo usare il comando watch -n 1:

watch -n 1 iptables -L INET_IN_PORT -v -n
watch -n 1 iptables -L INET_OUT_PORT -v -n
 

mod_evasive è un altro modulo di Apache in grado di aumentare la sicurezza del sistema proteggendoci da attacchi DOS e D-DOS sulla porta 80.
Gli attacchi di tipo DOS e D-DOS (Denial of Services e Distributed Denial of Services) sono attacchi atti a rendere inaccessibili i sistemi a causa di un intenso traffico dati. Grazie a questo modulo, però, riusciamo a prevenire questo tipo di attacco quando viene rivolto ad Apache in quanto il modulo tiene traccia del numero di connessioni provenienti da un determinato IP e, in caso di superamento della soglia, interviene bloccandole.
Per installare il modulo su Debian/Ubuntu è sufficiente lanciare il comando:

apt-get install libapache2-mod-evasive

Quindi creiamo la directory per i log:

mkdir -p /var/log/apache2/evasive
chown -R www-data:root /var/log/apache2/evasive

Ora creiamo un file di configurazione per il modulo:

/etc/apache2/conf.d/modevasive.conf
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 600
DOSLogDir "/var/log/apache2/evasive"
</IfModule>

e riavviamo Apache:

/etc/init.d/apache2 restart

Per collaudare il funzionalmento del modulo, c’è un semplice script perl incluso con la documentazione:

# perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
 

mod_security è un modulo di apache che ci aiuta a rendere il sistema più sicuro attraverso un Web Application Firewall.
Il Web Application Firewall (per gli amici WAF) è un filtro che controlla il traffico da e verso il webserver identificando possibili atticchi di alto livello come SQL Injection, Cross-Site scripting e simili.
L’utilizzo di mod_security deve essere però ponderato attentamente in quanto influisce negativamente sulle prestazioni globali del sistema e aumenta i consumi di risorse.
Quasi tutte le maggiori distribuzioni hanno un pacchetto precompilato per mod_security; in qualsiasi caso, trattandosi di un sistema che viene aggiornato con elevata frequenza, è preferibile non usare il pacchetto precompilato ma procedere con la compilazione. Questo perchè può capitare che le ultime regole non siano compatibili con versioni più anziane del modulo.

Installazione del modulo e delle regole
Il sistema si compone di due pacchetti: un pacchetto da compilare con il modulo di apache e un secondo pacchetto con le regole, simile alle definizioni di un antivirus.
Iniziamo con l’installazione dei prerequisiti: in questo caso propongo la sintassi di Debian/Ubuntu.
libapr e libapr-util

apt-get install libapr1 libapr1-dev libaprutil1 libaprutil1-dev

libpcre

apt-get install libpcre3 libpcre3-dev

libxml2

apt-get install libxml2 libxml2-dev

liblua

apt-get install liblua5.1-0 liblua5.1-0-dev

libcurl

apt-get install libcurl4-openssl-dev libcurl3-dbg

le librerie di sviluppo di apache:

apt-get install apache2-dev

i tools per lo sviluppo

apt-get install build-essential

i prerequisiti di Perl

apt-get install liblwp-useragent-determined-perl libgnupg-perl libcrypt-ssleay-perl

Infine è necessario abilitare il module mod_uniqueid

a2enmod unique_id

Dal sito http://www.modsecurity.org/ procediamo al download del modulo (al momento l’ultima versione disponibile è la 2.6.3) e scompattiamo il sorgente:

cd /usr/local/src
wget http://www.modsecurity.org/download/modsecurity-apache_2.6.3.tar.gz
tar zxvf modsecurity-apache_2.6.3.tar.gz
cd modsecurity-apache_2.6.3

Quindi passiamo alla compilazione e all’installazione del modulo:

./configure && make && make mlogc && make install

A questo punto avrete il modulo compilato e già installato nella directory corretta (/usr/lib/apache2/modules/mod_security2.so)

Ora è il turno delle regole CRS base (in questo caso l’ultima versione è la 2.2.3); il sito ufficiale rimanda a SourceForge: scaricate il pacchetto in /usr/local/src, scompattatelo e spostatelo nella direcory corretta con:

tar zxvf modsecurity-crs_2.2.3.tar.gz
mv modsecurity-crs_2.2.3 /etc/apache2/modsecurity-crs

Configurazione
La prima cosa da fare è configurare Apache perchè carichi il modulo. Lavorando su un sistema Debian/Ubuntu, seguo il loro modo di operare creando il file /etc/apache2/mods-available/mod-security.load

/etc/apache2/mods-available/mod-security.load
LoadFile /usr/lib/libxml2.so.2
LoadModule security2_module /usr/lib/apache2/modules/mod_security2.so

Ora attiviamo il modulo con:

a2enmod mod-security

Il file di configurazione base sarà /etc/apache2/conf.d/modsecurity.conf. Partiamo da una solida base, utilizzando la configurazione raccomandata del sorgente scaricato.

cp /usr/local/src/modsecurity-apache_2.6.3/modsecurity.conf-recommended /etc/apache2/conf.d/modsecurity.conf
mv /etc/apache2/modsecurity-crs/modsecurity_crs_10_config.conf.example /etc/apache2/modsecurity-crs/modsecurity_crs_10_config.conf

Con questa configurazione, in realtà, il nostro sistema fa ben poco in quanto si tratta solo di un setup di base del modulo che non blocca nulla e non include alcuna regola specifica. Editiamo il file operando le modifiche qui sotto:

/etc/apache2/conf.d/modsecurity.conf
#### Riga da aggiungere all'inizio
<IfModule mod_security2.c>
...
#### Riga da modificare
SecRuleEngine On
...
#### Righe da aggiungere alla fine
Include /etc/apache2/modsecurity-crs/modsecurity_crs_10_config.conf
Include /etc/apache2/modsecurity-crs/base_rules/*.conf
Include /etc/apache2/modsecurity-crs/activated_rules/*.conf
</IfModule>

A questo punto riavviamo Apache e verifichiamo in /var/log/apache2/error_log che il modulo venga caricato correttamente.

Per verificare l’effettiva funzionalità del sito potete creare un file test.php nella home directory del sito con il comando phpinfo. Ad es.

/var/www/test.php
<?php
phpinfo();
?>

e usare un tool di verifica come nikto per fare la scansione di quel sito. Questo è l’output del tools su una installazione standard di Apache senza mod_security:

+ Server: Apache/2.2.16 (Debian)
+ ETag header found on server, inode: 273242, size: 177, mtime: 0x4b5b1f0a49780
+ Apache/2.2.16 appears to be outdated (current is at least Apache/2.2.19). Apache 1.3.42 (final release) and 2.0.64 are also current.
+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS
+ Retrieved x-powered-by header: PHP/5.3.3-7+squeeze3
+ OSVDB-3092: /phpmyadmin/changelog.php: phpMyAdmin is for managing MySQL databases, and should be protected or limited to authorized hosts.
+ OSVDB-3092: /test/: This might be interesting...
+ OSVDB-3233: /test.php: PHP is installed, and a test script which runs phpinfo() was found. This gives a lot of system information.
+ OSVDB-3233: /test/info.php: PHP is installed, and a test script which runs phpinfo() was found. This gives a lot of system information.
+ OSVDB-3233: /test/phpinfo.php: PHP is installed, and a test script which runs phpinfo() was found. This gives a lot of system information.
+ OSVDB-3268: /icons/: Directory indexing found.
+ OSVDB-3233: /icons/README: Apache default file found.
+ OSVDB-3092: /test.php: This might be interesting...
+ /phpmyadmin/: phpMyAdmin directory found
+ 6456 items checked: 0 error(s) and 13 item(s) reported on remote host
+ End Time:           2012-01-05 15:31:00 (425 seconds)
---------------------------------------------------------------------------

Questo è l’output del tool dopo l’abilitazione di mod_security:

---------------------------------------------------------------------------
+ Server: Apache/2.2.16 (Debian)
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Apache/2.2.16 appears to be outdated (current is at least Apache/2.2.19). Apache 1.3.42 (final release) and 2.0.64 are also current.
+ 6456 items checked: 0 error(s) and 1 item(s) reported on remote host
+ End Time:           2012-01-05 15:06:42 (414 seconds)
---------------------------------------------------------------------------

Andare oltre
Già con le sole regole base attive abbiamo visto che il nostro server è molto più sicuro.
Il pacchetto crs comprende però altre regole in grado di aumentare ulterioremente il grado di protezione del nostro server e si trovano in /etc/apache2/mod_security/optional_rules, /etc/apache2/mod_security/experimental_rules e /etc/apache2/mod_security/slr_rules. La nostra configurazione è già pronta per regole aggiuntive e per attivarle è sufficiente creare un link simbolico dei file nella directory /etc/apache2/mod_security/activated_rules e ricaricare la configurazione di Apache.

 

I server di oggi vengono comunque normalmente dotati di schede video con parecchi MB di RAM dedicata estremamente veloce che però non sarà mai utilizzata perchè difficilmente si installerà un server Linux con l’interfaccia grafica X.

Perchè non utilizzare questo “ben di Dio” come memoria vera e propria da affiancare alla RAM tradizionale? Innanzi tutto una premessa: Linux già incorpora una memoria chiamata “swap” che non è altro che un’area di disco che subentra in aito della memoria RAM quando questa si satura. L’hard disk del nostro server, però, non potrà mai competere con la RAM quanto a prestazioni, per cui  è importante dotare il nostro server di RAM sufficiente a limitare il più possibile lo swap sul disco che penalizza le prestazioni complessive del nostro server.

In questo articolo vi spiegherò come configurare il nostro server Linux perchè utilizzi la RAM della scheda video come memoria di swap prima di utilizzare lo swap tradizionale su Hard Disk.

Innanzi tutto, verifichiamo quanta video ram abbiamo a disposizione:

lspci -vvv

Tra i vari device che saranno elencati ci sarà la scheda video. Ad esempio:

01:00.0 VGA compatible controller: ATI Technologies Inc NI Whistler [AMD Radeon HD 6600M Series] (prog-if 00 [VGA controller])
	Subsystem: Acer Incorporated [ALI] Device 0513
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- Region 0: Memory at b0000000 (64-bit, prefetchable) [size=256M]
	Region 2: Memory at c0300000 (64-bit, non-prefetchable) [size=128K]
	Region 4: I/O ports at 3000 [size=256]
	Expansion ROM at c0340000 [disabled] [size=128K]
	Capabilities: 
	Kernel driver in use: radeon
	Kernel modules: radeon

Dobbiamo trovare la “region” di tipo “prefetchable”, che è normalmente quella più grande (nel mio caso 256MB): memorizziamo l’indirizzo di partenza (b0000000).
Ora dobbiamo fare un po’ di calcoli in esadecimale in quanto è comunque consigliabile non utilizzare l’intera videoram ma lasciarne qualche MB all’inizio in uso alla scheda: a tal proposito utilizzeremo il modulo slram che richiede in input due valori esadecimali: l’indirizzo di partenza e la quantità di ram.
Ad esempio, per quanto riguarda l’indirizzo di partenza, con un totale di 2^28 bytes (256M) videoram, volendo lasciare 2^24 (16M) per le normali funzionalità (probabilmente meno va comunque bene), l’indirizzo iniziale è 2^24 bytes oltre l’indirizzo di partenza (b0000000), quindi b1000000.
La quantità totale sarà calcolata trasformando in esadecimale il valore della vRAM totale – quella assegnata alle normali funzionalità video: nel nostro caso 240 MB -> 251658240 bytes -> F000000.

Ora andiamo a modificare il file /etc/modprobe.d/modprobe.conf per settare i parametri appena calcolati:

/etc/modprobe.d/modprobe.conf
options slram map=VRAM,0xb1000000,+0xF000000

Quindi carichiamo i moduli necessari:

modprobe slram
modprobe mtdblock

Il secondo modulo serve per creare un disco fisico utilizzando una regione mappata dal modulo slram: difatti, una volta caricato il modulo, apparirà un nuovo device /dev/mtdblock0 sul quale creeremo il disco di swap con priorità più elevata rispetto allo swap su hard disk:

mkswap /dev/mtdblock0 && swapon /dev/mtdblock0 -p 10