Nell’ articolo “Rimozione di rootkit e virus dal nostro server ubuntu linux” abbiamo visto come verificare e monitorare la presenza di rootkit o virus che potrebbero essere presenti nel nostro server.
Vediamo adesso 10 consigli per esporre al minimo il nostro server linux da attacchi esterni:
1 ) Manteniamo sempre aggiornato il sistema
Utilizziamo regolarmente apt-get ed installiamo sempre gli aggiornamenti proposti alla login
apt-get update per l’aggiornamento
apt-get upgrade per l’installazione dei nuovi aggiornamenti
2 ) Verifichiamo le utenze abilitate alla login ed adottiamo una politica di gestione delle password
Le più frequenti violazioni di un sistema avvengono tramite attacchi di forza bruta con degli elenchi di parole che statisticamente possono comprende delle parole chiavi utilizzate come password. Se si vuole offrire un qualsiasi tipo di accesso remoto utilizzando la password locale, assicuriamoci che la complessità della stessa superi dei limiti minimi di adeguatezza.
verifichiamo lo stato di tutti gli account utente
chage -l nome_utente
verifichiamo gli utenti presenti sulla macchina
less /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/bash
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
…
Verifichiamo che ognuno di essi se conosciuto abbia impostata una password o altrimenti sia disattivato il login con *
less /etc/shadow
root:abcdefghilmnopqrstuvz1234567890:15290:0:99999:7:::
bin:*:13897:0:99999:7:::
daemon:*:15092:0:99999:7:::
sys:*:15092:0:99999:7:::
sync:*:15092:0:99999:7:::
games:*:15092:0:99999:7:::
man:*:15289:0:99999:7:::
…
Notare che:
– se la password è scritta in /etc/shadow, in /etc/passwd c’è solo una x al posto della password criptata.
– se in /etc/passwd il campo password è un * , la password è nulla e l’utente non può accedere al sistema.
Fare attenzione alla presenza di ! nel campo password del file /etc/shadow
- “NP” or “!” or null – No password, l’account non ha la password
- “LK” or “*” – the account is Locked, l’utente non è abilitato al login
- “!!” – the password has expired”
Modifichiamo spesso le password e creiamo gli account degli utenti con una politica di scadenza e cambio password.
Quello che segue è un esempio di come sia possibile modificare manualmente la data di scadenza dell’account (-E) al 31/01/2008 (inserirla nel formato mm/gg/aaaa o nel formato aaaa/mm/gg), l’età minima della password (-m) a 5 giorni, l’età massima (-M) a 90 giorni, il periodo di inattività (-I) a 5 giorni dopo la scadenza della password e un avvertimento (-W) di 14 giorni prima della scadenza delle password.
chage -E 01/31/2008 -m 5 -M 90 -I 30 -W 14 username
Disattivando o bloccando l’account di un utente non impedisce che quest’ultimo riesca a effettuare l’accesso al server se precedentemente utilizzava una chiave pubblica RSA; saranno ancora in grado di ottenere l’accesso al server senza la necessità della password. Controllare sempre se nella directory home degli utenti sono presenti dei file che permettano questo tipo di autenticazione SSH, come per esempio
/home/nomeutente/.ssh/authorized_keys.
Eliminare o rinominare la directory .ssh/
nella home degli utenti per prevenire future autenticazioni SSH.
3 ) Limitiamo il numero dei servizi e porte aperte presenti sulla nostra macchina linux
prendiamo la lista dei servizi secondo come vengono avviati allo startup
chkconfig –list | grep ‘3:on’
eventualmente rimuoviamo quelli non più necessari
rm /etc/rcX.d/nome servizio
Verifichiamo le porte aperte sul nostro sistema
nmap mio_host.com
Starting Nmap 5.21 ( http://nmap.org ) at 2011-11-12 18:25 CET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000011s latency).
rDNS record for 127.0.0.1: localhost.localdomain
Not shown: 982 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
53/tcp open domain
80/tcp open http
81/tcp open hosts2-ns
1098/tcp open unknown
1099/tcp open unknown
3306/tcp open mysql
verifichiamo a quale servizio in esecuzione corrisponde una certa porta aperta
fuser 80/tcp
80/tcp: 3209 3210 3211 3212 3213
ps -aux | grep 3209
www-data 3209 0.0 1.4 266600 56548 ? S 17:40 0:01 /usr/sbin/apache2 -k start
se il processo è sconosciuto facciamo una ricerca su Google per ottenere maggiori informazioni per decidere se rimuoverlo o come rimuoverlo.
4 ) Installiamo un firewall e lasciamo aperte solo le porte dei servizi essenziali
Es. Il risultato che vogliamo raggiungere è il seguente
nmap mio_host.com
Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-12 18:30 CET
Interesting ports on mio_host.com (91.121.159.25):
Not shown: 997 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp open mysql
Installiamo il firewall iptables con apt-get se non già presente nel sistema
NB. La configurazione di un firewall può essere pericolosa. Infatti, potreste bloccare il vostro server. Se sbagliate nell’impostazione di uno script, settandolo in avvio automatico, non avrete più accesso alla vostra macchina! Fate quindi molta attenzione! Immaginate di chiudere la porta SSH!
Verifichiamo la situazione attuale
$ /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
il nostro firewall non è quindi ancora abilitato a filtrare nessun pacchetto
Autorizziamo le porte 22 (ssh) e 80 (http)
$ /sbin/iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT
$ /sbin/iptables -A INPUT -i eth0 -p tcp –dport 80 -j ACCEPT
rivediamo adesso la configurazione di iptables
$ /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT tcp — anywhere anywhere tcp dpt:www
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Quando viene effettuata una connessione dalla nostra macchina verso il server kernel.org per scaricare il nuovo kernel (ad esempio), il server stabilirà una connessione con il sito e attenderà la sua risposta. La richiesta di connessione partirà normalmente, ma la risposta non potrà essere ricevuta in quanto in ingresso è tutto bloccato. Applichiamo quindi la seguente regola per abilitare questo tipo di pacchetti
$ /sbin/iptables -A INPUT -i eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT
accettiamo anche i pacchetti icmp per il ping (se vogliamo)
$ /sbin/iptables -A INPUT -i eth0 -p icmp -j ACCEPT
blocchiamo quindi tutte le altre porte
$ /sbin/iptables -A INPUT -i eth0 -j DROP
Nel caso abbiamo sbagliato qualcosa nella configurazione possiamo resettare la configurazione con
$ /sbin/iptables -F INPUT
Comunque sia le impostazioni impostate a runtime verranno persa al riavvio. Facciamo in modo che vengano applicate ad ogni avvio del server
creiamo un nuovo script /etc/init.d/firewall con permessi 700
#! /bin/sh
### BEGIN INIT INFO
# Provides: scriptname
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
start(){
/sbin/iptables -F INPUT
/sbin/iptables -A INPUT -i eth0 -p tcp –dport 80 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp –dport 3306 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -j DROP
}
stop(){
/sbin/iptables -F INPUT
}
restart(){
stop
sleep 5
start
}
case “$1” in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo “Usage: firewall {start|stop|restart}”
exit 1
esac
exit 0
proviamo lo script con
/etc/init.d/firewall start
e
/etc/init.d/firewall stop
poi abilitiamo tale script per l’avvio in automatico allo startup
sudo update-rc.d /etc/init.d/firewall defaults
NB. Prima di inserire lo script nell’avvio del server, verificate che tutto sia corretto, altrimenti il vostro server sarà definitivemente bloccato!
5 ) Abilitiamo il monitoraggio e la scansione automatica di rootkit o virus con notifica via mail
vedi articolo “Rimozione di rootkit e virus dal no server ubuntu linux”
6 ) Installiamo uno strumento per l’analisi e il monitoraggio dei log
apt-get install logwatch
configuriamo logwatch in modo tale da inviarci giornalmente una mail di riepilogo contenente varie informazioni sulle stato della macchina, delle connessioni ricevute, mail inviate, ecc.
vi /usr/share/logwatch/default.conf/logwatch.conf
Output = mail
Format = html
MailTo = test@gmail.com
ed installiamolo sulla crontab
crontab -e
0 1 * * * (logwatch)
7 ) Facciamoci inviare una mail ad ogni accesso al sistema
vi /etc/profile
ed inseriamo alla fine
echo ‘ALERT Shell Access on:’ `date` `who` | mail -s “ALERT: Nuovo accesso al sistema ” test@gmail.com
8 ) Spostiamo i servizi essenziali su porte non di default
Esempio server ssh da porta 22 a porta 1022
9 ) Facciamoci inviare gli output prodotti dai comandi last e lastlog per avere la lista gli accessi affettuati alla macchina
Installiamolo sulla crontab
crontab -e
0 1 * * * (last | mail -s “Last from myhost” test@gmail.com)
0 1 * * * (lastlog | mail -s “Last from myhost” test@gmail.com)
10) Backup backup backup backup e ancora backup!
Sembra la cosa più semplice ma alla fine uno script di backup e farlo eseguire regolarmente ci salva anche dal peggior hacker! 😉