<?xml version="1.0" encoding="iso-8859-15"?>
<!--
    The FreeBSD Italian Documentation Project

    $FreeBSD$
    Original revision: 1.14
-->

<chapter id="jails">
  <chapterinfo>
    <authorgroup>
      <author>
        <firstname>Matteo</firstname>

        <surname>Riondato</surname>

        <contrib>Grazie al contributo di </contrib>
      </author>
    </authorgroup>
  </chapterinfo>

  <title>Jail</title>

  <indexterm><primary>jail</primary></indexterm>

  <sect1 id="jails-synopsis">
    <title>Sinossi</title>

    <para>Questo capitolo fornirà una spiegazione di cosa
      siano le jail in &os; e di come usarle.  Le jail, definite
      a volte come una miglioria
      dell'<emphasis>ambiente chroot</emphasis>, sono un strumento molto
      potente per amministratori di sistema, ma il loro uso
      può essere utile anche per utenti avanzati.</para>

    <para>Dopo aver letto questo capitolo, saprai:</para>

    <itemizedlist>
      <listitem>
        <para>Cosa è una jail e a quale scopi può servire
          nelle installazioni di &os;.</para>
      </listitem>

      <listitem>
        <para>Come creare, avviare e fermare una jail.</para>
      </listitem>

      <listitem>
        <para>Le basi per l'amministrazione delle jail, sia
          dall'interno che dall'esterno di una jail.</para>
      </listitem>
    </itemizedlist>

    <para>Altre fonti di informazioni utili a proposito delle jail sono:</para>

    <itemizedlist>
      <listitem>
        <para>La pagina man &man.jail.8;.  Questo è un riferimento
          completo dell'utility <command>jail</command> &mdash;
          il tool di amministrazione che può essere usato in &os;
          per avviare, fermare e controllare le jail in &os;.</para>
      </listitem>

      <listitem>
        <para>Le mailing list ed i loro archivi.  Gli archivi della
          &a.questions; ed altre mailing list ospitate sul &a.mailman.lists;
          contengono già una varietà di materiale per le jail.
          Si dovrebbe sempre cercare negli archivi, o inviare
          una nuova domanda alla mailing list &a.questions.name;.</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1 id="jails-terms">
    <title>Termini Relativi alle Jail</title>

    <para>Per facilitare una migliore comprensione delle parti di &os;
      relative alle jail, i loro meandri ed il modo in cui interagiscono
      con il resto di &os;, i seguenti termini saranno usati più avanti
      in questo capitolo:</para>

    <variablelist>
      <varlistentry>
        <term>&man.chroot.2; (comando)</term>

        <listitem>
          <para>Una chiamata di sistema di &os;, che cambia la directory root
            di un processo e di tutti i suoi discendenti.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term>&man.chroot.2; (ambiente)</term>

        <listitem>
          <para>L'ambiente di un processo eseguito con <quote>chroot</quote>.
            Sono incluse le risorse come la parte del file system visibile,
            ID di utenti e di gruppi che sono disponibili, interfacce di rete,
            altri meccanismi di IPC, ecc.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term>&man.jail.8; (comando)</term>

        <listitem>
          <para>L'utility di amministrazione di sistema che permette di
            eseguire processi all'interno di una jail.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term>host (sistema, processo, utente, ecc.)</term>

        <listitem>
          <para>Il sistema di controllo di una jail.  Il sistema host ha accesso
            a tutte le risorse hardware disponibili, e può controllare
            processi sia all'interno che al di fuori di una jail.
            Una delle differenze importanti di un sistema host rispetto a una
            jail è che le limitazioni applicate ai processi superuser
            dentro una jail non sono valide per i processi del sistema
            host.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term>hosted (sistema, processo, utente, ecc.)</term>

        <listitem>
          <para>Un processo, utente o altra entità, che abbia l'accesso
            alle risorse, limitato da una jail di &os;.</para>
        </listitem>
      </varlistentry>
    </variablelist>
  </sect1>

  <sect1 id="jails-intro">
    <title>Introduzione</title>

    <para>Dato che l'amministrazione di sistema è un compito
      difficile e gravoso, sono stati sviluppati molti strumenti potenti per
      rendere la vita più semplice per l'amministratore.
      Questi strumenti forniscono aiuti di vario genere nel modo in cui i
      sistemi sono installati, configurati e quindi manutenuti.  Parte dei
      compiti che un amministratore dovrebbe fare riguarda la corretta
      configurazione nell'ambito della sicurezza di un sistema, in modo tale
      da continuare a servire il suo vero intento, senza permettere
      violazioni di sistema.</para>

    <para>Uno degli strumenti che possono essere usati per migliorare
      la sicurezza di &os; sono le <emphasis>jail</emphasis>.
      Le jail furono introdotte con &os;&nbsp;4.X da &a.phk;, ma furono
      notevolmente migliorate in &os;&nbsp;5.X per renderle un sottosistema
      potente e flessibile.  Il loro sviluppo continua per migliorare
      la loro utilità, le prestazioni e la sicurezza.</para>

    <sect2 id="jails-what">
      <title>Cosa è una Jail</title>

      <para>I sistemi operativi BSD-like hanno avuto il &man.chroot.2;
        dai tempi di 4.2BSD.  L'utility &man.chroot.2; può
        essere usata per cambiare la directory root di un insieme di processi,
        creando un ambiente sicuro e separato dal resto del sistema.
        I processi creati nell'ambiente chroot non possono accedere a file o
        risorse fuori da questo.  Per questa ragione, compromettere un servizio
        che viene eseguito in un ambiente chroot non dovrebbe permettere
        all'attaccante di compromettere l'intero sistema.  L'utility
        &man.chroot.2; è utile per compiti semplici, che non richiedono
        molta flessibilità o caratteristiche complesse e avanzate.
        Tuttavia, dall'inizio del concetto di chroot, sono stati trovati
        diversi modi per uscire da un ambiente chroot, e, benchè
        siano stati fixati nelle versioni moderne del kernel di &os;,
        è diventato chiaro che &man.chroot.2; non era la soluzione
        ideale per rendere sicuri i servizi.  Un nuovo sottosistema
        doveva essere implementato.</para>

      <para>Queste sono alcune delle ragioni principali per
        cui le <emphasis>jail</emphasis> sono state sviluppate.</para>

      <para>Le jail migliorano il concetto dell'ambiente &man.chroot.2;
        tradizionale, in molti modi.  In un ambiente &man.chroot.2;
        tradizionale, i processi sono limitati solo nella porzione di file
        system che possono accedere.  Il resto delle risorse di sistema
        (come l'insieme di utenti di sistema, i processi in esecuzione, o il
        sotto-sistema di rete) sono condivise dai processi in chroot e dai
        processi del sistema host (quelli non inseriti in un ambiente chroot).
        Le jail espandono questo modello virtualizzando non solo l'accesso al
        file system, ma anche l'insieme di utenti, il sotto-sistema di rete del
        kernel di &os; e alcune altre cose.  Un più completo insieme
        di controlli disponibili per calibrare l'accesso ad un ambiente jail
        è descritto nella <xref linkend="jails-tuning"/>.</para>

      <para>Una jail è caratterizzata da quattro elementi:</para>

      <itemizedlist>
        <listitem>
          <para>Un sotto-ramo di una directory &mdash; il punto di partenza
            da cui si entra nella jail.  Una volta all'interno
            della jail, ad un processo non è permesso di
            uscire da questo sotto-ramo.  Le questioni tradizionali
            di sicurezza che colpiscono il design di &man.chroot.2; originale
            non affliggono le jail di &os;.</para>
        </listitem>

        <listitem>
          <para>Un hostname &mdash; 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.</para>
        </listitem>

        <listitem>
          <para>Un indirizzo <acronym>IP</acronym> &mdash; 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.</para>
        </listitem>

        <listitem>
          <para>Un comando &mdash; 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.</para>
        </listitem>
      </itemizedlist>

      <para>Oltre a queste caratteristiche, le jail possono avere
        il loro insieme di utenti ed il loro utente <username>root</username>.
        Naturalmente, i poteri dell'utente <username>root</username> sono
        limitati all'interno dell'ambiente jail e, dal punto di vista del
        sistema host, l'utente <username>root</username> della jail non è
        il superuser.  Inoltre, l'utente <username>root</username> di una jail
        non potrà eseguire operazioni critiche sul sistema al di fuori
        del suo ambiente &man.jail.8;.  Altre informazioni sui poteri e sulle
        restrizioni dell'utente <username>root</username> saranno discusse
        nella <xref linkend="jails-tuning"/>.</para>
    </sect2>
  </sect1>

  <sect1 id="jails-build">
    <title>Creare e Controllare la Jail</title>

    <para>Alcuni amministratori dividono le jail nei seguenti due tipi:
      jail <quote>complete</quote>, che sono simili ad un sistema &os; reale,
      e jail <quote>di servizio</quote>, dedicate ad un'unica applicazione
      o servizio, possibilmente in esecuzione con privilegi.  Questa è
      solo una divisione concettuale ed il processo di creazione della
      jail non viene modificato da ciò.  La pagina man &man.jail.8;
      è abbastanza chiara a riguardo della procedura di creazione di una
      jail:</para>

    <screen>&prompt.root; <userinput>setenv D <replaceable>/qui/c'e'/la/jail</replaceable></userinput>
