Protezione boot di Linux

Come rendere sicuro il boot di una macchina Linux contro i tentativi di accesso non autorizzati


di Michele Dalla Silvestra
dalla@maya.dei.unipd.it


Grazie al concetto di multiutenza, Linux è ben protetto, durante il funzionamento, contro gli accessi da parte di persone non autorizzate, ma se non c'è la possibilità di impedire l'accesso alla console della macchina, chiunque potrebbe molto semplicemente forzare questa sicurezza.

Premettiamo una cosa: anche contro gli antifurti più perfetti ci sarà sempre qualcuno che riuscirà a penetrare in un sistema, però migliori sono le difese, più improbabile è questa ipotesi.

Gli attacchi verso un sistema Linux possono arrivare da varie parti: dalla console (tastiera/mouse), sull'unità centrale della macchina e via rete.

Gli attacchi dalla rete possono essere limitati, tuttavia se devono essere forniti servizi all'esterno bisogna rassegnarsi ad esporre alcune parti della macchina. L'importante è non rendere facilmente accessibili aree vitali (filesystem /etc via NFS in rw, se potete evitate anche l'NFS, oppure aree di incoming nell'FTP pubblico).

Una cosa che intanto possiamo proteggere con facilità è la console. Una cosa importante: se dimenticate aperta la sessione di root siete fregati! Non fidatevi assolutamente della chiavetta che blocca la tastiera, in quanto il mouse è sempre attivo, e mediante un po' di copia/incolla con questo si può fare quasi tutto! Utilizzate sempre un programma di lock che richieda l'inserimento una password se dovete abbandonare momentaneamente la postazione.

Una cosa un po' difficile da proteggere è l'unità centrale: è preferibile renderla inaccessibile (sotto chiave, ma con la possibilità di ventilazione), in quanto se proteggete l'avvio come descriverò più avanti, l'unico modo per sbloccare tutto è azzerare il bios o alterare il disco trapiantandolo in un'altra macchina, quindi aprire il coperchio.

Vediamo adesso come proteggere una fase delicata del sistema: l'AVVIO!

Fase 1: il Bios

La prima cosa che permette di entrare abusivamente in un sistema è mediante un floppy con un sistema operativo. In questo modo chi accende la macchina, anche se non riuscisse a decifrare i dati del disco fisso se questi fossero criptati, può sempre, e questo è abbastanza grave, alterarli o al limite distruggerli in modo più o meno completo.

Si può ovviare a ciò mediante un'opzione ormai inserita da qualche anno nei nuovi Bios: la possibilità di inserire una password e permettere il boot direttamente dal disco fisso evitando il floppy. Nella mia macchina, la possibilità di avviare il sistema operativo dal disco fisso è sotto l'opzione ``Bios Features Setup''. Già che ci siamo, possiamo anche definire il tipo di protezione del Bios: infatti se il Bios è accessibile a chiunque, a cosa serve proteggere contro l'avvio da floppy? Impostiamo quindi una password dal menù principale del Bios, e sempre sotto ``Bios Features Setup'' dovrebbe esserci l'opzione per definire il tipo di azione della password: ad ogni accensione o all'accesso al Bios. Se il sistema deve essere avviato anche da alcune persone autorizzate, ma volete che queste non accedano al Bios, dovete impostare la protezione password solo sul setup. Non preoccupatevi: potete inserire comunque tutte le password che volete più avanti.

Fase 2: LILO

A questo punto la sicurezza dell'avvio è nelle mani del codice presente nel Master Boot Record del primo disco fisso. Nel caso di un sistema Linux nel MBR c'è LILO.

LILO permette di fare molte cose all'avvio della macchina: permette di scegliere quale sistema operativo avviare, se ce ne sono diversi nella macchina, avviare un kernel specifico, se ce ne sono alcuni disponibili, passare alcuni parametri al kernel, mostrare un messaggio a video, chiedere una password. E proprio questo è quello che ci interessa.

Intanto bisogna definire come deve essere avviato il sistema: ci siete sempre voi all'accensione, oppure il sistema deve avviarsi da solo, ma volete impedire che qualcuno lo possa avviare in modalità single-user, oppure alcune persone autorizzate lo possono avviare ma non con pieni poteri? Sta a voi decidere... tutto è possibile.

Vediamo intanto quali sono le possibilità che uno possa accedere al sistema: se il sistema non si avvia automaticamente quando viene acceso, ma c'è una password o altro, può essere un buon deterrente verso chi potrebbe prendere la brutta abitudine di spegnere il sistema senza le dovute precauzioni (shutdown) o resettarlo con l'apposito pulsante se la macchina sembrasse piantata. Dopo uno o due tentativi falliti una persona furba preferisce lasciar stare e chiamare l'amministratore.

