Introduzione a Linux Security & Hardening

In questo articolo volevo toccare un po’ di temi sulla sicurezza e l’hardening dei sistemi Linux, non scenderò troppo nello specifico perché vorrei approfondirli in seguito in articoli dedicati. Buona lettura!

General Security

Cosa fa di Linux un sistema sicuro?

Linux è un Sistema Operativo Open-Source, per questo motivo è molto difficile inserire backdoor o qualsiasi codice malevolo nel sorgente senza che nessuno se ne accorga. Windows spesso è affetto da bug che perdurano per anni prima di essere risolti, essendo Microsoft l’unica ad avere accesso al codice sorgente.

Multiuser system

Linux è un sistema multi-utente e tale caratteristica permette di segregare gli accessi ai file o alle impostazioni. Esiste un utente chiamato superuser il cui username è root, detiene tutti i privilegi per fare qualsiasi cosa, anche se alcuni file e/o configurazioni sono stati nascosti da qualche utente, root è in grado di accedervi.

Own root, own the system.

Uno dei vantaggi di Linux è che file e processi possono essere eseguiti, modificati o cancellati solo dall’utente che li detiene (owner) o da root.

Niente è sicuro al 100%, c’è sempre un compromesso tra usabilità e sicurezza.

Service account

Alcuni servizi, demoni o applicazioni su Linux utilizzano una propria utenza; ad esempio i web server, in modo da proteggere i file esposti (e il sistema) sono gli owner dei file/cartelle e delle configurazioni.

Gli attaccanti sono persone, e pertanto spesso pigre

In genere nel mondo sono presenti molti più computer Windows, soprattutto lato consumer, che Linux, perciò esso diventa il target più ambito. Infatti chi utilizza Linux in genere è un tecnico e quindi ha un’indole di sicurezza più marcata rispetto all’utenza normale.

Windows ha molti virus proprio per questo motivo; ciò non significa che su Linux non ne esistano.

Gestione centralizzata dei software

Nei sistemi Linux i software sono gestiti ed installati tramite un package manager; le varie distribuzioni hanno i repository firmati crittograficamente, ciò garantisce che i software che installiamo sono realmente quelli che dicono di essere.

La maggioranza dei software su Linux sono a loro volta open-source e i benefici sono quelli esposti sopra.


Security guidelines

MINIMIZZA SOFTWARE E SERVIZI
Se non hai bisogno di un software o di un servizio, disinstallalo. Il rischio è quello di “aiutare” l’attaccante perché aumenti la tua superficie di esposizione.

UTILIZZA PIÙ SISTEMI PER SERVIZI DIVERSI
Se un attaccante riesce ad exploitare il tuo webserver e sullo stesso sistema c’è un servizio di file sharing, è molto probabile che riuscirà ad accedere anche a quello.

CIFRA LE TRASMISSIONI DATI
Cifrando le comunicazioni si evitano attacchi MITM (man-in-the-middle). Utilizza SFTP, SNMPv3, HTTPS, SSH. Evita di usare protocolli che comunicano in chiaro come TELNET.

NON USARE ACCOUNT CONDIVISI
Ogni persona che accede al sistema dovrebbe avere il proprio account e questo vale anche per i servizi. Inoltre gli account condivisi, oltre a diminuire la sicurezza complessiva di un sistema, rendono difficile l’auditing.

NON FARE LOGIN CON ROOT
Gli utenti dovrebbero utilizzare i propri account e quando necessario utilizzare il comando sudo per eseguire comandi o programmi con altri privilegi. Utilizzando sudo le azioni vengono loggate, migliorando l’auditing.

Al contrario degli altri account root è spesso condiviso, pertanto è necessario utilizzarlo sempre con cautela e solo quando strettamente necessario.

MANUTENERE GLI ACCOUNT
Password forti (> 12 caratteri alfanumerici) e cambiate regolarmente aumentano la security posture del sistema. Gli account non più in utilizzo vanno rimossi (o disabilitati, in base alle necessità).

TWO-FACTOR AUTHENTICATION
Per sistemi critici (ad esempio quelli militari o governativi) l’autenticazione dovrebbe essere basata su più fattori, generalmente una password e un codice temporaneo (OTP) o l’impronta digitale.

UTILIZZARE IL PRINCIPIO DEL “LEAST PRIVILEGE”
Non avviare servizi con l’utente root, funzionano ugualmente con i propri account di servizio. Dai agli utenti i privilegi minimi indispensabili per poter svolgere la loro mansione.

MONITORA L’ATTIVITÀ DI SISTEMA
Revisiona periodicamente i log di sistema e inviali ad un sistema centralizzato di logging, tipicamente un SIEM, cosicché se venissero cancellati dal sistema locale avrai una copia.

UTILIZZA IL FIREWALL
Linux possiede un firewall software built-in: netfilters + iptables. Sempre secondo il principio “least privilege”, autorizza solo le connessioni necessarie e “droppa” tutto il resto, anche se il sistema sta dietro un firewall hardware.

