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! 😉

 

 

 

 

 

 

Tagged with →  
Share →

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *