15.6 Applicazioni di Jail

15.6.1 Servizi Jail

Contributo di Daniel Gerzo.

Questa sezione è basata su un'idea di Simon L. Nielsen (http://simon.nitro.dk/service-jails.html), e su un articolo scritto da by Ken Tom . 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.

15.6.1.1 Progetto

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.

Avvertimento: 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.

Nota: 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.

Nota: 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.

15.6.1.2 Creare il Template

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.

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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
    
  6. 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.

15.6.1.3 Creazione di 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”.

  1. 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
    

    Nota: 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.

  2. 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"
    

    Avvertimento: La ragione del perchè la variabile jail_nome_rootdir è settata a /usr/home invece di /home è che il percorso reale della directory /home in una installazione standard di FreeBSD è /usr/home. La variabile jail_nome_rootdir 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.

  3. 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
    
  4. 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
    
  5. 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

15.6.1.4 Aggiornamento

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.

  1. 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
    
  2. 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
    
  3. È questo il momento per fermare le jail:

    # /etc/rc.d/jail stop
    
  4. 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
    

    Nota: I sistemi in lettura e scrittura sono attaccati al sistema in sola lettura (/s) e devono essere smontati.

  5. 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
    
  6. 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>.