&prompt.root; <userinput>mkdir -p $D</userinput> <co id="jailpath"/>
&prompt.root; <userinput>cd /usr/src</userinput>
&prompt.root; <userinput>make world DESTDIR=$D</userinput> <co id="jailworld"/>
&prompt.root; <userinput>cd etc/</userinput> <footnote><para>Questo step non
è richiesto su &os; 6.0 e successivi.</para></footnote>
&prompt.root; <userinput>make distribution DESTDIR=$D</userinput> <co id="jaildistrib"/>
&prompt.root; <userinput>mount_devfs devfs $D/dev</userinput> <co id="jaildevfs"/></screen>

    <calloutlist>
      <callout arearefs="jailpath">
        <para>Selezionare una directory per la jail è
          il miglior punto in cui iniziare.  Questo sarà il punto
          in cui la jail risiederà fisicamente nel file system del
          sistema host.  Una buona scelta può essere
          <filename class="directory">/usr/jail/<replaceable>nomejail</replaceable></filename>,
          dove <replaceable>nomejail</replaceable> è il nome host
          che identifica la jail.  Il file system
          <filename class="directory">/usr/</filename> in genere ha abbastanza
          spazio vuoto per il file system delle jail, che per una
          jail <quote>completa</quote> è, in pratica, una replica di
          ogni file presente in una installazione base di &os;</para>
      </callout>

      <callout arearefs="jailworld">
        <para>Questo comando popolerà la sotto-directory
          scelta come locazione fisica della jail con
          i binari necessari, le librerie, le pagine man
          e cos&iacute; via.  Tutto è fatto nello stile tipico di
          &os; &mdash; prima tutto viene creato/compilato, poi installato
          nel percorso di destinazione.</para>
      </callout>

      <callout arearefs="jaildistrib">
        <para>Il target <maketarget>distribution</maketarget> per
          <application>make</application> installa ogni file di
          configuazione richiesto.  In parole povere, installa ogni
          file di
          <filename class="directory">/usr/src/etc/</filename> nella
          directory <filename class="directory">/etc</filename>
          dell'ambiente jail:
          <filename class="directory">$D/etc/</filename>.</para>
      </callout>

      <callout arearefs="jaildevfs">
        <para>Non è richiesto di montare il file system &man.devfs.8;
          all'interno della jail.  D'altro lato, ogni applicazione o quasi ha
          bisogno di accedere ad almeno un dispositivo, a seconda dello scopo
          dell'applicazione stessa.  È molto importante controllare
          l'accesso ai dispositivi dall'interno della jail, dato che con
          dei settaggi impropri un attaccante potrebbe compiere azioni dannose
          nella jail.  Il controllo su &man.devfs.8; è gestito attraverso
          le regole che sono descritte nelle pagine man di &man.devfs.8; e
          &man.devfs.conf.5;.</para>
      </callout>
    </calloutlist>

    <para>Una volta che una jail è installata, può essere
      avviata usando l'utility &man.jail.8;.  L'utility &man.jail.8;
      prende quattro argomenti obbligatori che sono descritti nella
      <xref linkend="jails-what"/>.  Possono essere specificati altri argomenti,
      ad esempio, per eseguire il programma nella jail con le credenziali
      di un utente specifico.  L'argomento
      <option><replaceable>comando</replaceable></option>
      dipende dal tipo di jail; per un <emphasis>sistema virtuale</emphasis>,
      <filename>/etc/rc</filename> è una buona scelta, dato che
      replicherà la sequenza di avvio di un sistema &os; reale.
      Per una jail <emphasis>di servizio</emphasis>, dipenderà
      dal servizio o dalla applicazione che sarà eseguita
      all'interno della jail.</para>

    <para>Le jail spesso sono avviate al momento di boot
      e il meccanismo <filename>rc</filename> di &os; fornisce
      un modo semplice per farlo.</para>

    <procedure>
      <step>
        <para>Una lista delle jail che sono abilitate al boot
          dovrebbe essere aggiunta al file &man.rc.conf.5;:</para>

        <programlisting>jail_enable="YES"   # NO per disabilitare l'avvio delle jail
