Ubuntu è definito come il sistema operativo altamente sicuro disponibile, ma presenta dei difetti nella sua installazione predefinita come ogni altro sistema operativo. Per rimuovere queste debolezze, lo specialista della sicurezza IT ha pubblicato linee guida per combattere le back-door/debolezze del tuo sistema e proteggerti da alcuni degli exploit comuni di Ubuntu. In questa guida esamineremo alcune importanti impostazioni di sicurezza che ogni amministratore di sistema desidera applicare al proprio server.
1. Rafforza le impostazioni di avvio
Per impedire agli utenti non root di modificare il file di configurazione del caricatore di avvio che è /boot/grub/grub.cfg, impostare i proprietari e i gruppi di questo file su root. Esegui il comando seguente per modificare la proprietà in root.
# chown root:root /boot/grub/grub.cfg
Per impedire agli utenti non root di leggere i parametri di avvio, impostare l'autorizzazione per il file del caricatore di avvio in sola lettura e scrittura. Esegui il comando seguente per ottenere questo benchmark.
# chmod og-rwx /boot/grub/grub.cfg
Impostare anche una password per il caricatore di avvio, in modo che qualsiasi utente non autorizzato che tenti di riavviare il sistema debba fornire una password per procedere al passaggio successivo. Ciò garantisce che un utente non autorizzato non sarà in grado di modificare il parametro di avvio come disabilitare SELinux o modificare la partizione di avvio. Esegui il comando seguente per creare una password del caricatore di avvio.
# grub-mkpasswd-pbkdf2
Ora crea un nuovo file dal nome /etc/grub.d/00_header e aggiungi le seguenti righe.
set superusers="
password_pbkdf2
Rimuovere l'opzione --unrestricted nel parametro CLASS del file /etc/grub.d/10_linux . Ciò garantisce un requisito obbligatorio della password per procedere al passaggio successivo, ovvero la modifica dei parametri di avvio.
Aggiorna il grub
# update-grub
2. File system sicuro
Crea partizioni basate su diverse categorie come i dati degli utenti nella partizione /home, i file di scambio nella partizione /swap, i file temporanei nella partizione /tmp, i file di configurazione del sistema nella partizione /etc, i file del dispositivo nella partizione /dev ecc. Ciò impedirà l'esaurimento delle risorse poiché nonché opzioni di montaggio flessibili basate sull'uso previsto dei dati.
2.1 Crea partizione per /tmp
Il primo motivo per creare una partizione separata per /tmp è che ci sono possibilità di esaurimento delle risorse poiché la directory /tmp è scrivibile a livello mondiale. Inoltre, la creazione di una partizione separata per /temp consente di impostare l'opzione noexec contrassegnandola come inutilizzabile per l'esecuzione di codice da parte di utenti non autorizzati e l'hard-link al programma setuid di sistema.
2.2 Imposta l'opzione nodev per /tmp
Impostare l'opzione nodev per la partizione /tmp per impedire agli utenti di creare file di dispositivo a blocchi/caratteri. Modifica il file /etc/fstab e aggiungi la riga seguente.
# mount -o remount,nodev /tmp
2.3 Imposta l'opzione nosuid per /tmp
Per impedire agli utenti di creare file userid impostati nel file system /tmp, aggiungere la seguente riga in /etc/fstab poiché /tmp file-system viene utilizzato per l'archiviazione di file temporanei.
# mount -o remount,nosuid /tmp
2.4 Imposta l'opzione noexec per /tmp
Per impedire agli utenti di eseguire binari eseguibili, impostare l'opzione noexec per la partizione /tmp. Aggiungi la seguente riga in /etc/fstab per bloccare l'esecuzione di binari eseguibili.
# mount -o remount,noexec /tmp
2.5 Crea partizione separata per /var
I demoni di sistema e altri servizi memorizzano temporaneamente i dati dinamici in /var con alcune directory che possono essere scrivibili in tutto il mondo. Pertanto ci sono possibilità di esaurimento delle risorse in /var. Per prevenire l'esaurimento delle risorse in /var, crea una partizione separata per /var nella nuova installazione e per il sistema precedentemente installato, usa LVM per creare una nuova partizione.
2.6 Associa /var/tmp a /tmp
L'associazione del montaggio di /var/tmp a /tmp consentirà di proteggere /var/tmp nello stesso modo in cui lo è /tmp. Ciò impedirà anche a /var di esaurire la memoria in /var/tmp con file temporanei. Esegui il comando seguente per associare /tmp e /var/tmp
# sudo mount --bind /tmp /var/tmp
Per renderlo permanente aggiungi la seguente riga in /etc/fstab
# /tmp /var/tmp none bind 0 0
2.7 Crea partizione separata per /var/log
Per proteggere i dati di controllo sensibili e la protezione dall'esaurimento delle risorse, crea una partizione separata per /var/log in nuova installazione e per il sistema precedentemente installato, usa LVM per creare una nuova partizione.
2.8 Crea partizione separata per /var/log/audit
Il demone di controllo memorizza i dati di registro nella directory /var/log/audit. Per proteggere dall'esaurimento delle risorse poiché il registro di controllo può crescere fino a raggiungere dimensioni elevate e anche per proteggere i dati di controllo sensibili, creare una partizione separata per /var/log/audit nella nuova installazione e per il sistema precedentemente installato, utilizzare LVM per creare una nuova partizione.
2.9 Crea partizione separata per /home
I dati degli utenti sono memorizzati nella directory /home. È possibile limitare il tipo di file che possono essere archiviati in /home. Per ottenere ciò creare una partizione separata per /home nella nuova installazione e per il sistema precedentemente installato, utilizzare LVM per creare una nuova partizione. Anche una partizione separata per /home protegge dall'esaurimento delle risorse.
2.10 Imposta nodev per /home
Per evitare che la directory /home venga utilizzata per definire il carattere e bloccare il dispositivo speciale, impostare l'opzione nodev in modo che gli utenti non possano creare questi tipi di file. Modifica il file /etc/fstab e aggiungi le seguenti righe.
# mount -o remount, nodev /home
2.11 Imposta nodev per i supporti rimovibili
Un utente può ingannare i controlli di sicurezza utilizzando caratteri e bloccare dispositivi speciali da supporti rimovibili per accedere a file di dispositivi sensibili come /dev/kmem. Modifica il file /etc/fstab e aggiungi le seguenti righe.
# mount -o remount, nodev { removable device like floppy or cdrom or USB stick etc. }
2.12 Imposta noexec su supporto rimovibile
Per impedire l'esecuzione di programmi da supporti rimovibili in modo che nessun programma dannoso possa essere inserito nel sistema, aggiungere le seguenti righe in /etc/fstab
# mount -o remount,noexec { removable device like floppy or cdrom or USB stick etc. }
2.13 Aggiungi nosuid al supporto rimovibile
Per impedire che il supporto rimovibile venga utilizzato come setuid/setgid, che consente agli utenti non root di posizionare programmi privilegiati nel sistema. Modifica /etc/fstab e aggiungi le seguenti righe
# mount -o remount,nosuid { removable device like floppy or cdrom or USB stick etc. }
2.14 Aggiungi l'opzione nodev per la partizione /run/shm
Per impedire agli utenti di creare file di dispositivo speciali nelle partizioni /run/shm, aggiungere la seguente riga in /etc/fstab. Ciò garantisce che gli utenti non saranno in grado di creare dispositivi in /run/shm
# mount -o remount,nodev /run/shm
2.15 Aggiungi l'opzione nosuid alla partizione /run/shm
Per impedire che /run/shm venga utilizzato come setuid/setgid, ciò consente agli utenti non root di posizionare programmi privilegiati nel sistema. Gli utenti possono eseguire il programma con il proprio uid e gid. Modifica /etc/fstab e aggiungi le seguenti righe
# mount -o remount,nosuid /run/shm
2.16 Aggiungi noexec alla partizione /run/shm
Per impedire che la partizione /run/shm venga utilizzata per l'esecuzione di programmi, aggiungi le seguenti righe in /etc/fstab
# mount -o remount, noexec /run/shm
2.17 Imposta sticky bit su directory scrivibili mondiali
Per impedire agli utenti di eliminare o rinominare i file in questa directory che non sono di loro proprietà , imposta sticky bit su.
# chmod +t /tmp
or
# chmod 1777 /tmp
3. Elimina i sistemi legacy
Non installare/utilizzare i seguenti servizi e utilità legacy poiché esistono vulnerabilità in questi sistemi/utilità. Questi sono:NIS, server/client RSH, server di conversazione/client, Telenet, TFTP, XINETD, Chargen, Daytime, eco, scarto, ora
4. Elimina i servizi per scopi speciali
Non installare/utilizzare i seguenti servizi poiché sono presenti vulnerabilità in questi servizi. Questi sono-
Sistema X Window, server di stampa Avahi Server, server DHCP, LDAP, NFS e RPC, server DNS, FTP, Samba, SNMP, Rsync, BIOSDEVNAME. Pochi dei servizi di cui sopra sono effettivamente necessari per il funzionamento quotidiano come il server DNS. In tale situazione, è consigliabile installare questi server in un host separato che non contenga dati sensibili.
5. Configurazione di rete e firewall
5.1 Disabilita l'inoltro IP
Per evitare che il server venga utilizzato per inoltrare pacchetti, ovvero per fungere da router, impostare il parametro net.ipv4.ip_forward su 0 in /etc/sysctl.conf
net.ipv4.ip_forward = 0
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.2 Disabilita il reindirizzamento sendpacket
Un utente non autorizzato può utilizzare un host compromesso dall'invio di pacchetti di reindirizzamenti ICMP a un altro dispositivo di routing per corrompere il routing. Per disabilitare il reindirizzamento dei pacchetti, impostare il parametro net.ipv4.conf.all.send_redirects e net.ipv4.conf.default.send_redirects su 0 in /etc/sysctl.conf
# net.ipv4.conf.all.send_redirects = 0
# net.ipv4.conf.default.send_redirects =0
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.3 Disattiva l'accettazione del pacchetto di route di origine
Utilizzando i pacchetti instradati di origine, un utente può accedere all'indirizzo privato del sistema poiché è possibile specificare il percorso.
Impostare i parametri net.ipv4.conf.all.accept_source_route e net.ipv4.conf.default.accept_source_route su 0 in /etc/sysctl.conf
# net.ipv4.conf.all.accept_source_route=0
# net.ipv4.conf.default.accept_source_route=0
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.4 Disattiva l'accettazione del reindirizzamento ICMP
Un utente può modificare la tabella di routing per inviare pacchetti a reti errate utilizzando un reindirizzamento ICMP fasullo, consentendo così l'acquisizione dei pacchetti. Per disabilitare l'accettazione del reindirizzamento ICMP, impostare i parametri net.ipv4.conf.all.accept_redirects e net.ipv4.conf.default.accept_redirects su 0 in /etc/sysctl.conf
# net.ipv4.conf.all.accept_redirects = 0
# net.ipv4.conf.default.accept_redirects parameters = 0
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.5 Disattiva l'accettazione del reindirizzamento ICMP sicuro
I reindirizzamenti ICMP sicuri e i reindirizzamenti ICMP sono quasi gli stessi, l'unica differenza è che l'origine dei pacchetti di reindirizzamenti ICMP sicuri è un gateway. Se il gateway di origine è compromesso, un utente può aggiornare la tabella di routing utilizzando i reindirizzamenti ICMP sicuri.
Impostare i parametri net.ipv4.conf.all.secure_redirects e net.ipv4.conf.default.secure_redirects su 0 in /etc/sysctl.conf per disabilitare Secure ICMP Redirect Acceptance.
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.6 Registra pacchetti sospetti
Un amministratore può diagnosticare il sistema quando un utente malintenzionato invia pacchetti contraffatti.
Impostare i parametri net.ipv4.conf.all.log_martians e net.ipv4.conf.default.log_martians su 1 in /etc/sysctl.conf per impedirlo.
# net.ipv4.conf.all.log_martians=1
# net.ipv4.conf.default.log_martians=1
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.7 Abilita richiesta di trasmissione ignorata
Per prevenire l'attacco smurf in una rete, impostare net.ipv4.icmp_echo_ignore_broadcasts su 1 che consentirà al sistema di ignorare tutte le richieste di eco e timestamp ICMP per trasmettere e multicast gli indirizzi. Impostare il parametro net.ipv4.icmp_echo_ignore_broadcasts su 1 in /etc/sysctl.conf
# net.ipv4.icmp_echo_ignore_broadcasts=1
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.8 Abilita la protezione dei messaggi di errore errati
Per impedire all'attaccante di inviare risposte che violano RFC-1122 nel tentativo di inserire file di registro di sistema con messaggi di errore inutili. Impostare il parametro net.ipv4.icmp_ignore_bogus_error_responses su 1 in /etc/sysctl.conf per bloccare le risposte di errore fasulle.
# net.ipv4.icmp_ignore_bogus_error_responses=1
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.9 Abilita la convalida del percorso di origine consigliato da RFC
Usando il filtro del percorso inverso, il kernel può determinare se il pacchetto è valido, altrimenti eliminerà il pacchetto.
Impostare i parametri net.ipv4.conf.all.rp_filter e net.ipv4.conf.default.rp_filter su 1 in /etc/sysctl.conf
# net.ipv4.conf.all.rp_filter=1
# net.ipv4.conf.default.rp_filter=1
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.10 Abilita i cookie TCP SYN
Un utente malintenzionato può avviare un attacco DOS nel server inondando i pacchetti SYN senza inizializzare l'handshake a tre vie. Per evitare ciò, impostare il parametro net.ipv4.tcp_syncookies su 1 in /etc/sysctl.conf
# net.ipv4.tcp_syncookies=1
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.10 Disattiva annuncio router IPv6
Consenti al server di non accettare annunci sul router poiché ciò può intrappolare il traffico di instradamento verso sistemi compromessi.
Impostare il parametro net.ipv6.conf.all.accept_ra e net.ipv6.conf.default.accept_ra su 0 in /etc/sysctl.conf
# net.ipv6.conf.all.accept_ra=0
# net.ipv6.conf.default.accept_ra=0
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.12 Disattiva l'accettazione del reindirizzamento IPv6
Consenti al server di non accettare annunci sul router poiché ciò può intrappolare il traffico di instradamento verso sistemi compromessi. Si consiglia di impostare hard route all'interno del sistema per proteggere il sistema da cattive route.
Impostare i parametri net.ipv6.conf.all.accept_redirects e net.ipv6.conf.default.accept_redirects su 0 in /etc/sysctl.conf
# net.ipv6.conf.all.accept_redirects=0
# net.ipv6.conf.default.accept_redirects=0
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.13 Disattiva IPv6
Per ridurre la probabilità di attacco nel sistema, disabilitare IPv6
Modifica il file /etc/sysctl.conf e aggiungi le seguenti righe:
# net.ipv6.conf.all.disable_ipv6=1
# net.ipv6.conf.default.disable_ipv6=1
# net.ipv6.conf.lo.disable_ipv6=1
Ora ricarica la configurazione di sysctl
# sudo sysctl -p
5.14 Installare i wrapper TCP
Usa i wrapper TCP per tutti i servizi che supportano i wrapper TCP.
Installa TCP:
# apt-get install tcpd
5.15 Crea /etc/hosts.allow
Per garantire che solo i sistemi autorizzati possano connettersi al server, utilizzare /etc/hosts.allow
Modifica /etc/hosts.allow e aggiungi quanto segue
"ALL: <net>/<mask>, <net>/<mask>, …"
e.g <net> = 192.168.10.100 , <mask> = 255.255.255.0
5.16 Verifica i permessi su /etc/hosts.allow
È importante proteggere /etc/hosts.allow da accessi in scrittura non autorizzati. Esegui il comando seguente per trovare l'autorizzazione di /etc/hosts.allow
# ls -l /etc/hosts.allow
-rw-r--r-- 1 root root 2055 15 febbraio 11:30 /etc/hosts.allow
Se l'autorizzazione non è corretta, utilizza il seguente comando per correggerla
#chmod 644 /etc/hosts.allow
5.17 Crea /etc/host negare
Nega l'accesso al server usando /etc/hosts.deny . Il file /etc/hosts.deny è configurato per negare
tutti gli host non sono menzionati in /etc/hosts.allow. Crea il file /etc/hosts.deny
echo "TUTTI:TUTTI">> /etc/hosts.deny
5.18 Verifica i permessi su /etc/hosts.deny
È importante proteggere /etc/hosts.deny dall'accesso in scrittura non autorizzato. Esegui il comando seguente per trovare l'autorizzazione di /etc/hosts.deny
# ls -l /etc/hosts.deny
-rw-r--r-- 1 root root 2055 Feb 15 11:30 /etc/hosts.deny
5.19 Assicurati che il firewall sia attivo
Per limitare la comunicazione in entrata e in uscita a un indirizzo IP e una porta specifici, utilizzare il firewall. Ubuntu fornisce Uncomplicated Firewall (UFW) per configurare facilmente la configurazione del firewall.
Installa UFW
# sudo apt-get install ufw
Attiva ufw:
# sudo ufw enable
esempio:
Consenti servizi SSH e http.
# sudo ufw allow TCP/80
# sudo ufw allow TCP/22
# sudo ufw reload
6. Registrazione e controllo
Utilizzando un potente framework di controllo, il sistema può tenere traccia di molti tipi di eventi per monitorare e controllare il sistema.
Installa auditd usando il seguente comando
sudo apt-get install auditd audispd-plugins
Se necessario, crea i collegamenti di avvio appropriati per auditd in /etc/rc*.d eseguendo il seguente comando da ciascuna delle directory pertinenti:
# ln -s /etc/init.d/auditd S37auditd
I collegamenti di avvio devono essere creati per i livelli di esecuzione
6.1 Configurazione delle dimensioni di archiviazione del registro di controllo
La dimensione del file di registro di controllo deve essere scelta con attenzione in modo che non influisca sul sistema e non vada perso alcun dato di controllo.
Imposta il parametro max_log_file in /etc/audit/auditd.conf
max_log_file = <MB>
6.2 Disabilita il sistema se il registro di controllo è pieno
Il demone auditd può essere configurato per arrestare il sistema quando i log di controllo sono pieni. Eseguire quanto segue per determinare se auditd è configurato per notificare all'amministratore e arrestare il sistema quando i log di audit sono pieni.
space_left_action = email
action_mail_acct = root
admin_space_left_action = halt
6.3 Conserva tutte le informazioni di controllo
In contesti di sicurezza elevata, i vantaggi del mantenimento di una lunga cronologia di audit superano il costo dell'archiviazione della cronologia di audit. Aggiungi la seguente riga al file /etc/audit/auditd.conf.
max_log_file_action = keep_logs
6.4 Registrare eventi che modificano le informazioni su data e ora
Per monitorare modifiche insolite della data e/o dell'ora del sistema che indicano un'attività non autorizzata sul sistema.
Per i sistemi a 64 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time-change
-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time-change
-a always,exit -F arch=b64 -S clock_settime -k time-change
-a always,exit -F arch=b32 -S clock_settime -k time-change -w /etc/localtime -p wa -k time-change
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
Per i sistemi a 32 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time-change
-a always,exit -F arch=b32 -S clock_settime -k time-change -w /etc/localtime -p wa -k time-change
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.6 Registrare eventi che modificano informazioni su utenti/gruppi
Modifiche impreviste a /etc/group, /etc/passwd, /etc/gshadow, /etc/shadow, /etc/security/opasswd indicano chiaramente che un utente non autorizzato sta cercando di nascondere le proprie attività o di compromettere account aggiuntivi.
Aggiungi le seguenti righe al file /etc/audit/audit.rules.
-w /etc/group -p wa -k identity
-w /etc/passwd -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/security/opasswd -p wa -k identity
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.7 Registrare eventi che modificano l'ambiente di rete del sistema
Per impedire che modifiche non autorizzate all'host e al nome di dominio di un sistema interrompano i parametri di sicurezza impostati in base a tali nomi, aggiungere le seguenti righe in /etc/audit/audit.rules
Per i sistemi a 64 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a exit,always -F arch=b64 -S sethostname -S setdomainname -k system-locale
-a exit,always -F arch=b32 -S sethostname -S setdomainname -k system-locale
-w /etc/issue -p wa -k system-locale -w /etc/issue.net -p wa -k system-locale
-w /etc/hosts -p wa -k system-locale -w /etc/network -p wa -k system-locale
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
Per i sistemi a 32 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a exit,always -F arch=b32 -S sethostname -S setdomainname -k system-locale
-w /etc/issue -p wa -k system-locale -w /etc/issue.net -p wa -k system-locale
-w /etc/hosts -p wa -k system-locale -w /etc/network -p wa -k system-locale
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.8 Registrare eventi che modificano i controlli di accesso obbligatori del sistema
Qualsiasi modifica ai file in /etc/selinux è un'indicazione che un utente non autorizzato sta tentando di modificare i controlli di accesso e cambiare i contesti di sicurezza per ottenere l'accesso al sistema.
Aggiungi le seguenti righe a /etc/audit/audit.rules
-w /etc/selinux/ -p wa -k MAC-policy
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.9 Raccogli eventi di accesso e disconnessione
Per monitorare le informazioni relative agli attacchi di login/logout/brute force, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-w /var/log/faillog -p wa -k logins
-w /var/log/lastlog -p wa -k logins
-w /var/log/tallylog -p wa -k logins
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.10 Raccogliere informazioni sull'avvio della sessione
Monitorare gli eventi di avvio della sessione. Un amministratore di sistema può monitorare gli accessi che si verificano in orari insoliti, il che potrebbe indicare un'attività non autorizzata.
Aggiungi le seguenti righe al file /etc/audit/audit.rules.
-w /var/run/utmp -p wa -k session
-w /var/log/wtmp -p wa -k session
-w /var/log/btmp -p wa -k session
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.11 Raccogliere eventi di modifica dell'autorizzazione al controllo di accesso discrezionale
Trova le modifiche agli attributi del file che sono un'indicazione dell'attività di un intruso.
Per i sistemi a 64 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a always,exit -F arch=b64 -S chmod -S fchmod -S fchmodat -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S chmod -S fchmod -S fchmodat -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S chown -S fchown -S fchownat -S lchown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S chown -S fchown -S fchownat -S lchown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
# Esegui il comando seguente per riavviare auditd
# sudo service auditd riavvio
Per i sistemi a 32 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a always,exit -F arch=b32 -S chmod -S fchmod -S fchmodat -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S chown -S fchown -S fchownat -S lchown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.12 Raccogliere tentativi di accesso non autorizzato ai file non riusciti
Trova tentativi falliti di aprire, creare o troncare file per ottenere l'accesso non autorizzato al sistema.
Per i sistemi a 64 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a always,exit -F arch=b64 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EACCES -F auid>=500 -F auid!=4294967295 -k access
-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EACCES -F auid>=500 -F auid!=4294967295 -k access
-a always,exit -F arch=b64 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EPERM -F auid>=500 -F auid!=4294967295 -k access
-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EPERM -F auid>=500 -F auid!=4294967295 -k access
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
Per i sistemi a 32 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EACCES -F auid>=500 -F auid!=4294967295 -k access
-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EPERM -F auid>=500 -F auid!=4294967295 -k access
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.13 Utilizzo collettivo dei comandi privilegiati
Scopri se ci sono usi di comandi privilegiati da parte di utenti non privilegiati per ottenere l'accesso al sistema. Per prima cosa esegui il comando seguente, quindi aggiungi l'output del comando seguente al file /etc/audit/audit.rules
# find PART -xdev \( -perm -4000 -o -perm -2000 \) -type f | awk '{print \ "-a always,exit -F path=" $1 " -F perm=x -F auid>=500 -F auid!=4294967295 \ -k privileged" }'
6.14 Raccogliere montaggi di file system non riusciti
Per tenere traccia del montaggio dei file system da parte di utenti non privilegiati aggiungere le seguenti regole nel file /etc/audit/audit.rules
Per i sistemi a 64 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a always,exit -F arch=b64 -S mount -F auid>=500 -F auid!=4294967295 -k mounts
-a always,exit -F arch=b32 -S mount -F auid>=500 -F auid!=4294967295 -k mounts
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
Per i sistemi a 32 bit, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-a always,exit -F arch=b32 -S mount -F auid>=500 -F auid!=4294967295 -k mounts
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.15 Raccogli eventi di eliminazione file per utente
Per scoprire se si sta verificando la rimozione di file e attributi di file associati ai file protetti, aggiungere le seguenti regole.
Per i sistemi a 64 bit, aggiungi quanto segue al file /etc/audit/audit.rules.
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=500 -F auid!=4294967295 -k delete
-a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -F auid>=500 -F auid!=4294967295 -k delete
Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
Per i sistemi a 32 bit, aggiungi quanto segue al file /etc/audit/audit.rules.
-a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -F auid>=500 -F auid!=4294967295 -k delete
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.16 Raccogli le modifiche all'ambito dell'amministrazione del sistema
Le modifiche al file /etc/sudoers possono indicare che è stata apportata una modifica non autorizzata all'ambito dell'attività dell'amministratore di sistema.
Aggiungi le seguenti righe al file /etc/audit/audit.rules.
-w /etc/sudoers -p wa -k scope
# Esegui il comando seguente per riavviare auditd
# sudo service auditd restart
6.17 Raccogli le azioni dell'amministratore di sistema (sudolog)
Per impedire agli utenti non autorizzati di utilizzare il comando privilegiato, scopri se vengono apportate modifiche in /var/log/sudo.log.
Aggiungi le seguenti righe al file /etc/audit/audit.rules.
-w /var/log/sudo.log -p wa -k actions
Riavvia audit
# sudo service auditd restart
6.18 Raccogli il caricamento e lo scaricamento del modulo del kernel
Per scoprire se un utente non autorizzato sta utilizzando insmod, rmmod e modprobe compromettendo così la sicurezza del sistema, aggiungi le seguenti righe al file /etc/audit/audit.rules.
-w /sbin/insmod -p x -k modules
-w /sbin/rmmod -p x -k modules
-w /sbin/modprobe -p x -k modules
Per i sistemi a 32 bit, aggiungi
-a always,exit -F arch=b32 -S init_module -S delete_module -k modules
Per i sistemi a 64 bit, aggiungi
-a always,exit -F arch=b64 -S init_module -S delete_module -k modules
Riavvia audit
# sudo service auditd restart
6.19 Rendi immutabile la configurazione di audit
Per impedire agli utenti non autorizzati di apportare modifiche al sistema di controllo per nascondere la loro attività dannosa e quindi ripristinare le regole di controllo, aggiungi le seguenti righe al
/etc/audit/audit.rules.
-e 2
Questa deve essere l'ultima riga nel file /etc/audit/audit.rules
Riavvia audit
# sudo service auditd restart
7. Accesso al sistema, autenticazione e autorizzazione
7.1 Imposta proprietario utente/gruppo e autorizzazione su cron
Esegui i seguenti comandi per limitare l'accesso in lettura/scrittura e ricerca all'utente root e ai gruppi, impedendo agli utenti normali di accedere a questi file/directory.
# chown root:root /etc/crontab
# chmod og-rwx /etc/crontab
# chown root:root /etc/cron.hourly
# chmod og-rwx /etc/cron.hourly
# chown root:root /etc/cron.daily
# chmod og-rwx /etc/cron.daily
# chown root:root /etc/cron.weekly
# chmod og-rwx /etc/cron.weekly
# chown root:root /etc/cron.monthly
# chmod og-rwx /etc/cron.monthly
# chown root:root /etc/cron.d
# chmod og-rwx /etc/cron.d
7.2 Configura PAM
PAM (Pluggable Authentication Modules) è un servizio che implementa moduli di autenticazione modulari su sistemi UNIX. PAM deve essere configurato con cura per proteggere l'autenticazione del sistema.
7.2.1 Impostare i parametri dei requisiti per la creazione della password utilizzando pam_cracklib
Il modulo pam_cracklib controlla la forza delle password. Esegue controlli come assicurarsi che una password non sia una parola del dizionario, sia di una certa lunghezza, contenga un mix di caratteri (ad es. alfabeto, numerico, altro) e altro ancora.
Impostare i parametri pam_cracklib.so come segue in /etc/pam.d/common-password
password required pam_cracklib.so retry=3 minlen=14 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
7.2.2 Imposta blocco per tentativi di password non riusciti
Bloccare gli utenti dopo tentativi di accesso consecutivi non riusciti per prevenire attacchi di forza bruta alle password contro i tuoi sistemi.
Modifica il file /etc/pam.d/login e aggiungi la riga di autenticazione di seguito:
auth required pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900
7.2.3 Limitare il riutilizzo della password
Obbligare gli utenti a non riutilizzare le ultime 5 password rende meno probabile che un utente malintenzionato sia in grado di indovinare la password. Imposta il parametro pam_unix.so remember su 5 in /etc/pam.d/common-password
password sufficient pam_unix.so remember=5
8. Configura SSH
Modifica il file /etc/ssh/sshd_config per impostare il seguente parametro come segue per renderlo sicuro.
Protocol 2
LogLevel INFO
X11Forwarding no
MaxAuthTries 4
IgnoreRhosts yes
HostbasedAuthentication no
PermitRootLogin no
PermitEmptyPasswords no
PermitUserEnvironment no
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
ClientAliveInterval 300
ClientAliveCountMax 0
AllowUsers <userlist>
AllowGroups <grouplist>
DenyUsers <userlist>
DenyGroups <grouplist>
Banner <your bannerfile>
9. Restrict Access to the su Command
Use sudo instead of su as it provides a better logging out and audit mechanism. The another motivation for using sudo is to restrict the uses of su. Uncomment the pam_wheel.so line in /etc/pam.d/su, so that su command will be available to users in the wheel group to execute su.
# grep pam_wheel.so /etc/pam.d/su
auth required pam_wheel.so use_uid
# grep wheel /etc/group
wheel:x:10:root, <user list>.....
10. User Accounts and Environment
10.1 Set Password Expiration Days
Reduce the maximum age of a password.
Set the PASS_MAX_DAYS parameter to 120 in /etc/login.defs
PASS_MAX_DAYS 60
Modify active user parameters to match:
# chage --maxdays 120 <user>
10.2 Set Password Change Minimum Number of Days
To prevent the user from changing their password until a minimum no of days have passed since the user changed the password. Set the PASS_MIN_DAYS parameter to 7 in /etc/login.defs
PASS_MIN_DAYS 7
Modify active user parameters to match:
# chage --mindays 7
10.3 Set Password Expiring Warning Days
The administrator can notify the users about the expiry of their password using ASS_WARN_AGE parameter in /etc/login.defs.
Set the PASS_WARN_AGE parameter to 7 in /etc/login.defs
PASS_WARN_AGE 7
Modify active user parameters to match
# chage --warndays 7 <user>
11. System Accounts
11.1 Disable System Accounts
To prevent the system account from being used to get an interactive shell, append “/usr/sbin/nologin” at the end of each system accounts in /etc/passwd
11.2 Set Default
umask for Users
Set umask of 022 will make files readable by every user on the system.
Edit the /etc/login.defs file and add the following line
UMASK 022
11.3 Lock Inactive User Accounts
To make the system more secure, execute the following command to lock the inactive accounts.
# useradd -D -f 35
11.4 Remove OS Information from Login Warning Banners
To prevent the OS and patch level information from login banners, edit the /etc/motd, /etc/issue and /etc/issue.net files and remove any lines containing \m, \r, \s or \v.
12. Verify System File Permissions
12.1 Verify Permissions on /etc/passwd, /etc/shadow, /etc/group
These file needs to be protected from unauthorized changes by non-privileged users as well as needs to be readable as this information is used by non-privileged programs.
Execute the following commands to correct the permissions for these files
# chmod 644 /etc/passwd
# chmod o-rwx,g-rw /etc/shadow
# chmod 644 /etc/group
12.2 Verify User/Group Ownership on /etc/passwd, /etc/shadow, /etc/group
These file needs to be protected from unauthorized changes by non-privileged users as well as needs to be readable as this information is used by non-privileged programs.
Execute the following commands to correct the ownership for these files
# chown root:root /etc/passwd
# chown root:shadow /etc/shadow
# chown root:root /etc/group
13. Check for rootkits
There are few tools available through which you can check for rootkit in the server. The two popular rootkit hunters are RKHunte and CHKRootKit, use anyone of them periodically to check for rootkit in the system
Install chkrootkit
# sudo apt-get install chkrootkit
To run chkrootkit, execute the following command in the terminal
# chkrootkit
14. PSAD IDS/IPS
To detect the intrusion in your network, you can use toos like snort or cipherdyne's psad. The later has the capability of intrusion detection and log analysis with iptables. PSAD is a lightweight system daemons that analyze the iptables log message to detect scans and other spurious traffic.
Install PSAD
#sudo apt-get install psad
Now configure psad to detect scans, Intrusion Detection and Intrusion Prevention
15. Prevent IP Spoofing
Add following lines in /etc/host.conf to prevent IP spoofing
order bind,hosts
nospoof on
16. Enabling automatic security updates
It is highly recommended to enable automatic security updates and patches to keep the system secure. You will be notified every time you logged in to the system using SSH about security updates and patches. In Ubuntu Desktop, to enable automatic security updates, click on "System" select "Administration" and then "Software Sources" menu. Now select the "Internet Updates" and enable "Check for updates automatically" specifying daily". If Ubuntu issues a new security release then you will be notified via the "Update Manager" icon in the system tray. You can use unattended-upgrades which can handle automatic installation of security upgrades in Ubuntu system. Running sudo unattended-upgrade will install all the security package available for upgrade.
Install this package if it isn't already installed using
# sudo apt-get install unattended-upgrades
To enable it type
# sudo dpkg-reconfigure unattended-upgrades
and select "yes".
17. Harden PHP
Edit the php.ini file /etc/php5/apache2/php.ini and add uncomment/add following lines.
safe_mode = On
safe_mode_gid = On
disable_functions = hp_uname, getmyuid, getmypid, passthru, leak, listen, diskfreespace, tmpfile, link, ignore_user_abord, shell_exec, dl, set_time_limit, exec,
system, highlight_file, source, show_source, fpaththru, virtual, posix_ctermid, posix_getcwd, posix_getegid, posix_geteuid, posix_getgid, posix_getgrgid,
posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid, posix_getpgrp, posix_getpid, posix, _getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit,
posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times,
posix_ttyname, posix_uname, proc_open, proc_close, proc_get_status, proc_nice, proc_terminate, phpinfo
register_globals = Off
expose_php = Off
display_errors = Off
track_errors = Off
html_errors = Off
magic_quotes_gpc = Off
mail.add_x_header = Off
session.name = NEWSESSID
allow_url_fopen = Off
allow_url_include = Off
session.save_path = A secured location in the server
18. Harden Apache
Edit Apache2 configuration security file /etc/apache2/conf-available/security.conf and add the following-
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Header unset ETag
FileETag None
The web application firewall ModSecurity is effective way to protect web server so that it's much less vulnerable to probes/scans and attacks. First install mod_security using following command.
# sudo apt-get install libapache2-mod-security2
# mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
Edit /etc/modsecurity/modsecurity.conf
Activate the rules by editing the SecRuleEngine option and set to On and modify your server signature
SecRuleEngine On
SecServerSignature FreeOSHTTP
Now edit the following to increase the request limit to 16 MB
SecRequestBodyLimit 16384000
SecRequestBodyInMemoryLimit 16384000
Download and install the latest OWASP ModSecurity Core Rule Set from their website.
# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/master.zip
# unzip master.zip
# cp -r owasp-modsecurity-crs-master/* /etc/modsecurity/
# mv /etc/modsecurity/modsecurity_crs_10_setup.conf.example /etc/modsecurity/modsecurity_crs_10_setup.conf
# ls /etc/modsecurity/base_rules | xargs -I {} ln -s /etc/modsecurity/base_rules/{} /etc/modsecurity/activated_rules/{}
# ls /etc/modsecurity/optional_rules | xargs -I {} ln -s /etc/modsecurity/optional_rules/{} /etc/modsecurity/activated_rules/{}
Now add the following line in /etc/apache2/mods-available/mod-security.conf
Include "/etc/modsecurity/activated_rules/*.conf"
Check if the modules has been loaded-
# sudo a2enmod headers
# sudo a2enmod mod-security
Now restart Apache2
# service apache2 restart
Apart from ModSecurity, install modevasive to protect your server from DDOS (Denial of Service) attacks
Once you've hardened the system, run some vulnerability scans and penetration tests against it in order to check that it's actually rock solid as you're now expecting it. However attack on your server can happen, it is up-to you to scan the log files regularly to find out any breaches have been occurred. You can use log analyzer tool like ELK stack to drill through servers log files quickly. If you find evidences of breaches then quickly disconnect your server from the internet and take remedial measures.