Un'altra situazione pericolosa è quando qualcuno blocca l'avvio del kernel per passarci alcuni parametri aggiuntivi, come single oppure root=/dev/fd0. In questo modo, dopo i test di avvio, uno può ottenere la shell di root a sua disposizione oppure avviare un sistema a parte dal dischetto con cui accedere al sistema senza la necessità di conoscere la password di root. A questo punto è facile accedere al file /etc/passwd e azzerare la password di root.

Ma il LILO può essere più furbo! Infatti, sfruttando il fatto che oltre al MBR c'è anche il settore di avvio della partizione di root, si possono aggiungere anche altre due password, che si aggiungono alla password del Bios e alla password di root!

Le opzioni che ci interessano sono: password, restricted ed eventualmente message e prompt.

Nota: se inserite la password nel file di configurazione di LILO, dovete impostare a -rw------- i permessi del relativo file di configurazione (chmod 600 <file>), in modo che nessuno possa andare a leggersela! Comunque LILO si accorge di questo e vi avvisa di una simile situazione pericolosa.

Caso 1: avvio riservato

Questo è il caso dell'avvio e/o reboot esclusivo dell'amministratore: viene chiesta una password, e quindi solo l'amministratore può autorizzare il boot del sistema.

Per fare questo basta inserire nel file di configurazione la riga password = "codice", e al posto di codice inserite la password voluta. Reinstallate quindi LILO. Potete usare anche il file di configurazione di LILO generato all'installazione e apportare l'aggiunta della riga password.

Caso 2: avvio libero ma protetto

Questo caso si può applicare in tutte le occasioni in cui la macchina deve avviarsi senza l'intervento dell'amministratore, ma in modo che nessuno possa avviare il sistema in single-user o con un root filesystem da dischetto.

Per fare questo si deve aggiungere la riga restricted nel file di configurazione di LILO oltre alla riga password (vedi il caso precedente). Con restricted la password viene chiesta solamente se qualcuno tenda di passare altri parametri al kernel, quindi non è più possibile impadronirsi del sistema all'accensione da parte di estranei. In mancanza di tale password il sistema potraà avviarsi solamente in modo normale (multiutenza).

Caso 3: massima protezione

Questo l'ho applicato nella mia parrocchia: il parroco e un'altra persona fidata possono avviare la macchina, tramite una password, mentre per avviarla in single-user ci vuole una seconda password, che so soltanto io, oltre, ovviamente, alla password del Bios e di root.

Per fare questo ho usato un sistema un po' più lungo, ma funzionante. Ho sfruttato il fatto che oltre al MBR esiste il settore di avvio anche della partizione di root! In pratica viene avviato il LILO contenuto nel MBR. Questo visualizza un messaggio di presentazione e il modo di contattare l'amministratore (numero telefonico) e quindi chiede la password di avvio. Se la password è corretta viene avviato un sistema operativo generico presente nella prima partizione. Nel settore di avvio della prima partizione c'è un altro LILO, diverso dal precedente, che se non interrotto carica immediatamente il kernel con i parametri standard senza password. Se però questo viene interrotto dalla pressione dei tasti [shift], [ctrl] o [alt], permette di passare ulteriori parametri al kernel, in questo caso chiedendo una ulteriore password.

Vediamo in dettaglio questi file. Questo è il file di configurazione relativo al MBR.


# /etc/lilo.hda
boot = /dev/hda
message = /boot/message
prompt
vga = normal
ramdisk = 0
password = "password_di_avvio"
other = /dev/hda1
label = linux

Le righe 3 e 4 (message e prompt) definiscono un file di testo contenenti informazioni sul sistema e chi contattare in caso di problemi. Il comando prompt forza la visualizzazione del messaggio anche senza la pressione di [shift], [ctrl] o [alt]. Il sistema da avviare è definito come un sistema generico (other) che si trova nella prima partizione (la partizione di root, /dev/hda1) e non un kernel. Il kernel viene avviato da un altro LILO.

Ecco l'altro file di configurazione:


# /etc/lilo.hda1
boot = /dev/hda1
vga = normal
ramdisk = 0
image = /zImage
  root = /dev/hda1
  password = "password_riservata"
  restricted
  read-only # Non-UMSDOS filesystems should be mounted read-only for checking
  append = "ether=5,0x300,eth0"

Dentro questo file ci sono tutte le impostazioni del kernel, oltre all'impostazione della password e all'opzione restricted. Notare nella seconda riga come LILO debba installarsi nella prima partizione (/dev/hda1) e non nel MBR. In questo file vanno messi tutti i parametri da passare al kernel (riga append).

Attenzione: la prima volta che installate una configurazione simile dovete installare prima la configurazione della partizione di root, in quanto se LILO non trova un sistema operativo nelle partizioni indicate in other si rifiuta di compiere l'installazione. I comandi sono:

lilo -C /etc/hda1
lilo -C /etc/hda
Adesso il sistema si avvia in modo sicuro: nessuno può accedere al sistema. Procuratevi sempre comunque dei dischi di emergenza, che comunque possono essere usati solo sbloccando temporaneamente nel Bios il boot da disco fisso (e quindi conoscendo la password del Bios).