jail_list="<replaceable>www</replaceable>"  # Lista dei nomi delle jail separati da spazi</programlisting>
      </step>

      <step>
        <para>Per ogni jail elencata in <varname>jail_list</varname>,
          dovrebbe essere aggiunto un gruppo di impostazioni di &man.rc.conf.5;,
          che descrive la jail:</para>

  <programlisting>jail_<replaceable>www</replaceable>_rootdir="/usr/jail/www"     # directory root della jail
jail_<replaceable>www</replaceable>_hostname="<replaceable>www</replaceable>.example.org"  # nome-host della jail
jail_<replaceable>www</replaceable>_ip="192.168.0.10"           # indirizzo IP della jail
jail_<replaceable>www</replaceable>_devfs_enable="YES"          # dispositivi di mount devfs nella jail
jail_<replaceable>www</replaceable>_devfs_ruleset="<replaceable>www_ruleset</replaceable>" # regole devfs da applicare alla jail</programlisting>

        <para>L'avvio di default delle jail configurate in
          &man.rc.conf.5; eseguirà lo script
          della jail in <filename>/etc/rc</filename>, che assume che la
          jail sia un completo sistema virtuale.  Per jail di servizio,
          il comando di default di avvio della jail dovrebbe essere cambiato,
          impostando l'opzione
          <varname>jail_<replaceable>nomejail</replaceable>_exec_start</varname>
          in modo appropriato.</para>

        <note>
          <para>Per una lista completa delle opzioni disponibili, per favore
            consulta la pagina man &man.rc.conf.5;.</para>
        </note>
      </step>
    </procedure>

    <para>Lo script <filename>/etc/rc.d/jail</filename> può
      essere usato per avviare o fermare una jail a mano, se esiste una entry
      in <filename>rc.conf</filename>:</para>

    <screen>&prompt.root; <userinput>/etc/rc.d/jail start <replaceable>www</replaceable></userinput>