CIFRA I DATI SENSIBILI
Oltre alla cifratura delle connessioni, è necessario cifrare i dati sensibili anche quando sono memorizzati sui sistemi, in modo da prevenire un eventuale lettura o alterazione da soggetti non autorizzati. Anche le informazioni nei database vanno cifrate.


Sicurezza fisica

Concetti di sicurezza fisica

L’accesso fisico ad un sistema è una grossa minaccia per la sicurezza, un malintenzionato potrebbe spegnere il sistema, avviarlo in single user mode e installare i propri software: autorizzate l’accesso fisico solo se necessario. Controlla gli accessi fisici come per i login ai sistemi.

Nei datacenter accede solo personale autorizzato, le visite devono essere scortate e si deve evitare di indicare all’esterno la presenza del datacenter stesso.

Per i sistemi in cloud si deve comunque tener conto della sicurezza fisica (i datacenter comunque esistono in qualche parte del globo 😉 ). Tutti i virtual device che si affittano, risiedono su macchine fisiche; è importante potersi fidare del fornitore. Inoltre è da ricordare che il tuo fornitore ha accesso ai tuoi dati, quindi se possibile cifra il tuo ambiente cloud.

Single user mode security

Il problema della sicurezza fisica è tale da permettere ad un malintenzionato di riavviare fisicamente la macchina (nel caso delle VM tramite virtual console) ed entrare in single user mode (spesso root senza password).

È possibile impostare la richiesta della password anche in caso di single user mode, cambiando nelle impostazioni da /sbin/sushell a /sbin/sulogin.

# Imposta '/sbin/sulogin' per richiedere la password in single user mode
# Altrimenti imposta '/sbin/sushell'
SINGLE=/sbin/sulogin <--- richiederà la password

In genere i file da modificare sono /boot/grub/grub.conf e /etc/sysconfig/init. Le modalità possono variare in base alla distribuzione utilizzata.

Su sistemi Ubuntu è importante impostare la password di root che in genere non è impostata di default.

Mettere in sicurezza il Boot Loader

Modificando la configurazione di avvio del Kernel (kernel -> init -> system) è possibile settare

init=/bin/bash

per bypassare l’autenticazione.

Nelle configurazioni di GRUB si può indicare un superuser e una password per proteggere il kernel e non permettere il passaggio di parametri all’avvio (se non avendo la password).

Il sistema rimane comunque suscettibile agli attacchi se lo storage è leggibile (non cifrato).

Disk Encryption

Il Sistema Operativo deve avere accesso ai file decifrati per poterci lavorare. In Linux viene utilizzato dm-crypt (device mapper crypt) per la disk encryption, esso fornisce una cifratura completamente trasparente all’utente e al sistema: viene creato un nuovo device in /dev/mapper ed è possibile utilizzarlo come un normale disco, anche usando LVM.

LUKS (Linux Unified Key Setup) è un frontend per dm-crypt, supporta passphrase multiple ed è molto utilizzato anche per dispositivi rimovibili.

Struttura del funzionamento della Disk Encryption

Setup LUKS

Attenzione: Questo processo rimuove tutti i dati precedenti

CONSIGLIO: Prima di cifrare il disco è utile usare il comando shred e riempire il disco con dati casuali. Ciò comporterà, ad un eventuale attaccante, notevoli difficoltà nel capire dove comincia e dove finisce la sezione con i dati reali.

  1. Installare il pacchetto cryptsetup
  2. Lanciare il comando:
sudo cryptsetup luksFormat /dev/sdb

Dove /dev/sdb è il disco da cifrare, attenzione a selezionare il disco corretto!

3. Per accedere al disco eseguire:

sudo cryptsetup luksOpen /dev/sdb OPT

Sostituire OPT con il path in /dev/mapper dove montare il disco. Se vogliamo eseguire l’automounting dovremo modificare le configurazioni in /etc/fstab e /etc/crypttab.

4. Chiudere il device cifrato con:

sudo cryptsetup luksClose OPT

Dove OPT sarà la cartella in /dev/mapper.

Leggi anche il mio articolo di approfondimento su LUKS:


Introduzione ai PAM

Linux Account Security

Un utente interno ha un accesso maggiore al sistema rispetto ad un utente esterno, un attacco comune consiste nell’utilizzo di un utente qualsiasi ed effettuare privilege escalation.

Una delle contromisure per poter rendere più sicuro un sistema è quella di dare accesso agli utenti solo verso quello a cui serve loro.

PAM (Pluggable Authentication Modules) permette di gestire l’autenticazione e, al posto di lasciare questa delicata fase ad ogni applicazione, gestirla con questi moduli.

È possibile aggiungere moduli (ad esempio moduli biometrici) al PAM per cambiare le modalità di accesso.
Le configurazioni sono presenti in /etc/pam.d e il formato delle direttive è:

module_interface control_flag module_name module_arguments

Le module_interface sono:

  • AUTH — User Authentication
  • ACCOUNT — Verifica se l’utente è abilitato
  • PASSWORD — Cambia la password di un utente
  • SESSION — Gestisce le sessioni utente

