973 lines
43 KiB
XML
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> —
|
|
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; 4.X da &a.phk;, ma furono
|
|
notevolmente migliorate in &os; 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 — 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 — 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> — 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 — 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í via. Tutto è fatto nello stile tipico di
|
|
&os; — 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 — 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 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>
|