&prompt.root; <userinput>/etc/rc.d/jail stop <replaceable>www</replaceable></userinput></screen>

    <para>Un modo pulito per spegnere una &man.jail.8; non è disponibile
      al momento.  Questo perchè i comandi usati normalmente per fare
      uno shutdown pulito non possono essere usati all'interno della jail.
      Il modo migliore per spegnere una jail è eseguire il seguente
      comando all'interno della jail stessa o usando l'utility &man.jexec.8;
      da fuori della jail:</para>

    <screen>&prompt.root; <userinput>sh /etc/rc.shutdown</userinput></screen>

    <para>Maggiori informazioni al riguardo possono essere trovate nella
      pagina man &man.jail.8;.</para>
  </sect1>

  <sect1 id="jails-tuning">
    <title>Messa a Punto ed Amministrazione</title>

    <para>Ci sono molte opzioni che possono essere impostate per ogni jail,
      e molti modi di combinare un sistema &os; con le jail, per produrre
      applicazioni di alto livello.  Questa sezione presenta:</para>

    <itemizedlist>
      <listitem>
        <para>Alcune delle opzioni disponibili per impostare il comportamento
          e le restrizioni di sicurezza implementate da una installazione di
          una jail.</para>
      </listitem>

      <listitem>
        <para>Alcune degli applicativi di alto livello per la gestione
          delle jail, che sono disponibili attraverso la Collezione
          dei Port di &os;, e possono essere usate per implementare
          soluzioni complete basate sulle jail.</para>
      </listitem>
    </itemizedlist>

    <sect2 id="jails-tuning-utilities">
      <title>Strumenti di sistema per mettere a punto una jail in &os;</title>

      <para>La messa a punto di una configurazione di una jail è
        principalmente fatta settando variabili &man.sysctl.8;.
        Esiste un sotto-ramo speciale di sysctl con tutte
        le opzioni del caso: la gerarchia <varname>security.jail.*</varname>
        delle opzioni del kernel di &os;.  Qui c'è una lista
        delle principali opzioni di sysctl relative alle jail, con il loro
        valori di default.  I nomi dovrebbero essere auto
        esplicativi, ma per maggiori informazioni riguardo questi, per favore
        fai riferimento alle pagine man &man.jail.8; e &man.sysctl.8;.</para>

      <itemizedlist>
        <listitem>
          <para><varname>security.jail.set_hostname_allowed: 1</varname></para>
        </listitem>

        <listitem>
          <para><varname>security.jail.socket_unixiproute_only:
            1</varname></para>
        </listitem>

        <listitem>
          <para><varname>security.jail.sysvipc_allowed: 0</varname></para>
        </listitem>

        <listitem>
          <para><varname>security.jail.enforce_statfs: 2</varname></para>
        </listitem>

        <listitem>
          <para><varname>security.jail.allow_raw_sockets: 0</varname></para>
        </listitem>

        <listitem>
          <para><varname>security.jail.chflags_allowed: 0</varname></para>
        </listitem>

        <listitem>
          <para><varname>security.jail.jailed: 0</varname></para>
        </listitem>
      </itemizedlist>

      <para>Queste variabili possono essere usate dall'amministratore di
        sistema del <emphasis>sistema host</emphasis> per aggiungere o
        rimuovere alcune delle limitazioni imposte di default all'utente
        <username>root</username>.  Nota che ci sono alcune limitazioni
        che non possono essere rimosse.  L'utente <username>root</username>
        non ha il permesso di montare o smontare file system all'interno
        della &man.jail.8;.  L'utente <username>root</username> all'interno
        della jail non può caricare o scaricare regole di
        &man.devfs.8;, impostare regole del firewall, o compiere
        molti altri compiti di amministrazione che richiedono modifiche
        in kernel, come impostare il <varname>securelevel</varname>
        del kernel.</para>

      <para>Il sistema base di &os; contiene un insieme di base di strumenti
        per vedere informazioni a proposito delle jail attive, e per
        attaccarsi ad una jail per eseguire compiti amministrativi.
        Il comando &man.jail.8; e &man.jexec.8; sono parte del sistema
        base di &os;, e possono essere usati per eseguire i seguenti semplici
        compiti:</para>

      <itemizedlist>
        <listitem>
          <para>Stampa una lista di jail attive e i loro corrispondenti
            identificativi di jail (<acronym>JID</acronym>),
            indirizzo <acronym>IP</acronym>, nome host e percorso.</para>
        </listitem>

        <listitem>
          <para>Attaccarsi ad una jail in esecuzione, dal suo sistema
            host, ed eseguire un comando o compiti amministrativi dall'interno
            della jail stessa.  Questo è specialmente utile quando
            l'utente <username>root</username> vuole spegnere in modo pulito
            una jail.  L'utility &man.jexec.8; può anche essere usata
            per avviare una shell in una jail per fare dell'amministrazione;
            ad esempio:</para>

          <screen>&prompt.root; <userinput>jexec <replaceable>1</replaceable> tcsh</userinput></screen>
        </listitem>
      </itemizedlist>
    </sect2>

    <sect2 id="jails-tuning-admintools">
      <title>Strumenti di amministrazione di alto livello nella
        Collezione dei Ports di &os;</title>

      <para>Fra le tante utility di terze parti per l'amministrazione
        delle jail, uno dei più completi ed utili è
        <filename role="package">sysutils/jailutils</filename>.  È
        un insieme di piccoli applicativi che contribuiscono alla gestione
        delle &man.jail.8;.  Per favore fai riferimento alla corrispondente
        pagina web per maggiori informazioni.</para>
    </sect2>
  </sect1>

  <sect1 id="jails-application">
    <title>Applicazioni di Jail</title>

    <sect2 id="jails-service-jails">
      <sect2info>
        <authorgroup>
          <author>
            <firstname>Daniel</firstname>

            <surname>Gerzo</surname>

            <contrib>Contributo di  </contrib>
          </author>
        </authorgroup>
      </sect2info>

      <title>Servizi Jail</title>

      <para>Questa sezione è basata su un'idea di &a.simon; (<ulink
        url="http://simon.nitro.dk/service-jails.html"></ulink>), e su un
        articolo scritto da by Ken Tom <email>locals@gmail.com</email>.
        Questa sezione illustra come configurare un sistema &os; aggiungendo
        uno strato di sicurezza addizionale, usando le funzionalità
        delle &man.jail.8;.  Inoltre questa sezione assume che la versione
        &os; del sistema sia almeno la RELENG_6_0 e che siano state capite le
        informazioni fornite precedentemente nel capitolo.</para>

      <sect3 id="jails-service-jails-design">
        <title>Progetto</title>

        <para>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.</para>

        <warning>
          <para>Questa configurazione richiede una esperienza avanzata con
            &os;.  Se i procedimenti seguenti risultano troppo complicati, si
            consiglia di dare un'occhiata a un sistema più intuitivo
            come <filename role="package">sysutils/ezjail</filename>, che
            fornisce un modo semplice di amministrare le jail in &os; e non
            è sofisticato come questa configurazione.</para>
        </warning>

        <para>Questa idea è stata presentata per risolvere
          il problema di condividere quanto più possibile tra le jail,
          in modo sicuro &mdash; usando &man.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.</para>

        <note>
          <para>Esempi di servizi in questo contesto sono: un server
            <acronym>HTTP</acronym>, un server <acronym>DNS</acronym>,
            un server <acronym>SMTP</acronym>, e via dicendo.</para>
        </note>

        <para>Gli scopi di configurazione descritti in questa sezione
          sono:</para>

        <itemizedlist>
          <listitem>
            <para>Comprendere la struttura jail.  Questo implica di
            <emphasis>not</emphasis> dovere eseguire un installworld completo
            per ogni jail.</para>
          </listitem>

          <listitem>
            <para>Semplificare l'aggiunta di una nuova jail o la rimozione
              di una esistente.</para>
          </listitem>

          <listitem>
            <para>Semplificare l'aggiornamento o la modifica di una jail
              esistente.</para>
          </listitem>

          <listitem>
            <para>Rende possibile l'esecuzione di un &os; su misura.</para>
          </listitem>

          <listitem>
            <para>Essere paranoici sulla sicurezza, riducendo quanto più
              possibile la possibilità di mettere a repentaglio il
              sistema.</para>
          </listitem>

          <listitem>
            <para>Salvare spazio e inode, quanto più possibile.</para>
          </listitem>
        </itemizedlist>

        <para>Come già menzionato, questa configurazione si basa
          pesantemente nell'avere un unico template master che è in sola
          lettura (conosciuto come <application>nullfs</application>) 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 &man.md.4;.  In questo esempio,
          useremo un <application>nullfs</application> in lettura e
          scrittura.</para>

        <para>Viene qui descritto il layout del file system:</para>

        <itemizedlist>
          <listitem>
            <para>Ogni jail sarà montata sotto la directory
              <filename class="directory">/home/j</filename>.</para>
          </listitem>

          <listitem>
            <para><filename class="directory">/home/j/mroot</filename> è
              il template per ogni jail e la partizione in sola lettura per
              tutte le jail.</para>
          </listitem>

          <listitem>
            <para>Una directory vuota sarà creata per ogni jail sotto
            la directory <filename class="directory">/home/j</filename>.</para>
          </listitem>

          <listitem>
            <para>Ogni jail avrà una directory <filename
                class="directory">/s</filename>, che sarà linkata
              alla porzione del sistema in lettura e scrittura.</para>
          </listitem>

          <listitem>
            <para>Ogni jail ha il suo sistema in lettura e scrittura in
              <filename class="directory">/home/j/skel</filename>.</para>
          </listitem>

          <listitem>
            <para>Ogni spazio di jail (la porzione in lettura e scrittura di
              ogni jail) sarà creato in <filename
                class="directory">/home/js</filename>.</para>
          </listitem>
        </itemizedlist>

        <note>
          <para>Si assume che le jail siano posizionate sotto la partizione
          <filename class="directory">/home</filename>.  Di sicuro, questo
          può essere modificato con qualcosa di diverso, ma questo
          cambiamento dovrà essere tenuto in considerazione
          negli esempi più avanti.</para>
        </note>
      </sect3>

      <sect3 id="jails-service-jails-template">
        <title>Creare il Template</title>

        <para>Questa sezione descrive le fasi necessarie per creare il
          template di riferimento che sarà la parte in sola lettura
          utilizzate dalle jail.</para>

        <para>È sempre una buona idea aggiornare &os; al branch -RELEASE
          più recente.  Per farlo, consulta il
          <ulink url="&url.books.handbook;/makeworld.html">capitolo</ulink>
          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
          <filename role="package">sysutils/cpdup</filename>.
          Useremo l'utility &man.portsnap.8; per scaricare la
          &os; Ports Collection.  Il <ulink
            url="&url.books.handbook;/portsnap.html">Capitolo Portsnap</ulink>
          dell'handbook è sempre una buona lettura per i nuovi
          arrivati.</para>

        <procedure>
          <step>
            <para>Primo, creiamo la struttura della directory per il file
              system in sola lettura che conterrà i binari di &os;
              per le nostre jail, quindi portiamoci nel ramo della directory
              dei sorgenti di &os; e installiamo il file system in sola
              lettura per il template delle jail:</para>

            <screen>&prompt.root; <userinput>mkdir /home/j /home/j/mroot</userinput>
