Questa sezione è basata su un'idea di Simon L. B. Nielsen (http://simon.nitro.dk/service-jails.html
), e su un
articolo scritto da by Ken Tom <locals@gmail.com>
.
Questa sezione illustra come configurare un sistema FreeBSD aggiungendo
uno strato di sicurezza addizionale, usando le funzionalità
delle jail(8). Inoltre questa sezione assume che la versione
FreeBSD del sistema sia almeno la RELENG_6_0 e che siano state capite le
informazioni fornite precedentemente nel capitolo.
Uno dei maggiori problemi delle jail è la gestione del loro processo di aggiornamento. Questo tende a essere un problema poichè ciascuna jail deve essere ricostruita da zero ogni volta che deve essere aggiornata. Di solito questo non è un problema per una jail singola, poichè il processo di aggiornamento è abbastanza semplice, ma se sono create tante jail può diventare un processo lungo e tedioso.
Questa configurazione richiede una esperienza avanzata con FreeBSD. Se i procedimenti seguenti risultano troppo complicati, si consiglia di dare un'occhiata a un sistema più intuitivo come sysutils/ezjail, che fornisce un modo semplice di amministrare le jail in FreeBSD e non è sofisticato come questa configurazione.
Questa idea è stata presentata per risolvere il problema di condividere quanto più possibile tra le jail, in modo sicuro - usando mount_nullfs(8) in sola lettura, affinchè l'aggiornamento sia semplice, e per fare diventare più allettante mettere singoli servizi in jail individuali. Inoltre, si fornisce un modo per creare, aggiornare e rimuovere jail.
Esempi di servizi in questo contesto sono: un server HTTP, un server DNS, un server SMTP, e via dicendo.
Gli scopi di configurazione descritti in questa sezione sono:
Comprendere la struttura jail. Questo implica di not dovere eseguire un installworld completo per ogni jail.
Semplificare l'aggiunta di una nuova jail o la rimozione di una esistente.
Semplificare l'aggiornamento o la modifica di una jail esistente.
Rende possibile l'esecuzione di un FreeBSD su misura.
Essere paranoici sulla sicurezza, riducendo quanto più possibile la possibilità di mettere a repentaglio il sistema.
Salvare spazio e inode, quanto più possibile.
Come già menzionato, questa configurazione si basa pesantemente nell'avere un unico template master che è in sola lettura (conosciuto come nullfs) montato in ogni jail e un dispositivo in lettura-scrittura per jail. Il dispositivo può essere un disco fisico separato, una partizione, o un dispositivo vnode md(4). In questo esempio, useremo un nullfs in lettura e scrittura.
Viene qui descritto il layout del file system:
Ogni jail sarà montata sotto la directory
/home/j
.
/home/j/mroot
è
il template per ogni jail e la partizione in sola lettura per
tutte le jail.
Una directory vuota sarà creata per ogni jail sotto
la directory /home/j
.
Ogni jail avrà una directory /s
, che sarà linkata
alla porzione del sistema in lettura e scrittura.
Ogni jail ha il suo sistema in lettura e scrittura in
/home/j/skel
.
Ogni spazio di jail (la porzione in lettura e scrittura di
ogni jail) sarà creato in /home/js
.
Si assume che le jail siano posizionate sotto la partizione
/home
. Di sicuro, questo
può essere modificato con qualcosa di diverso, ma questo
cambiamento dovrà essere tenuto in considerazione
negli esempi più avanti.
Questa sezione descrive le fasi necessarie per creare il template di riferimento che sarà la parte in sola lettura utilizzate dalle jail.
È sempre una buona idea aggiornare FreeBSD al branch -RELEASE più recente. Per farlo, consulta il capitolo di riferimento dell'Handbook. Nel caso che l'aggiornamento non sia fattibile, sarà necessaria la procedura di buildworld per poter procedere. Inoltre, è richiesto il pacchetto sysutils/cpdup. Useremo l'utility portsnap(8) per scaricare la FreeBSD Ports Collection. Il Capitolo Portsnap dell'handbook è sempre una buona lettura per i nuovi arrivati.
Primo, creiamo la struttura della directory per il file system in sola lettura che conterrà i binari di FreeBSD per le nostre jail, quindi portiamoci nel ramo della directory dei sorgenti di FreeBSD e installiamo il file system in sola lettura per il template delle jail:
#
mkdir /home/j /home/j/mroot
#
cd /usr/src
#
make installworld DESTDIR=/home/j/mroot
Quindi, prepariamo la FreeBSD Ports Collection per le jail così come abbiamo fatto per l'alberatura dei sorgenti, richiesta per mergemaster:
#
cd /home/j/mroot
#
mkdir usr/ports
#
portsnap -p /home/j/mroot/usr/ports fetch extract
#
cpdup /usr/src /home/j/mroot/usr/src
Creiamo lo scheletro per la parte del sistema in lettura e scrittura:
#
mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles
#
mv etc /home/j/skel
#
mv usr/local /home/j/skel/usr-local
#
mv tmp /home/j/skel
#
mv var /home/j/skel
#
mv root /home/j/skel
Usiamo mergemaster per installare i file di configurazione mancanti. Quindi liberiamoci delle directory extra che mergemaster ha creato:
#
mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i
#
cd /home/j/skel
#
rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev
Ora, linkiamo in modo simbolico il file system in lettura
e scrittura nel file system di sola lettura. Assicuriamoci
che i link simbolici siano creati nelle posizioni corrette in
s/
. La creazione di
directory in posti sbagliati causerà un fallimento
durante l'installazione.
#
cd /home/j/mroot
#
mkdir s
#
ln -s s/etc etc
#
ln -s s/home home
#
ln -s s/root root
#
ln -s ../s/usr-local usr/local
#
ln -s ../s/usr-X11R6 usr/X11R6
#
ln -s ../../s/distfiles usr/ports/distfiles
#
ln -s s/tmp tmp
#
ln -s s/var var
Come ultima fase, creiamo un generico
/home/j/skel/etc/make.conf
con
il seguente contenuto:
WRKDIRPREFIX?= /s/portbuild
Avendo settato WRKDIRPREFIX
in questo modo
sarà possibile compilare i port di FreeBSD all'interno
di ogni jail. Ricordati che la directory dei port è
parte del sistema in sola lettura. Il percorso ad doc di
WRKDIRPREFIX
permette di compilare nella
porzione in lettura e scrittura di ogni jail.
Ora che abbiamo completato il template della jail, possiamo
configurare le jail in
/etc/rc.conf
. Questo esempio mostra
la creazione di 3 jail: «NS»,
«MAIL» e «WWW».
Inseriamo le seguenti righe nel file
/etc/fstab
, in modo tale che
il template in sola lettura per le jail e lo spazio
in lettura e scrittura sarà disponibile
nella rispettive jail:
/home/j/mroot /home/j/ns nullfs ro 0 0 /home/j/mroot /home/j/mail nullfs ro 0 0 /home/j/mroot /home/j/www nullfs ro 0 0 /home/js/ns /home/j/ns/s nullfs rw 0 0 /home/js/mail /home/j/mail/s nullfs rw 0 0 /home/js/www /home/j/www/s nullfs rw 0 0
Le partizioni con uno 0 come numero di pass non
sono verificate da fsck(8) durante il boot, e le partizioni
con uno 0 come numero di dump non sono prese in considerazione
da dump(8). Non si vuole che
fsck verifichi i mount
nullfs o che
dump faccia un backup dei mount
nullfs in sola lettura delle jail. Ecco perchè
queste partizioni hanno «0 0» nelle ultime
due colonne di ogni riga di
fstab
sopra mosrate.
Configuriamo le jail in
/etc/rc.conf
:
jail_enable="YES" jail_set_hostname_allow="NO" jail_list="ns mail www" jail_ns_hostname="ns.example.org" jail_ns_ip="192.168.3.17" jail_ns_rootdir="/usr/home/j/ns" jail_ns_devfs_enable="YES" jail_mail_hostname="mail.example.org" jail_mail_ip="192.168.3.18" jail_mail_rootdir="/usr/home/j/mail" jail_mail_devfs_enable="YES" jail_www_hostname="www.example.org" jail_www_ip="62.123.43.14" jail_www_rootdir="/usr/home/j/www" jail_www_devfs_enable="YES"
La ragione del perchè la variabile
jail_
è settata a nome
_rootdir/usr/home
invece di
/home
è che
il percorso reale della directory /home
in una installazione
standard di FreeBSD è /usr/home
. La variabile
jail_
non deve essere settata a un percorso
che include link simbolici, altrimenti la jail
rifiuterà di partire. Usa l'utility realpath(1)
per determinare il valore che questa variabile dovrebbe
assumere. Per favore da un occhio al Security Advisory
FreeBSD-SA-07:01.jail per maggiorni informazioni.nome
_rootdir
Creiamo i punti di mount richiesti per il file system in sola lettura di ogni jail:
#
mkdir /home/j/ns /home/j/mail /home/j/www
Installiamo il template in lettura e scrittura in ciascuna jail. Notare l'utilizzo di sysutils/cpdup, che assicura una corretta copia di ogni directory:
#
mkdir /home/js
#
cpdup /home/j/skel /home/js/ns
#
cpdup /home/j/skel /home/js/mail
#
cpdup /home/j/skel /home/js/www
In questa fase, le jail sono preparate per essere eseguite.
Montiamo il file system richiesto per ogni jail, e quindi
avviamole con lo script
/etc/rc.d/jail
:
#
mount -a
#
/etc/rc.d/jail start
Le jail dovrebbero essere in esecuzione. Per verificare che siano state avviate correttamente, usiamo il comando jls(8). Il suo output dovrebbe essere simile al seguente:
#
jls
JID IP Address Hostname Path 3 192.168.3.17 ns.example.org /home/j/ns 2 192.168.3.18 mail.example.org /home/j/mail 1 62.123.43.14 www.example.org /home/j/www
A questo punto, dovrebbe essere possibile entrare in ciascuna
jail, aggiungere nuovi utenti o configurare demoni. La colonna
JID
indica il numero identificativo
di ciascuna jail in esecuzione. Usa il comando seguente per
effettuare compiti amministrativi nella jail con
JID
3:
#
jexec 3 tcsh
Il tempo passa, e sarà necessario aggiornare il sistema a una nuova versione di FreeBSD, vuoi per questioni di sicurezza, o perchè sono state implementate nuove funzionalità che ritornano utili per le jail esistenti. Di seguito si fornisce un modo semplice per effettuare l'aggiornamento delle jail esistenti. Inoltre, questo metodo minimizza il tempo in cui le jail non sono in esecuzione, poichè le jail saranno disattivate solo per un breve periodo. Questa procedura fornisce un modo per ritornare indietro alle vecchie versioni nel caso qualcosa vada storto.
Il primo passo è aggiornare il sistema host nella
maniera usuale. Quindi creiamo un template temporaneo
in sola lettura in /home/j/mroot2
.
#
mkdir /home/j/mroot2
#
cd /usr/src
#
make installworld DESTDIR=/home/j/mroot2
#
cd /home/j/mroot2
#
cpdup /usr/src usr/src
#
mkdir s
Il processo di installworld
crea
alcune directory non necessarie, che possono essere
rimosse:
#
chflags -R 0 var
#
rm -R etc var root usr/local tmp
Ricreiamo i link simbolici in lettura e scrittura per il file system di riferimento:
#
ln -s s/etc etc
#
ln -s s/root root
#
ln -s s/home home
#
ln -s ../s/usr-local usr/local
#
ln -s ../s/usr-X11R6 usr/X11R6
#
ln -s s/tmp tmp
#
ln -s s/var var
È questo il momento per fermare le jail:
#
/etc/rc.d/jail stop
Smontiamo il file system originale:
#
umount /home/j/ns/s
#
umount /home/j/ns
#
umount /home/j/mail/s
#
umount /home/j/mail
#
umount /home/j/www/s
#
umount /home/j/www
I sistemi in lettura e scrittura sono attaccati al
sistema in sola lettura
(/s
) e devono essere
smontati.
Muovi il file system in sola lettura e rimpiazzalo con quello nuovo. Il vecchio file system in sola lettura servirà da backup in caso qualcosa dovesse andare storto. La convenzione dei nomi qui utilizzata corrisponde a quella utilizzata quando fu creato il file system in sola lettura. Muovi la FreeBSD Ports Collection originale nel nuovo file system per risparmiare spazio e inode:
#
cd /home/j
#
mv mroot mroot.20060601
#
mv mroot2 mroot
#
mv mroot.20060601/usr/ports mroot/usr
A questo punto il nuovo template in sola lettura è pronto, quindi ci rimare di rimontare il file system e avviare le jail:
#
mount -a
#
/etc/rc.d/jail start
Usa jls(8) per verificare che le jail sono state avviate correttamente. Non dimenticare di eseguire mergemaster in ciascuna jail. I file di configurazione dovranno essere aggiornati così come gli script rc.d.
Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Per domande su FreeBSD, leggi la
documentazione prima di contattare
<questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a
<doc@FreeBSD.org>.