proc /proc proc defaults 0 0
/dev/hda1 none swap sw 0 0
/dev/hda5 / ext2 ro,defaults,errors=remount-ro 0 1
/dev/hda2 /boot ext2 ro,nosuid,noexec,nodev,nouser 0 3
/dev/hda7 /var reiserfs rw,nosuid,nodev,nouser 0 3
/dev/hda8 /home reiserfs rw,nosuid,nodev,nouser 0 3
dove nosuid indica al kernel di non eseguire programmi con privilegi suid, noexec di non
eseguire alcun programma, nodev di non consentire la creazione di dispositivi
e infine nouser di non permettere agli utenti di montare o smontare la partizione indicata.Attenzione però che la vostra distribuzione potrebbe non essere troppo contenta di avere a che fare con dischi readonly, soprattutto per quanto riguarda la root. Una soluzione che ho visto funzionare abbastanza bene (salvo qualche directory) é stata quella di scrivere due script, mkro e mkrw, il primo per rendere la root read only ed il secondo per renderla read write, e di installarli in modo che venissero eseguiti rispettivamente come l'ultimo comando a startup ed il primo comando a shutdown. In Debian, è possibile fare questo copiando i due file nella directory /etc/init.d e dando i comandi ``update-rc.d mkro start 99 2'' e ``update-rc.d mkrw stop 00 6''.
Così facendo, la partizione di root dovrebbe essere indicata come ``rw'' nel file fstab.
Notate inoltre che in /var viene consentita l'esecuzione di programmi: questo perché la maggior parte delle distribuzioni utilizzano /var per conservare gli script di installazione/disinstallazione dei vari pacchettini che devono essere eseguiti.
Infine, attenzione che la partizione che contiene la directory /dev deve essere montata come rw... una buona soluzione é quella di utilizzare o una partizione a parte, o una partizione creata da un ramdisk o shm, oppure utilizzare il devfs con il demone devfsd (soluzione sicuramente migliore).
Per quanto riguarda /tmp, questa viene utilizzata da molti programmi e deve quindi essere scrivibile. Sempre che non abbiate creato una partizione indipendente per /tmp, una soluzione potrebbe essere quella di creare un symlink /tmp a /var/tmp, oppure sfruttare le nuove capacità del kernel 2.4 aggiungendo da qualche parte nei file eseguiti all'avvio un comando del tipo:
mount --bind /var/tmp /tmp
che monterebbe in maniera molto particolare (estremamente simile ad un hard link) la directory
/var/tmp su /tmp. Attenzione però che il FHS (lo standard per
la struttura del file system), indica che in /tmp i file possono essere rimossi
in qualsiasi istante dall'amministratore del sistema, e consiglia di ripulire /tmp durante i
reboot. Al contrario, /var/tmp non deve essere ripulita durante i reboot e deve consentire la
creazione di file ``abbastanza persistenti''. Per evitare problemi con la vostra distribuzione,
è quindi consigliabile far puntare /tmp ad una sottodirectory di /var/tmp in
modo che un'eventuale pulizia periodica di /tmp non rimuova tutti i file di /var/tmp.
Per esempio, potreste fare qualcosa del tipo:
mkdir /var/tmp/removable/
mount --bind /var/tmp/removable/ /tmp
Piuttosto che
mkdir /var/tmp/removable/
cd /; ln -s /var/tmp/removable ./tmp
Infine, parlando di partizioni read only o read write, è bene dedicare un minimo di
attenzione al file /etc/mtab. In questo file viene mantenuto l'elenco delle
partizioni montate col comando ``mount''. In pratica, quando date il comando ``mount'' da
solo, per vedere le partizioni montate, vi viene mostrato il contenuto di questo file.
Il problema è che montando la root read only, mount non sarà in
grado di aggiornare questo file e di capire quali partizioni sono montate, dando origine a
degli errori piuttosto bizzarri. Una buona soluzione è quella di eliminare il file
mtab completamente e di creare un link simbolico in /etc che punti al file
/proc/mounts. Questo file mostra le informazione conosciute dal kernel a proposito dei
dischi montati, e non può quindi contenere errori. In pratica date:
cd /etc
rm ./mtab
ln -s /proc/mounts ./mtab
Current capabilities: 0xFFFFFEFF
0) *CAP_CHOWN 1) *CAP_DAC_OVERRIDE
2) *CAP_DAC_READ_SEARCH 3) *CAP_FOWNER
4) *CAP_FSETID 5) *CAP_KILL
6) *CAP_SETGID 7) *CAP_SETUID
8) CAP_SETPCAP 9) *CAP_LINUX_IMMUTABLE
10) *CAP_NET_BIND_SERVICE 11) *CAP_NET_BROADCAST
12) *CAP_NET_ADMIN 13) *CAP_NET_RAW
14) *CAP_IPC_LOCK 15) *CAP_IPC_OWNER
16) *CAP_SYS_MODULE 17) *CAP_SYS_RAWIO
18) *CAP_SYS_CHROOT 19) *CAP_SYS_PTRACE
20) *CAP_SYS_PACCT 21) *CAP_SYS_ADMIN
22) *CAP_SYS_BOOT 23) *CAP_SYS_NICE
24) *CAP_SYS_RESOURCE 25) *CAP_SYS_TIME
26) *CAP_SYS_TTY_CONFIG
* = Capabilities currently allowed
Ad esempio, con ``lcap CAP_CHOWN'' il kernel mollerebbe la capacità di far andare la
chiamata di sistema CHOWN, rendendo impossibile il cambio di proprietario di un file.
Eseguendo quindi il comando ``chown'', questo ci restituirebbe un errore del tipo ``Operation
not permitted''. In breve, disattivare la capacità del kernel:
#!/bin/bash
lcap CAP_NET_BIND_SERVICE CAP_NET_ADMIN CAP_SYS_MODULE CAP_SYS_PACCT \
CAP_SYS_RESOURCE CAP_SETUID CAP_LINUX_IMMUTABLE CAP_NET_RAW CAP_SYS_RAWIO \
CAP_SYS_PTRACE CAP_SYS_ADMIN
in modo da disabilitare la maggior parte delle funzioni che potrebbero risultare
pericolose. Allo stesso modo, utilizzando il comando ``chattr +i'' si potrebbero
impostare come immutabili tutti i file coinvolti con il processo di boot, così
da impedire che il sistema possa essere riavviato senza chiamare ``lcap''.
Per avere ancora una maggior sicurezza, si potrebbe poi disabilitare il ``reboot''
del sistema, in modo che da remoto, anche ipotizzando che un attaccante possa
riuscire a far sì che lcap non venga chiamato nel prossimo reboot, il
sistema non possa essere riavviato senza la presenza fisica di una persona
in sala macchine. In più, lasciare la capacità CAP_NET_ADMIN
e CAP_NET_RAW impedirà all'attaccante di installare degli sniffer che
impostino l'interfaccia in promiscuous mode ed il cambio delle regole di
firewalling. Questo stesso script, potrebbe poi essere inserito in ``runlevel 2'', creando un link da /etc/rc2.d/S99-lcap a /etc/init.d/script_appena_creato, in modo che specificando qualcosa come ``runlevel=3'' dal prompt di lilo e di grub sia possibile accedere al sistema senza i limiti imposti da questo comando.