&prompt.root; <userinput>cd /usr/src</userinput>
&prompt.root; <userinput>make installworld DESTDIR=/home/j/mroot</userinput></screen>
          </step>

          <step>
            <para>Quindi, prepariamo la &os; Ports Collection per le jail
              così come abbiamo fatto per l'alberatura dei sorgenti,
              richiesta per <application>mergemaster</application>:</para>

            <screen>&prompt.root; <userinput>cd /home/j/mroot</userinput>
&prompt.root; <userinput>mkdir usr/ports</userinput>
&prompt.root; <userinput>portsnap -p /home/j/mroot/usr/ports fetch extract</userinput>
&prompt.root; <userinput>cpdup /usr/src /home/j/mroot/usr/src</userinput></screen>
          </step>

          <step>
            <para>Creiamo lo scheletro per la parte del sistema in
              lettura e scrittura:</para>

            <screen>&prompt.root; <userinput>mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles</userinput>
&prompt.root; <userinput>mv etc /home/j/skel</userinput>
&prompt.root; <userinput>mv usr/local /home/j/skel/usr-local</userinput>
&prompt.root; <userinput>mv tmp /home/j/skel</userinput>
&prompt.root; <userinput>mv var /home/j/skel</userinput>
&prompt.root; <userinput>mv root /home/j/skel</userinput></screen>
          </step>

          <step>
            <para>Usiamo <application>mergemaster</application> per installare
              i file di configurazione mancanti.  Quindi liberiamoci delle
              directory extra che <application>mergemaster</application> ha
              creato:</para>

            <screen>&prompt.root; <userinput>mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i</userinput>