I control_flag dicono al PAM cosa fare con un determinato risultato:

  • REQUIRED — Il risultato del modulo deve essere positivo per continuare
  • REQUISITE — Come sopra, ma senza invocare altri moduli
  • SUFFICIENT — Autentica l’utente se i moduli REQUIRED non sono falliti
  • OPTIONAL — Il risultato del modulo può essere ignorato a meno che non sia l’unico modulo
  • INCLUDE — Include configurazioni da altri file

Linux Account Type

root — Può fare qualsiasi cosa sul sistema, ha sempre UID=0 (non è il nome root a dargli “potere”)

system users — Hanno UID < 1000

normal users — Hanno UID ≥ 1000, sono quasi esclusivamente utenti umani (quindi interattivi)

Password Security

Non affidare la complessità delle password agli utenti. Utilizza il modulo PAM_PWQUALITY (basato sul modulo PAM_CRACKLIB).

Shadow Password

Inizialmente le password venivano salvate nel file /etc/passwd, abilitando shadow password vengono salvate in /etc/shadow.

Formato del file /etc/shadow:

  1. username
  2. hash della password (oppure asterisco nel caso di utenti non in grado di effettuare il login diretto)
  3. data dell’ultimo cambio password (in epoch)
  4. numero di giorni minimo prima di poter effettuare il cambio password
  5. numero massimo di giorni della validità della password
  6. numero di giorni di preavviso alla scadenza della password
  7. numero di giorni trascorsi i quali una password scaduta comporta la disattivazione dell’account
  8. data della scadenza della password (in epoch)
  9. campo riservato

Ogni riga rappresenta un utente, ogni campo è separato dal carattere “:”, pertanto la rappresentazione di una riga del file è la seguente:

mariorossi:$6$F5o3Sdoc$y.IdYyCK74kDS6zXxW7iFer8JdaagQAViaZJGO1Om8MPZUxn8XTml9TNLn2deLNRPNKwZAvHKfefAtnDVD5Zo/:14671:0:90:6:7:14800:9

Per non permettere agli utenti di utilizzare la loro vecchia password è necessario utilizzare il modulo PAM_PWHISTORY.

Controllare gli accessi

Con i comandi

passwd -l   # Lock
passwd -u   # Unlock

è possibile bloccare e sbloccare un account, oppure si può modificare il file passwd e impostare nologin al posto della shell di default. Il login può essere disabilitato anche dal modulo PAM_NOLOGIN.

Con i comandi last, lastb e lastlog si possono analizzare i log di accesso.

Nel caso in cui volessimo bloccare le connessioni remote che hanno fallito ripetutamente il login possiamo usare fail2ban.

Il login può essere messo in sicurezza con l’autenticazione multifattore tramite codici OTP. Esistono i moduli PAM per Google Authenticator, Duo Security e RSA SecurID.

Security per tipologia di account

  • Utilizzare un utente normale
  • Disabilitare il login diretto di root
  • Utilizzare il comando sudo
  • La password di root deve essere diversa per ogni sistema
  • Assicurarsi che root sia l’unico ad avere UID=0

Disabilitare il login di root
Tramite PAM_SECURETTY: All’interno delle configurazioni è possibile specificare dove root può loggarsi (tty, console). Se non viene specificato nessun terminale, l’unico modo per accedere rimane la single user mode.
Tramite SSH: Editare le configurazioni in /etc/sshd.

Account di sistema o applicativi
Utilizzare un solo account per ogni servizio o applicazione, non abilitare il login per tali account.

User account
Utilizzare un solo account per ogni persona fisica, rimuovere gli utenti non necessari, rimuovere tutto ciò che è correlato ad un utente da eliminare.


Network Security

I servizi vengono chiamati anche network services, daemons (demoni) o server, e ascoltano su porte specifiche.
Sono sempre in funzione (in background) e l’output viene loggato dal sistema, in genere in /var/log se non diversamente specificato nei file di configurazione o dalla configurazione di default dell’applicazione. Ogni servizio svolge un singolo compito: servire pagine web, servire database, sniffing.

  • Utilizzare utenti dedicati per ogni servizio ci permette di avere il vantaggio della separation of duties
  • Le porte minori di 1024 sono porte privilegiate e richiedono root per essere aperte
  • I servizi non utilizzati vanno stoppati e disinstallati
  • Evitare l’utilizzo di servizi che comunicano in maniera non sicura
  • Mantenere aggiornati i servizi e il sistema

Un TCP WRAPPER può essere utile per aumentare ulteriormente la security posture del nostro sistema.

Information Leakage
Evita di rivelare informazioni sul software e la versione utilizzata se non necessario, modifica o elimina i banner dei servizi.

Servizi controllati da xinetd
Questi servizi si trovano in /etc/xinetd.d/SERVICE, lo scopo di xinetd è avviare i servizi nel caso in cui quest’ultimo noti una connessione ad una porta specifica.

Lascia un commento