Le jails di FreeBSD sono l'implementazione a livello di sistema operativo di un meccanismo di virtualizzazione che permette di ottenere da una macchina reale una serie di macchine virtuali indipendenti e isolate. Grazie alle jails è possibile ottimizzare la gestione di un server, creare un ambiente di test per applicazioni, migliorare la sicurezza del sistema.
Un po' di teoria
Le jails derivano e sono un miglioramento degli ambienti chroot creati tramite l'utilizzo dell'omonima utility chroot (change root), la quale permette di cambiare la directory di root ad un gruppo di processi in modo da avere un ambiente sicuro e isolato dal resto del sistema (l'ambiente principale ove è caricato il sistema operativo e che permette di creare gli ambienti chroot è chiamato host). I processi eseguiti all'interno di un ambiente chroot non possono accedere a risorse esterne a questo; così se un servizio in ambiente chroot dovesse venire compromesso da un malintenzionato, questi non potrebbe essere in grado di manomettere l'host o gli altri ambienti chroot (l'attacco viene circoscritto alla sola chroot).
Purtroppo gli ambienti chroot non sono completamente isolati infatti i processi dell'ambiente chroot condividono con i processi dell'host l'insieme degli utenti, parte del file-system e il sottosistema di rete. Nelle jails questo non avviene infatti ognuna di esse è caratterizzata da:
- Directory: la cartella che rappresenta per la jail il punto di root, quando si entra nella jail equivale a "/". Quando un processo della jail viene avviato
- Hostname -- l'hostname che sarà usato all'interno della jail. Le jail sono principalmente usate per ospitare servizi di rete, quindi avere un nome host descrittivo per ogni jail può veramente aiutare l'amministratore di sistema.
- Indirizzo IP -- questo sarà assegnato alla jail e non può essere cambiato in alcun modo durante l'arco di vita della jail. L'indirizzo IP di una jail è in genere un indirizzo alias di un'interfaccia di rete esistente, anche se questo non è strettamente necessario.
- Comando -- il percorso di un eseguibile da avviare all'interno della jail. Questo è relativo alla directory root dell'ambiente della jail, e può variare molto, a seconda del tipo specifico di ambiente della jail.
Le jails, inoltre, permettono di "partizionare" la macchina host in un insieme di macchine virtuali basate su FreeBSD, con ognuna la propria collezione di ports e la propria configurazione.
Configurazione Iniziale
Per configurare le jails è possibile farlo seguendo seguendo la guida ufficiale di FreeBSD, ma è sicuramente meglio usare l'utility ezjail la quale permette di gestire ogni aspetto delle jails in maniera più rapida e semplice. Con ezjail si avrà inoltre un notevole risparmio di spazio su disco visto che permette di condividere in sola lettura le parti comuni del sistema operativo.
Il primo passo è quindi installare ezjail:
# portmaster sysutils/ezjail
Il secondo passo è configurare gli IP alias, infatti ogni jail necessita di almeno un indirizzo IP dedicato. Per fare questo basterà configurarli nel file /etc/rc.conf, ad esempio:
ifconfig_em0="inet 192.168.1.10 netmask 255.255.255.0" ifconfig_em0_alias0="inet 192.168.1.20 netmask 255.255.255.0" ifconfig_em0_alias1="inet 192.168.1.21 netmask 255.255.255.0" ifconfig_em0_alias2="inet 192.168.1.22 netmask 255.255.255.0" ...
Dopodichè bisogna configurare i servizi attivi (ssh, sendmail, syslog, ecc.) sull'host affinchè non restino in ascolto su tutte le porte.
Infine bisogna abilitare ezjail al boot aggiungendo a /etc/rc.conf la riga:
ezjail_enable="YES"
Configurazione di ezjail
Ora dobbiamo creare la jail di base su cui si appoggeranno tutte le jails, sostanzialmente è come fare un'installazione di FreeBSD secondaria. Possiamo scegliere di crearla dai sorgenti lanciando il comando:
# ezjail-admin update -i -p
oppure, anche per fare più in fretta, se non abbiamo esigenze particolari possiamo usare la versione binaria direttamente dal repository di FreeBSD:
# ezjail-admin install -p -r 8.1-RELEASE
Da notare che in entrambi i casi è stato usata l'opzione -p, quest'ultima serve per installare la collezione dei ports nella jail di base. L'opzione -r serve invece per specificare quale release di FreeBSD utilizzare (ovviamente deve essere la stessa del sistema host!).
Possiamo aggiungere dei flavour, che sono delle configurazioni personalizzate per le jail (ad esempio make.conf, resolv.conf, rc.conf con determinate impostazioni). Utilizzare i flavours è fortemente consigliato, soprattutto nel caso di jails con caratteristiche molto simili. Comunque per creare un flavour è possibile usare quello di esempio:
# cp -r /usr/jails/flavours/example /usr/jails/flavours/default # cp /etc/resolv.conf /usr/jails/flavours/default/etc/
dopodichè modifichiamo i files che ci interessano nella directory del flavour appena creato. La configurazione base di ezjail è finita.
Creazione di una jail
Possiamo creare una jail lanciando il comando:
# ezjail-admin create -f default web.intranet.net 192.168.1.20
dove l'opzione -f specifica il flavour da utilizzare (in questo caso default), web.intranet.net è l'hostname e il nome della jail e 192.168.1.20 è l'indirizzo ip assegnato a questa jail. Ora non resta che avviarla:
# /usr/local/etc/rc.d/ezjail.sh start web.intranet.net
ora dobbiano "entrare" all'interno della jail, ma prima dobbiamo conoscere il suo JID; per scoprirlo basta lanciare il comando:
# ezjail-admin list STA JID IP Hostname Root Directory --- ---- --------------- ------------------------------ ------------------------ DR 1 192.168.1.20 web.intranet.net /usr/jails/web DR 2 192.168.1.21 plone.intranet.net /usr/jails/plone
il suo JID è 1. Quindi per entrare all'interno della jail usiamo il comando jexec:
# jexec 1 csh
e siamo all'interno della jail. Ora possiamo possiamo passare alla configurazione dell'ambiente della jail e si procede come comunemente si opera su una normale installazione di FreeBSD. In particolare bisognerà avere cura di configurare la password di root, un utente di login e il demone ssh per il login remoto.
Ad ogni jail è possibile assegnare più di un indirizzo IP, al momento della creazione basta specificare tutti gli indirizzi da assegnare separati da una virgola; ad esempio:
# ezjail-admin create -f default plone.intranet.net 192.168.1.21,192.168.1.22,192.168.1.23
Infine è possibile specificare un fstab per ogni jail, basterà modificare il file /etc/fstab.<nomejail> (al momento della creazione della jail questo file viene automaticamente creato).
Aggiornamento delle jail
L'aggiornamento delle jail è strutturato in due fasi, la prima fase è quella di aggiornare la base jail e la collezione dei ports, mentre la seconda è quella di aggiornare i ports in ogni jail. Per aggiornare la base jail e l'albero dei ports di una installazione dai sorgenti il comando è il seguente:
# ezjail-admin update -i -p
mentre nel caso di una base jail ottenuta dai binari del repository ufficiale:
# ezjail-admin update -u -p
dopodichè si potranno aggiornare i ports in ogni jail.
Eliminazione di una jail
Può succedere che una jail non sia più necessaria quindi si può procedere alla sua eliminazione. Il primo passo è quello di fermare l'esecuzione della jail da eliminare:
# /usr/local/etc/rc.d/ezjail.sh stop plone.intranet.net
poi possiamo passare alla sua eliminazione:
# ezjail-admin delete -w plone.intranet.net
il parametro -w serve per eliminare tutti i files della jail eliminata. Omettendo -w la jail verrà eliminata dalla configurazione di avvio di ezjail, ma i suoi files rimarranno su /usr/jail/<nomejail>.
Conclusioni
Quelle presentate sino ad ora sono le operazioni forndamentali per la gestione delle jail, come sempre è possibile fare molto di più come archiviare e ripristinare una jail, creare una jail cifrata, sospendere e riattivare una jail; tutte operazioni che veranno spiegate prossimamente in altre guide. Per ora per qualsiasi informazione si può far riferimento alle pagine man di ezjail-admin.