&prompt.root; <userinput>cd /home/j/skel</userinput>
&prompt.root; <userinput>rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev</userinput></screen>
          </step>

          <step>
            <para>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
              <filename class="directory">s/</filename>.  La creazione di
              directory in posti sbagliati causerà un fallimento
              durante l'installazione.</para>

            <screen>&prompt.root; <userinput>cd /home/j/mroot</userinput>
&prompt.root; <userinput>mkdir s</userinput>
&prompt.root; <userinput>ln -s s/etc etc</userinput>
&prompt.root; <userinput>ln -s s/home home</userinput>
&prompt.root; <userinput>ln -s s/root root</userinput>
&prompt.root; <userinput>ln -s ../s/usr-local usr/local</userinput>
&prompt.root; <userinput>ln -s ../s/usr-X11R6 usr/X11R6</userinput>
&prompt.root; <userinput>ln -s ../../s/distfiles usr/ports/distfiles</userinput>
&prompt.root; <userinput>ln -s s/tmp tmp</userinput>
&prompt.root; <userinput>ln -s s/var var</userinput></screen>
          </step>

          <step>
            <para>Come ultima fase, creiamo un generico
              <filename>/home/j/skel/etc/make.conf</filename> con
              il seguente contenuto:</para>

            <programlisting>WRKDIRPREFIX?=  /s/portbuild</programlisting>

            <para>Avendo settato <literal>WRKDIRPREFIX</literal> in questo modo
              sarà possibile compilare i port di &os; all'interno
              di ogni jail.  Ricordati che la directory dei port è
              parte del sistema in sola lettura.  Il percorso ad doc di
              <literal>WRKDIRPREFIX</literal> permette di compilare nella
              porzione in lettura e scrittura di ogni jail.</para>
          </step>
        </procedure>
      </sect3>

      <sect3 id="jails-service-jails-creating">
        <title>Creazione di Jail</title>

        <para>Ora che abbiamo completato il template della jail, possiamo
          configurare le jail in
          <filename>/etc/rc.conf</filename>.  Questo esempio mostra
          la creazione di 3 jail: <quote>NS</quote>,
          <quote>MAIL</quote> e <quote>WWW</quote>.</para>

        <procedure>
          <step>
            <para>Inseriamo le seguenti righe nel file
              <filename>/etc/fstab</filename>, in modo tale che
              il template in sola lettura per le jail e lo spazio
              in lettura e scrittura sarà disponibile
              nella rispettive jail:</para>

            <programlisting>/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</programlisting>

            <note>
              <para>Le partizioni con uno 0 come numero di pass non
                sono verificate da &man.fsck.8; durante il boot, e le partizioni
                con uno 0 come numero di dump non sono prese in considerazione
                da &man.dump.8;.  Non si vuole che
                <application>fsck</application> verifichi i mount
                <application>nullfs</application> o che
                <application>dump</application> faccia un backup dei mount
                nullfs in sola lettura delle jail.  Ecco perchè
                queste partizioni hanno <quote>0&nbsp;0</quote> nelle ultime
                due colonne di ogni riga di
                <filename>fstab</filename> sopra mosrate.</para>
            </note>
          </step>

          <step>
            <para>Configuriamo le jail in
              <filename>/etc/rc.conf</filename>:</para>

              <programlisting>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"</programlisting>

              <warning>
                <para>La ragione del perchè la variabile
                  <varname>jail_<replaceable>nome</replaceable>_rootdir</varname>
                  è settata a <filename
                    class="directory">/usr/home</filename> invece di
                  <filename class="directory">/home</filename> è che
                  il percorso reale della directory <filename
                    class="directory">/home</filename> in una installazione
                  standard di &os; è <filename
                    class="directory">/usr/home</filename>.  La variabile
                  <varname>jail_<replaceable>nome</replaceable>_rootdir</varname>
                  <emphasis>non</emphasis> deve essere settata a un percorso
                  che include link simbolici, altrimenti la jail
                  rifiuterà di partire.  Usa l'utility &man.realpath.1;
                  per determinare il valore che questa variabile dovrebbe
                  assumere.  Per favore da un occhio al Security Advisory
                  &os;-SA-07:01.jail per maggiorni informazioni.</para>
              </warning>
            </step>

          <step>
            <para>Creiamo i punti di mount richiesti per il file system
              in sola lettura di ogni jail:</para>

            <screen>&prompt.root; <userinput>mkdir /home/j/ns /home/j/mail /home/j/www</userinput></screen>
          </step>

          <step>
            <para>Installiamo il template in lettura e scrittura
              in ciascuna jail.  Notare l'utilizzo di <filename
                role="package">sysutils/cpdup</filename>, che assicura
              una corretta copia di ogni directory:</para>

            <screen>&prompt.root; <userinput>mkdir /home/js</userinput>
