doc/it_IT.ISO8859-15/books/handbook/jails/chapter.xml
2013-11-07 15:39:28 +00:00

973 lines
43 KiB
XML

<?xml version="1.0" encoding="iso-8859-15"?>
<!--
The FreeBSD Italian Documentation Project
$FreeBSD$
Original revision: 1.14
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="jails">
<info><title>Jail</title>
<authorgroup>
<author><personname><firstname>Matteo</firstname><surname>Riondato</surname></personname><contrib>Grazie al contributo di </contrib></author>
</authorgroup>
</info>
<indexterm><primary>jail</primary></indexterm>
<sect1 xml: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 xml: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 xml: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 xml: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 <systemitem class="username">root</systemitem>.
Naturalmente, i poteri dell'utente <systemitem class="username">root</systemitem> sono
limitati all'interno dell'ambiente jail e, dal punto di vista del
sistema host, l'utente <systemitem class="username">root</systemitem> della jail non è
il superuser. Inoltre, l'utente <systemitem class="username">root</systemitem> 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 <systemitem class="username">root</systemitem> saranno discusse
nella <xref linkend="jails-tuning"/>.</para>
</sect2>
</sect1>
<sect1 xml: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 /qui/c'e'/la/jail</userinput>
&prompt.root; <userinput>mkdir -p $D</userinput> <co xml:id="jailpath"/>
&prompt.root; <userinput>cd /usr/src</userinput>
&prompt.root; <userinput>make world DESTDIR=$D</userinput> <co xml: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 xml:id="jaildistrib"/>
&prompt.root; <userinput>mount_devfs devfs $D/dev</userinput> <co xml: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>/usr/jail/nomejail</filename>,
dove <replaceable>nomejail</replaceable> è il nome host
che identifica la jail. Il file system
<filename>/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 <buildtarget>distribution</buildtarget> per
<application>make</application> installa ogni file di
configuazione richiesto. In parole povere, installa ogni
file di
<filename>/usr/src/etc/</filename> nella
directory <filename>/etc</filename>
dell'ambiente jail:
<filename>$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 www</userinput>
&prompt.root; <userinput>/etc/rc.d/jail stop www</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 xml: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 xml: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
<systemitem class="username">root</systemitem>. Nota che ci sono alcune limitazioni
che non possono essere rimosse. L'utente <systemitem class="username">root</systemitem>
non ha il permesso di montare o smontare file system all'interno
della &man.jail.8;. L'utente <systemitem class="username">root</systemitem> 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 <systemitem class="username">root</systemitem> 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 1 tcsh</userinput></screen>
</listitem>
</itemizedlist>
</sect2>
<sect2 xml: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 è
<package>sysutils/jailutils</package>. È
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 xml:id="jails-application">
<title>Applicazioni di Jail</title>
<sect2 xml:id="jails-service-jails">
<info><title>Servizi Jail</title>
<authorgroup>
<author><personname><firstname>Daniel</firstname><surname>Gerzo</surname></personname><contrib>Contributo di </contrib></author>
</authorgroup>
</info>
<para>Questa sezione è basata su un'idea di &a.simon; (<uri xlink:href="http://simon.nitro.dk/service-jails.html">http://simon.nitro.dk/service-jails.html</uri>), 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 xml: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 <package>sysutils/ezjail</package>, 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>/home/j</filename>.</para>
</listitem>
<listitem>
<para><filename>/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>/home/j</filename>.</para>
</listitem>
<listitem>
<para>Ogni jail avrà una directory <filename>/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>/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>/home/js</filename>.</para>
</listitem>
</itemizedlist>
<note>
<para>Si assume che le jail siano posizionate sotto la partizione
<filename>/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 xml: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
<link xlink:href="&url.books.handbook;/makeworld.html">capitolo</link>
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
<package>sysutils/cpdup</package>.
Useremo l'utility &man.portsnap.8; per scaricare la
&os; Ports Collection. Il <link xlink:href="&url.books.handbook;/portsnap.html">Capitolo Portsnap</link>
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>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 xml: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>/usr/home</filename> invece di
<filename>/home</filename> è che
il percorso reale della directory <filename>/home</filename> in una installazione
standard di &os; è <filename>/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 <package>sysutils/cpdup</package>, 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 xml: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>/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 <buildtarget>installworld</buildtarget> 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>/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>