&prompt.root; <userinput>cpdup /home/j/skel /home/js/ns</userinput>
&prompt.root; <userinput>cpdup /home/j/skel /home/js/mail</userinput>
&prompt.root; <userinput>cpdup /home/j/skel /home/js/www</userinput></screen>
          </step>

          <step>
            <para>In questa fase, le jail sono preparate per essere eseguite.
              Montiamo il file system richiesto per ogni jail, e quindi
              avviamole con lo script
              <filename>/etc/rc.d/jail</filename>:</para>

            <screen>&prompt.root; <userinput>mount -a</userinput>
&prompt.root; <userinput>/etc/rc.d/jail start</userinput></screen>
          </step>
        </procedure>

        <para>Le jail dovrebbero essere in esecuzione.  Per verificare che
          siano state avviate correttamente, usiamo il comando &man.jls.8;.
          Il suo output dovrebbe essere simile al seguente:</para>

        <screen>&prompt.root; <userinput>jls</userinput>
   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</screen>

        <para>A questo punto, dovrebbe essere possibile entrare in ciascuna
          jail, aggiungere nuovi utenti o configurare demoni.  La colonna
          <literal>JID</literal> indica il numero identificativo
          di ciascuna jail in esecuzione.  Usa il comando seguente per
          effettuare compiti amministrativi nella jail con
          <literal>JID</literal> 3:</para>

        <screen>&prompt.root; <userinput>jexec 3 tcsh</userinput></screen>
      </sect3>

      <sect3 id="jails-service-jails-upgrading">
        <title>Aggiornamento</title>

        <para>Il tempo passa, e sarà necessario aggiornare il sistema
          a una nuova versione di &os;, 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.</para>

        <procedure>
          <step>
            <para>Il primo passo è aggiornare il sistema host nella
              maniera usuale.  Quindi creiamo un template temporaneo
              in sola lettura in <filename
                class="directory">/home/j/mroot2</filename>.</para>

            <screen>&prompt.root; <userinput>mkdir /home/j/mroot2</userinput>
&prompt.root; <userinput>cd /usr/src</userinput>
&prompt.root; <userinput>make installworld DESTDIR=/home/j/mroot2</userinput>
&prompt.root; <userinput>cd /home/j/mroot2</userinput>
&prompt.root; <userinput>cpdup /usr/src usr/src</userinput>
&prompt.root; <userinput>mkdir s</userinput></screen>

            <para>Il processo di <maketarget>installworld</maketarget> crea
              alcune directory non necessarie, che possono essere
              rimosse:</para>

            <screen>&prompt.root; <userinput>chflags -R 0 var</userinput>
&prompt.root; <userinput>rm -R etc var root usr/local tmp</userinput></screen>
          </step>

          <step>
            <para>Ricreiamo i link simbolici in lettura e scrittura
              per il file system di riferimento:</para>

            <screen>&prompt.root; <userinput>ln -s s/etc etc</userinput>
&prompt.root; <userinput>ln -s s/root root</userinput>
&prompt.root; <userinput>ln -s s/home home</userinput>
&prompt.root; <userinput>ln -s ../s/usr-local usr/local</userinput>
&prompt.root; <userinput>ln -s ../s/usr-X11R6 usr/X11R6</userinput>
&prompt.root; <userinput>ln -s s/tmp tmp</userinput>
&prompt.root; <userinput>ln -s s/var var</userinput></screen>
          </step>

          <step>
            <para>È questo il momento per fermare le jail:</para>

            <screen>&prompt.root; <userinput>/etc/rc.d/jail stop</userinput></screen>
          </step>

          <step>
            <para>Smontiamo il file system originale:</para>

            <screen>&prompt.root; <userinput>umount /home/j/ns/s</userinput>
&prompt.root; <userinput>umount /home/j/ns</userinput>
&prompt.root; <userinput>umount /home/j/mail/s</userinput>
&prompt.root; <userinput>umount /home/j/mail</userinput>
&prompt.root; <userinput>umount /home/j/www/s</userinput>
&prompt.root; <userinput>umount /home/j/www</userinput></screen>

            <note>
              <para>I sistemi in lettura e scrittura sono attaccati al
                sistema in sola lettura
                (<filename class="directory">/s</filename>) e devono essere
                smontati.</para>
            </note>
          </step>

          <step>
            <para>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 &os; Ports Collection originale nel nuovo file system
              per risparmiare spazio e inode:</para>

            <screen>&prompt.root; <userinput>cd /home/j</userinput>
&prompt.root; <userinput>mv mroot mroot.20060601</userinput>
&prompt.root; <userinput>mv mroot2 mroot</userinput>
&prompt.root; <userinput>mv mroot.20060601/usr/ports mroot/usr</userinput></screen>
          </step>

          <step>
            <para>A questo punto il nuovo template in sola lettura è
              pronto, quindi ci rimare di rimontare il file system e
              avviare le jail:</para>

            <screen>&prompt.root; <userinput>mount -a</userinput>
&prompt.root; <userinput>/etc/rc.d/jail start</userinput></screen>
          </step>
        </procedure>

        <para>Usa &man.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.</para>
      </sect3>
    </sect2>
  </sect1>
</chapter>