<appendix id="harden-step">Il processo di blindatura passo-passo


<!--
# I took the liberty to change this from "checklist" to
# "process step by step" because this doesn't really have the
# form of a checklist, and I had added a different sort of
# checklist. The renaming is more to avoid confusion than
# anything else. // era
-->

<p>Di seguito viene riportata una procedura passo-passo, 
post-installazione, per blindare un sistema Debian GNU/linux 2.2. 
Questo è un possibile approccio a tale procedura ed è orientato a 
blindare i servizi di rete. Viene incluso per mostrare 
l'intero processo che potrebbe essere usato durante la 
configurazione. Vedete in <ref id="checklist">.

<list>

<item>Installate il sistema, tenendo in considerazione le informazioni
che riguardano il partizionamento incluse precedentemente in questo
documento. Dopo l'installazione di base, andate alla configurazione
personalizzata. Non selezionate i pacchetti dei servizi.
Selezionate le password shadow.
<item>Utilizzando <prgn>dselect</prgn>, rimuovete tutti i pacchetti selezionati
ma non necessari prima di effettuare l'installazione con il comando
[I]nstall. Mantenete il minimo numero di pacchetti per il sistema.
<item>Aggiornate tutti i programmi dal più recente pacchetto disponibile
da security.debian.org come spiegato precedentemente in
<ref id="security-update">.
<item>Applicate i suggerimenti presentati in questo manuale al riguardo
delle quote utente, definizioni di login e <prgn>lilo</prgn>.
<item><p>Compilate una lista di servizi attivi al momento sul sistema.
Eseguite:

<example>
  $ ps aux
  $ netstat -pn -l -A inet 
  # /usr/sbin/lsof -i | grep LISTEN
</example>

<p>In questo caso è necessario installare <package>lsof-2.2</package> 
per avere a disposizione il comando (che lavorerà da root).
Dovreste fare attenzione che <prgn>lsof</prgn> potrebbe tradurre
il termine LISTEN secondo le vostre impostazioni locali.

<item>Per rimuovere i servizi non necessari, determinate inizialmente
quale pacchetto fornisca il servizio e come si avvii. Questo può
essere ottenuto controllando quali programmi ascoltano
su di un socket. Il seguente script di shell, che utilizza i 
programmi <prgn>lsof</prgn> e <prgn>dpkg</prgn>, fa proprio questo:

<example>
#!/bin/sh
# FIXME: this is quick and dirty; replace with a more robust script snippet
for i in `sudo lsof -i | grep LISTEN | cut -d " " -f 1 |sort -u` ; do
  pack=`dpkg -S $i |grep bin |cut -f 1 -d : | uniq`
  echo "Service $i is installed by $pack";
  init=`dpkg -L $pack |grep init.d/ `
  if [ ! -z "$init" ]; then
    echo "and is run by $init"
  fi
done
</example>

<item>Una volta che avete individuato un qualsiasi servizio che non volete fornire,
rimuovete il pacchetto che lo genera (con <prgn>dpkg --purge</prgn>), o 
disabilitate la partenza automatica del servizio all'avvio del
sistema utilizzando <prgn>update-rc.d</prgn> 
(vedete in <ref id="disableserv">).
<item>Per i servizi avviati da inetd (lanciati tramite il superdemone), 
verificate che i servizi siano abilitati in 
<file>/etc/inetd.conf</file>, utilizzando:

<example>
  $ grep -v "^#" /etc/inetd.conf | sort -u
</example>

Per disabilitare quei servizi che non desiderate è necessario
commentare le righe dello script che li avviano in 
<file>/etc/inetd.conf</file>, altrimenti, rimuovere il 
pacchetto che fornisce il servizio, o 
utilizzare <prgn>update-inetd</prgn>.

<item>Se avete servizi wrapped (quelli che usano
<prgn>/usr/sbin/tcpd</prgn>), verificate che i file 
<file>/etc/hosts.allow</file> e <file>/etc/hosts.deny</file> siano 
configurati in accordo con la vostra politica di sicurezza.
<item>Se il server usa più di una interfaccia con l'esterno, in funzione
del servizio, potreste voler limitare il servizio all'ascolto su
una specifica interfaccia. Per esempio, se si volesse un accesso FTP
esclusivamente dall'interno, fate in modo che il demone FTP
sia in ascolto solo sull'interfaccia di gestione e non su tutte le
interfacce (p.e. 0.0.0.0:21).
<item>Riavviate la macchina, o commutate sulla modalità monoutente e
quindi tornate a quella multiutente, utilizzando i comandi:

<example>
  $ init 1
  (....)
  $ init 2
</example>

<item>
<p>Controllate i servizi adesso disponibili e se necessario, ripetete
i passi appena esposti.
<item>
<p>Ora installate i servizi che ritenete necessari, se non avete già 
agito così e configurateli appropriatamente.
<item>
<p>Usate il seguente comando da shell, per determinare con quale 
identità ogni servizio disponibile sta girando:

<example>
  # for i in `/usr/sbin/lsof -i |grep LISTEN |cut -d " " -f 1 |sort -u`; \
  > do user=`ps ef |grep $i |grep -v grep |cut -f 1 -d " "` ; \
  > echo "Service $i is running as user $user"; done
</example>

<p>Valutate l'opportunità di modificare questi servizi associandoli a specifici
utenti/gruppi mediante gabbie <prgn>chroot</prgn> per avere maggior sicurezza.
Potete farlo modificando lo script <file>/etc/init.d</file> che avvia il 
servizio. La maggior parte dei servizi in Debian usano 
<prgn>start-stop-daemon</prgn> che ha l'opzione 
(<tt>--change-uid</tt> e <tt>--chroot</tt>) per apportare le modifiche 
di cui sopra. Alcuni avvertimenti al riguardo dei servizi in 
<prgn>chroot</prgn>: potrebbe essere necessario mettere tutti i file
installati dal pacchetto (usando dpkg -L) che fornisce il servizio, così come
tutti i pacchetti da cui esso dipende, in un ambiente di tipo 
<prgn>chroot</prgn>.
Le informazioni per configurare un ambiente <prgn>chroot</prgn> per 
il programma <prgn>ssh</prgn> possono essere trovate in 
<ref id="chroot-ssh-env">.
<item>Ripetete i passi summenzionati al fine di verificare che girino
i soli servizi desiderati e che essi stiano girando con la desiderata
combinazione utente/gruppo.
<item>Verificate i servizi installati per controllare che funzionino come 
avete previsto.
<item>Controllate il sistema con un rilevatore di vulnerabilità
(come <package>nessus</package>), al fine di determinare le 
vulnerabilità nel sistema (p.e. errate configurazioni, servizi
vecchi o non necessari).
<item>Installate rilevatori di intrusioni su macchine e su reti come
<package>snort</package> e <package>logsentry</package>.
<item>Ripetete la sequenza dell'esame della rete e verificate che i
sistemi di rilevamento delle intrusioni stiano funzionando
correttamente.

</list>

<p>Se siete persone realmente paranoiche dovreste valutare anche 
quanto segue:

<list>
<item>Aggiungere funzionalità "firewall" al sistema, accettando connessioni
in ingresso solo per servizi offerti e limitando le connessioni uscenti
alle sole autorizzate.
<item>Ricontrollare l'installazione con una nuova verifica di vulnerabilità
usando uno scanner di rete.
<item>Usando un rilevatore di rete, controllare le connessioni uscenti
dal sistema verso una macchina esterna e verificare che nessuna
connessione trovi il modo di uscire.
</list>

<p>FIXME: questa procedura si occupa della blindatura dei servizi, non
della blindatura di sistemi a livello utente, includendo le informazioni
per controllare i permessi utente, i file SETUID ed il congelamento dei
cambiamenti del sistema utilizzando il filesystem ext2.


<appendix id="checklist">Verifica della configurazione

<p>Quest'appendice riporta brevemente estratti dalle altre sezioni
di questo manuale, condensati in un elenco (in seguito "checklist" N.d.T. ). 
La funzione di questa  checklist è fornire un rapido sommario per 
chi ha già letto il manuale. Ci sono altre buone checklist 
disponibili, incluso il Kurt Seifried's <url
id="http://seifried.org/security/os/linux/20020324-securing-linux-step-by-step.html"
name="Securing Linux Step by Step"> ed il <url
id="http://www.cert.org/tech_tips/usc20_full.html" name="CERT's Unix
Security Checklist">.

<!-- Order is slightly different from body text. Consider changing text? -->
<!-- (FIXME) -->


<p>FIXME: Questa checklist è basata sulla versione 1.4 del manuale e 
potrebbe aver bisogno di essere aggiornata.

<list>
	  <item><p>Limitate le capacità di avvio e di accesso fisico


	      <list>
		<item>Abilitate la password del BIOS
		<item>Disabilitate l'avvio da floppy/cdrom/ ... 
		<item>Impostate una password per GRUB o LILO 
		(rispettivamente <file>/etc/lilo.conf</file> o 
		<file>/boot/grub/menu.lst</file>); 
		verificate che i file di configurazione di LILO o GRUB 
		siano protetti da scrittura.
	      </list>
	      
	  <item>Partizionamento


	      <list>
		
		<item>Separate i dati scrivibili dagli utenti, i dati non di 
		sistema e i dati run-time che cambiano velocemente, in 
		partizioni distinte.
		<item>Impostate le opzioni di mount 
		<tt>nosuid,noexec,nodev</tt> in <file>/etc/fstab</file>
                per partizioni ext2/3 che non dovrebbero bloccare 
                binari come <file>/home</file> o <file>/tmp</file>.

	      </list>
	      
	  <item>Accuratezza delle password e sicurezza per il login
	      
	      <list>

		<item>Assegnate a root una buona password.
		<item>Abilitate il password shadowing e l'MD5.
		<item>Installate ed utilizzate PAM.
		    
		    <list>
		      
		      <item>Aggiungete il supporto per MD5 a PAM e assicuratevi
                     che (in generale) le voci nel file 
		     <file>/etc/pam.d/</file>, che garantiscono 
		     l'accesso alla macchina, abbiano 
		     il secondo campo nel file pam.d impostato a
		     <tt>requisite</tt> o
                          <tt>required</tt>.
			  <!-- or is it third? (FIXME: check) -->
		      <item>Modificate <file>/etc/pam.d/login</file> in 
                      modo che permetta il login solamente a root 
                      solamente in locale.
		      <item>Inoltre segnate le tty:s autorizzate nel file
		      <file>/etc/security/access.conf</file> e in 
                      generale configurate il file affinché 
		      le login da root siano limitate il più possibile.
		      <item>Aggiungete pam_limits.so se volete impostare un 
		      limite per ciascun utente.
		      <item>Modificate <file>/etc/pam.d/passwd</file>: aumentate 
		      la lunghezza minima delle passwords (6 
		      caratteri probabilmente) e abilitate l'MD5.
		      <item>Aggiungete il gruppo wheel a <file>/etc/group</file>
		      se lo desiderate; aggiungete la voce pam_wheel.so
		      group=wheel in <file>/etc/pam.d/su</file>.
		      <item>Per personalizzare i controlli relativi a ciascun utente,
		      usate un'apposita voce pam_listfile.so dove appropriato.
		      <item>Create un file <file>/etc/pam.d/other</file> e 
		      configuratelo con un'alta sicurezza.

		    </list>
		    
		<item>Impostate i limiti <file>/etc/security/limits.conf</file> 
		(notate che <file>/etc/limits</file> non viene utilizzato 
		se usate PAM).
		<item>Limitate i permessi al file <file>/etc/login.defs</file>; 
		inoltre, se avete abilitato MD5 e/o PAM, assicuratevi di 
		fare i cambiamenti corrispondenti.
		<item>Disabilitate l'accesso root via ftp in 
		<file>/etc/ftpusers</file>.
		<item>Disabilitate l'accesso root dalla rete; usate
		<manref name="su" section="1"> oppure 
		<manref name="sudo" section="1">. Considerate 
		l'opportunità di installare <package>sudo</package>.
		<item>Usate PAM per rendere più sicuri gli accessi con login?

	      </list>

	  <item>Altri suggerimenti sulla sicurezza locale

	      <list>
		<item>Adattamenti del kernel (vedete in <ref id="kernel-conf">).
		<item>Patch per il kernel (vedete in <ref id="kernel-patches">).
		<item>Rendete più restrittivi i permessi ai file di log
		(<file>/var/log/{last,fail}log</file>, i log di Apache)
		<item>Verificate che il controllo SETUID sia abilitato in 
		<file>/etc/checksecurity.conf</file>.
		<item>Considerate la possibilità di rendere alcuni file di log
		append-only e alcuni file di configurazione immutabili con
		il comando chattr (solo per il file system ext2/3).
		<item>Configurate il controllo sull'integrità dei file 
		(vedete in <ref id="check-integ">).
		Installate <package>debsums</package>.
		<item>Loggare tutto su una stampante locale?
		<item>Scrivere su un CD avviabile la propria configurazione 
		e fare il boot da CD?
		<item>Disabilitare i moduli del kernel?

	      </list>
	      
	  <item>Limitate l'accesso alla rete

	      <list>

		<item>Installate e configurate <prgn>ssh</prgn> (si suggerisce 
		di impostare a No le voci PermitRootLogin e 
		PermitEmptyPasswords nel file 
		<file>/etc/ssh/sshd_config</file>; 
		notate anche gli altri suggerimenti nel testo).
		<item>Considerate la possibilità di disabilitare o rimuovere
		<prgn>in.telnetd</prgn>, se installato.
		<item>In linea di massima, disabilitate i servizi inutili in
		<file>/etc/inetd.conf</file> usando 
		<prgn>update-inetd --disable</prgn> (oppure disabilitate 
		<prgn>inetd</prgn> completamente, o ancora usate un 
		sostituto come ad esempio <prgn>xinetd</prgn> o 
		<prgn>rlinetd</prgn>).
		<item>Disabilitate altri servizi di rete inutili; ftp, DNS, 
		WWW etc. non dovrebbero essere eseguiti  se non sono 
		necessari e peraltro, tenuti regolarmente sotto controllo.
		<item>Per i servizi di cui avete bisogno, non vi limitate ad usare
		i programmi più comuni ma cercatene versioni più sicure
		contenute all'interno di Debian (o di altre fonti).
		Qualsiasi cosa finiate per eseguire, assicuratevi di
		capirne i rischi.
		<item>Impostate gabbie <prgn>chroot</prgn> per utenti 
		e demoni esterni.
		<item>Configurate firewall e tcpwrappers
		(per esempio <manref name="hosts_access" section="5">); 
		notate il trucco per <file>/etc/hosts.deny</file> nel testo.
		<item>Se eseguite ftp, impostate il server ftpd per essere eseguito
		sempre in <prgn>chroot</prgn> nella home directory dell'utente.
		<item>Se usate X, disabilitate l'autenticazione xhost ed usate
		<prgn>ssh</prgn> come sostituto; ancora meglio, disabilitate,
		se possibile, la possibilità di autenticarsi in X da remoto
		(aggiungete -nolisten tcp alla riga di comando di X
		e disabilitate XDMCP nel file 
		<file>/etc/X11/xdm/xdm-config</file> impostando a 0 
		la requestPort).
		<item>Disabilitate l'accesso dall'esterno alle stampanti.
		<item>Effettuate il tunneling di qualsiasi sezione POP o IMAP
		attraverso SSL o <prgn>ssh</prgn>; installate stunnel 
		se volete fornire questo servizio agli utenti remoti 
		del servizio di posta.
		<item>Impostate un log host e configurate tutti gli altri 
		host a spedire i log a questo host 
		(<file>/etc/syslog.conf</file>).
		<item>Rendete sicuri BIND, Sendmail e altri demoni complessi
		(eseguiteli in una gabbia <prgn>chroot</prgn>;
		eseguiteli come pseudo-utente non-root).
		<item>Installate tiger o un simile strumento di logging.
		<item>Installate snort o un simile strumento di logging.
		<item>Se possibile, fate a meno di NIS ed RPC (disabilitate portmap).
		    
	      </list>

	  <item>Documenti sulle politiche adottate

	      <list>
		
		    <item>Educate gli utenti a comprendere i perché ed i come delle
		    vostre politiche. Quando proibite qualcosa che è
		    regolarmente disponibile su altri sistemi, fornite
		    documentazione che spieghi come raggiungere i risultati
		    voluti utilizzando altri mezzi più sicuri.
		<item>Proibite l'uso di protocolli che usano password in chiaro
		(<prgn>telnet</prgn>, <prgn>rsh</prgn> e simili; ftp, imap, 
		http, ...).
		<item>Proibite i programmi che usano SVGAlib.
		<item>Usate la gestione delle quote disco.

	      </list>
	      
	  <item>Tenetevi informati circa le notizie riguardanti la sicurezza

	      <list>
		
		<item>Iscrivetevi a mailing list di sicurezza.
		<item>Configurate <package>apt</package> per gli aggiornamenti 
		di sicurezza; aggiungete al file 
		<file>/etc/apt/sources.list</file>
		una riga per http://security.debian.org/debian-security.
		<item>Ricordatevi anche di eseguire periodicamente
		<prgn>apt-get update; apt-get upgrade</prgn> (potreste 
		farlo eseguire ad un job <prgn>cron</prgn>?) come spiegato in
		<ref id="security-update">.

	      </list>

	</list>





<appendix id="snort-box">Configurazione ed installazione di un
                         sistema autonomo IDS

<p>Si può facilmente configurare un sistema Debian dedicato come 
Intrusion Detection System autonomo usando <package>snort</package> 
ed un'interfaccia basata su web per analizzare gli avvisi che 
rilevano un'intrusione:

<list>

<item>Installare un sistema di base Debian senza selezionare pacchetti
aggiuntivi.

<item>Installare una versione di Snort con supporto ai database e 
configurare l'IDS per registrare gli avvisi in un database.

<item>Scaricare ed installare BASE (Basic Analysis and Security 
Engine), o ACID (Analysis Console for Intrusion Databases). 
Configurare il software scelto per utilizzare lo stesso database 
usato da Snort.

<item>Scaricare ed installare i pacchetti necessari<footnote>
          Solitamente i pacchetti di cui avete bisogno vengono
          installati come dipendenza.</footnote>.
</list>

<p>BASE viene impacchettato correntemente per Debian in
<package>acidbase</package> ed ACID viene impacchettato come
<package>acidlab</package><footnote>
          &Egrave; possibile anche scaricarlo da <url
          id="http://www.cert.org/kb/acid/">, <url
          id="http://acidlab.sourceforge.net"> o <url
          id="http://www.andrew.cmu.edu/~rdanyliw/snort/">.
</footnote>.
Entrambi forniscono un'interfaccia grafica basata su web per l'output
di Snort.

<p>Oltre l'installazione base, avrete bisogno anche di un server web
(come <package>apache</package>), un interprete <prgn>PHP</prgn> ed
un database relazionale (come <package>postgresql</package> o
<package>mysql</package>) dove Snort possa salvare i suoi avvisi.

<p>Questo sistema dovrebbe essere configurato con almeno due
interfacce: una connessa ad una LAN gestionale (per avere accesso ai
risultati e gestire il sistema) e l'altra senza indirizzo IP
collegata al segmento di rete che state analizzando. Dovreste
configurare il server web per rimanere in ascolto solo
sull'interfaccia connessa alla LAN gestionale.

<p>Dovreste configurare entrambe le interfacce nel file di
configurazione standard di Debian
<file>/etc/network/interfaces</file>. Un indirizzo (quello di
gestione della LAN) può essere configurato come fareste
solitamente. L'altra interfaccia dovrebbe essere inizializzata
all'avvio del sistema, ma senza indirizzo d'interfaccia. Potete
usare la seguente definizione d'interfaccia:

<example>
auto eth0
iface eth0 inet manual
      up ifconfig $IFACE 0.0.0.0 up
      up ip link set $IFACE promisc on
      down ip link set $IFACE promisc off
      down ifconfig $IFACE down
</example>

<p>Così viene configurata un'interfaccia per leggere tutto il
traffico sulla rete in una configurazione di tipo <em>stealth</em>
(N.d.r.:invisibile, nascosta). Questo evita al sistema NIDS di essere
un bersaglio diretto in una rete ostile poiché i sensori non hanno
indirizzo IP sulla rete. Notate, ad ogni modo, che ci sono stati bug
conosciuti in parti dei sensori dei NIDS (per esempio vedete il
<url id="http://www.debian.org/security/2003/dsa-297" name="DSA-297">
relativo a Snort) ed inoltre, buffer overflow remoti possono essere 
iniziati dal processare un pacchetto di rete.

<p>Potreste anche voler anche leggere lo
<url id="http://www.faqs.org/docs/Linux-HOWTO/Snort-Statistics-HOWTO.html"
name="Snort Statistics HOWTO"> e la documentazione disponibile presso
il <url id="http://www.snort.org/docs/"
name="sito ufficiale di Snort">.




<appendix id="bridge-fw">Impostare un bridge firewall

<p>Queste informazioni sono il contributo di Francois Bayart
per aiutare gli utenti ad impostare un bridge/firewall Linux con il
kernel 2.4.x ed <package>iptables</package>. Non sono necessarie
patch da applicare al kernel perché le parti di codice necessarie
per il corretto funzionamento ormai fanno parte integrante del kernel
linux.

<p>Per configurare il kernel con il necessario supporto, eseguite
<tt>make menuconfig</tt> o <tt>make xconfig</tt>. Nella sezione
<em>Networking options</em>, abilitate le seguenti opzioni:

<example>
[*] Network packet filtering (replaces ipchains)
[ ]   Network packet filtering debugging (NEW)
<*> 802.1d Ethernet Bridging
[*]   netfilter (firewalling) support (NEW)
</example>

<p>Attenzione: dovete disabilitare questa opzione se
volete applicare delle regole di firewall, altrimenti
<prgn>iptables</prgn> non funzionerà.

<example>
[ ]   Network packet filtering debugging (NEW)
</example>

<p>Dopodiché, aggiungete le opzioni corrette nella sezione
<em>IP: Netfilter Configuration</em>. Quindi, compilate ed installate
il kernel. Se volete farlo alla <em>maniera Debian</em>, installate
<package>kernel-package</package> e lanciate <prgn>make-kpkg</prgn>
per creare un pacchetto del kernel Debian personalizzato,
installabile sul server utilizzando dpkg. Una volta che il nuovo
kernel è stato compilato ed installato, installate anche il pacchetto
<package>bridge-utils</package>.

<p>Una volta completati questi passaggi, potete completare la
configurazione del vostro bridge. La sezione successiva mostra
due diverse possibili configurazioni per il bridge, ognuna con
un'ipotetica mappa di rete ed i comandi necessari.


<sect>Un bridge con funzionalità NAT e firewall

<p>La prima configurazione utilizza il bridge come un firewall con
traslazione degli indirizzi di rete (NAT), che protegge un server
ed i client della LAN interna. Un diagramma della configurazione
di rete viene mostrato qui sotto:



<example>
Internet ---- router ( 62.3.3.25 ) ---- bridge (62.3.3.26 gw 62.3.3.25 / 192.168.0.1)
                                          |
                                          |
                                          |---- WWW Server (62.3.3.27 gw 62.3.3.25)
                                          |
                                          |
                                         LAN --- Zipowz (192.168.0.2 gw 192.168.0.1)
</example>

<p>I seguenti comandi mostrano come il bridge può essere configurato:

<example>
# Crea l'interfaccia br0
/usr/sbin/brctl addbr br0

# Aggiunge l'interfaccia Ethernet da utilizzare con il bridge
/usr/sbin/brctl addif br0 eth0
/usr/sbin/brctl addif br0 eth1

# Inizializza l'interfaccia Ethernet
/sbin/ifconfig eth0 0.0.0.0
/sbin/ifconfig eth1 0.0.0.0

# Configurare il bridge ethernet.
# Il bridge sarà corretto ed invisibile (firewall trasparente).
# Non figura in un traceroute e mantiene il vero gateway sugli altri 
# computer. Ora se volete potete configurare un gateway sul bridge e
# sceglierlo come nuovo gateway per altri computer.

/sbin/ifconfig br0 62.3.3.26 netmask 255.255.255.248 broadcast 62.3.3.31

# Aggiunto questo IP interno per creare il NAT 
ip addr add 192.168.0.1/24 dev br0
/sbin/route add default gw 62.3.3.25
</example></sect>




<sect>Bridge con funzionalità di firewall

<p>
Una seconda configurazione possibile è un sistema configurato
come un firewall trasparente per una LAN con spazio di 
indirizzi IP pubblici.

<example>
Internet ---- router (62.3.3.25) ---- bridge (62.3.3.26)
                                        |
                                        |
                                        |---- WWW Server (62.3.3.28 gw 62.3.3.25)
                                        |
                                        |
                                        |---- Mail Server (62.3.3.27 gw 62.3.3.25)
</example>

<p>Le seguenti istruzioni mostrano come sia possibile configurare
questo bridge.

<example>
# Crea l'interfaccia br0
/usr/sbin/brctl addbr br0

# Aggiunge l'interfaccia Ethernet da utilizzare con il bridge
/usr/sbin/brctl addif br0 eth0
/usr/sbin/brctl addif br0 eth1

# Inizializza l'interfaccia Ethernet
/sbin/ifconfig eth0 0.0.0.0
/sbin/ifconfig eth1 0.0.0.0

# Configurazione del bridge Ethernet.
# Il bridge sarà invisibile ed impostato correttamente (firewall trasparente).
# Non figura in un traceroute e mantiene il vostro vero gateway sugli altri
# computer. Ora, se vorrete, potrete configurare un gateway sul vostro bridge
# e sceglierlo come nuovo gateway per gli altri computer.

/sbin/ifconfig br0 62.3.3.26 netmask 255.255.255.248 broadcast 62.3.3.31
</example>

<p>
Se eseguite un traceroute verso il Linux Mail Server, non vedrete
il bridge. Se volete accedere al bridge con <prgn>ssh</prgn>, dovete
avere un gateway, altrimenti dovreste prima connettervi ad un altro
server, come il "Mail Server" ed in seguito connettervi al bridge
tramite la scheda di rete interna.</sect>



<sect>Regole base di IPtables

<p>Questo è un esempio delle regole base che potreste usare
indistintamente per queste due configurazioni.

<example>
iptables -F FORWARD
iptables -P FORWARD DROP
iptables -A FORWARD -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Alcune regole interessanti ma non presenti in una configurazione
# classica di Iptables...
# Limit ICMP
# iptables -A FORWARD -p icmp -m limit --limit 4/s -j ACCEPT
# Confronta la stringa, un buon metodo, semplice, per bloccare molto
# velocemente alcuni VIRUS
# iptables -I FORWARD -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"

# Blocca tutte le connessioni di MySQL, tanto per essere sicuri
iptables -A FORWARD -p tcp -s 0/0 -d 62.3.3.0/24 --dport 3306 -j DROP

# Regole per Linux Mail Server

# Autorizza FTP-DATA ( 20 ), FTP ( 21 ), SSH ( 22 )
iptables -A FORWARD -p tcp -s 0.0.0.0/0 -d 62.3.3.27/32 --dport 20:22 -j ACCEPT

# Autorizza il Mail Server a connettersi con l'esterno
# Notate: ciò *non* è necessario per le connessioni precedenti
# (ricordate: stateful filtering) e quindi può essere rimosso.
iptables -A FORWARD -p tcp -s 62.3.3.27/32 -d 0/0 -j ACCEPT

# WWW Server Rules

# Autorizza connessioni HTTP ( 80 ) con il server WWW
iptables -A FORWARD -p tcp -s 0.0.0.0/0 -d 62.3.3.28/32 --dport 80 -j ACCEPT

# Autorizza connessioni HTTPS ( 443 ) con il server WWW
iptables -A FORWARD -p tcp -s 0.0.0.0/0 -d 62.3.3.28/32 --dport 443 -j ACCEPT

# Autorizza il server WWW a connettersi con l'esterno
# Notate: ciò *non* è necessario per le connessioni precedenti
# (ricordate: stateful filtering) e quindi può essere rimosso.
iptables -A FORWARD -p tcp -s 62.3.3.28/32 -d 0/0 -j ACCEPT
</example></sect>

<appendix id="bind-chuser">Script di esempio per modificare
                           l'installazione predefinita di Bind


<p>Questo script automatizza la procedura per cambiare 
l'installazione predefinita del server dei nomi <prgn>bind</prgn>
versione 8, in modo che <em>non</em> venga eseguito con i privilegi di
superutente. Notate che <prgn>bind</prgn> versione 9, in Debian, si
comporta già così in maniera predefinita<footnote>
          Dalla versione 9.2.1-5. Vale a dire dal rilascio di Debian
          <em>sarge</em>.
</footnote>,
ed è meglio usare questa versione piuttosto che <prgn>bind</prgn>
versione 8.


<p>Questo script viene qui riportato per ragioni storiche e per
mostrare come si possa automatizzare questo tipo di cambiamenti per
tutto il sistema. Lo script creerà l'utente ed i gruppi definiti dal
server dei nomi e modificherà entrambi i file
<file>/etc/default/bind</file> e <file>/etc/init.d/bind</file>, così
il programma verrà eseguito con quell'utente. Usate estrema cautela
poiché non è stato collaudato estensivamente.

<p>Potete anche creare manualmente gli utenti ed usare la patch
disponibile per lo script predefinito allegato al
<url id="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=157245"
name="bug report #157245">.

<example>
  #!/bin/sh
  # Change the default Debian bind v8 configuration to have it run
  # with a non-root user and group.
  #
  # DO NOT USER this with version 9, use debconf for configure this instead
  #
  # WARN: This script has not been tested thoroughly, please
  # verify the changes made to the INITD script

  # (c) 2002 Javier Fernández-Sanguino Peña
  #
  #    This program is free software; you can redistribute it and/or modify
  #    it under the terms of the GNU General Public License as published by
  #    the Free Software Foundation; either version 1, or (at your option)
  #    any later version.
  #
  #    This program is distributed in the hope that it will be useful,
  #    but WITHOUT ANY WARRANTY; without even the implied warranty of
  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  #    GNU General Public License for more details.
  #
  #     Please see the file `COPYING' for the complete copyright notice.
  #

  restore() {
  # Just in case, restore the system if the changes fail
    echo "WARN: Restoring to the previous setup since I'm unable to properly change it."
    echo "WARN: Please check the $INITDERR script."
    mv $INITD $INITDERR
    cp $INITDBAK $INITD
  }


  USER=named
  GROUP=named
  INITD=/etc/init.d/bind
  DEFAULT=/etc/default/bind
  INITDBAK=$INITD.preuserchange
  INITDERR=$INITD.changeerror
  AWKS="awk ' /\/usr\/sbin\/ndc reload/ { print \"stop; sleep 2; start;\"; noprint = 1; } /\\\\$/ { if ( noprint != 0 ) { noprint = noprint + 1;} } /^.*$/ { if ( noprint != 0 ) { noprint = noprint - 1; } else { print \$0; } } '"

  [ `id -u` -ne 0 ] && {
    echo "This program must be run by the root user"
    exit 1
  }

  RUNUSER=`ps eo user,fname |grep named |cut -f 1 -d " "`

  if [ "$RUNUSER" = "$USER" ] 
  then
    echo "WARN: The name server running daemon is already running as $USER"
    echo "ERR:  This script will not do any changes to your setup."
    exit 1
  fi
  if [ ! -f "$INITD" ]
  then
    echo "ERR:  This system does not have $INITD (which this script tries to change)"
    RUNNING=`ps eo fname |grep named`
    [ -z "$RUNNING" ] && \
      echo "ERR:  In fact the name server daemon is not even running (is it installed?)"
    echo "ERR:  No changes will be made to your system"
    exit 1
  fi

  # Check if there are options already setup 
  if [ -e "$DEFAULT" ]
  then
    if grep -q ^OPTIONS $DEFAULT; then
      echo "ERR: The $DEFAULT file already has options set."
      echo "ERR:  No changes will be made to your system"
    fi
  fi

  # Check if named group exists
  if [ -z "`grep $GROUP /etc/group`" ]
  then
    echo "Creating group $GROUP:"
    addgroup $GROUP
  else
    echo "WARN: Group $GROUP already exists. Will not create it"
  fi
  # Same for the user
  if [ -z "`grep $USER /etc/passwd`" ]
  then
    echo "Creating user $USER:"
    adduser --system --home /home/$USER \
      --no-create-home --ingroup $GROUP \
      --disabled-password --disabled-login $USER
  else
    echo "WARN: The user $USER already exists. Will not create it"
  fi

  # Change the init.d script

  # First make a backup (check that there is not already
  # one there first)
  if [ ! -f $INITDBAK ]
  then
    cp $INITD $INITDBAK
  fi

  # Then use it to change it
  cat $INITDBAK |
  eval $AWKS &gt; $INITD

  # Now put the options in the /etc/default/bind file:
  cat &gt;&gt;$DEFAULT &lt;&lt;EOF
# Make bind run with the user we defined
OPTIONS="-u $USER -g $GROUP"
EOF

  echo "WARN: The script $INITD has been changed, trying to test the changes."
  echo "Restarting the named daemon (check for errors here)."

  $INITD restart
  if [ $? -ne 0 ]
  then
    echo "ERR:  Failed to restart the daemon."
    restore
    exit 1
  fi

  RUNNING=`ps eo fname |grep named`
  if [ -z "$RUNNING" ]
  then
    echo "ERR:  Named is not running, probably due to a problem with the changes."
    restore
    exit 1
  fi

  # Check if it's running as expected
  RUNUSER=`ps eo user,fname |grep named |cut -f 1 -d " "`

  if [ "$RUNUSER" = "$USER" ]
  then
    echo "All has gone well, named seems to be running now as $USER."
  else
    echo "ERR:  The script failed to automatically change the system."
    echo "ERR:  Named is currently running as $RUNUSER."
    restore
    exit 1
  fi

  exit 0
</example>

<p>Lo script precedente, che funziona sulla versione 8 di
<prgn>bind</prgn> per Woody (Debian 3.0), modificherà il file
in init.d dopo aver creato l'utente ed il gruppo 'named'.



<appendix id="fw-security-update">Aggiornamenti di sicurezza protetti
                                  da un firewall

<p>Dopo un'installazione standard, la sicurezza di un sistema potrebbe
presentare ancora delle vulnerabilità. A meno che voi non scarichiate
gli aggiornamenti da un altro sistema (o abbiate fatto il mirror di
security.debian.org per un uso locale), il sistema dovrà essere
collegato ad internet per i download.

<p>Non appena vi collegate ad internet, però, esponete il sistema
a dei rischi. Se uno dei vostri servizi locali ha una vulnerabilità,
potreste essere compromessi ancor prima che l'aggiornamento termini!
Può sembrare paranoico ma di fatto, analisi del
<url id="http://www.honeynet.org" name="progetto Honeynet">
hanno mostrato che i sistemi possono essere compromessi in meno di tre
giorni, anche se non sono noti pubblicamente (cioè non siano
riportati nei registri DNS).

<p>Quando si esegue un aggiornamento, su di un sistema non protetto da
un altro sistema esterno, come un firewall, è possibile configurare
adeguatamente il vostro firewall locale per limitare le connessioni
alle sole riguardanti gli aggiornamenti per la sicurezza.
L'esempio qui di seguito mostra come configurare un tale firewall,
per autorizzare solo le connessioni da security.debian.org e
registrare tutte le altre.

<p>Il seguente esempio può essere utilizzato per impostare un insieme
di regole restrittive del firewall. Eseguite questi comandi da
una console locale (non da remoto) per ridurre il rischio di
rimanere tagliati fuori da un eventuale blocco del sistema.

<example>
  # iptables -F
  # iptables -L
  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination

  Chain FORWARD (policy ACCEPT)
  target     prot opt source               destination

  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination
  # iptables -A OUTPUT -d security.debian.org --dport 80 -j ACCEPT
  # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  # iptables -A INPUT -p icmp -j ACCEPT
  # iptables -A INPUT -j LOG
  # iptables -A OUTPUT -j LOG
  # iptables -P INPUT DROP
  # iptables -P FORWARD DROP
  # iptables -P OUTPUT DROP
  # iptables -L
  Chain INPUT (policy DROP)
  target     prot opt source               destination
  ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          state RELATED,ESTABLISHED
  ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
  LOG        all  --  anywhere             anywhere           LOG level warning

  Chain FORWARD (policy DROP)
  target     prot opt source               destination

  Chain OUTPUT (policy DROP)
  target     prot opt source               destination
  ACCEPT     80   --  anywhere             security.debian.org
  LOG        all  --  anywhere             anywhere           LOG level warning
</example>


<p>Notate: usare una politica <em>DROP</em> nella catena di INPUT è
la cosa più corretta da fare, ma fate <em>molta</em> attenzione
quando lo fate dopo aver scaricato la catena di regole del firewall
da una connessione remota. Quando collaudate un insieme di regole per
il firewall da una connessione remota, è meglio eseguire uno script
con questo insieme (piuttosto che introdurre le regole riga per riga
dalla riga di comando) e per precauzione, mantenere una
backdoor<footnote>
          Come <em>knockd</em>. In alternativa, potete aprire una
          diversa console e fare in modo che il sistema chieda
          conferma che ci sia qualcuno dall'altro lato e annulli
          la catena del firewall se non ci sono conferme. Il seguente
          script di collaudo potrebbe essere utile all'uso:
<example>
#!/bin/bash

while true; do
    read -n 1 -p "Sei tu? " -t 30 ayt
    if [ -z "$ayt" ] ; then
        break
    fi
done

# Annullare la catena del firewall, l'utente non è disponibile
echo
echo "Annulla la catena del firewall!"
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
exit 1
</example>
<p>Ovviamente, dovreste disabilitare ogni backdoor prima di mettere
il sistema in produzione.
</footnote>
configurata, così da poter riabilitare l'accesso al sistema in caso
di errore. In questo modo non ci sarà nessun bisogno di recarsi
in una località remota per sistemare una regola del firewall che ci
tiene fuori.

<p>Questo richiede che il DNS funzioni correttamente, dato che serve
per far funzionare security.debian.org. Potete aggiungere
security.debian.org ad /etc/hosts ma attualmente è un CNAME a svariati
host (c'è più di un mirror di sicurezza).

<p>FIXME: ciò funzionerà solo con le URL HTTP poiché ftp potrebbe
richiedere il modulo ip_conntrack_ftp module, oppure utilizzare
la modalità passiva.





<appendix id="chroot-ssh-env">Ambiente <prgn>Chroot</prgn> per <prgn>SSH</prgn>


<p>Creare un ambiente con restrizioni per <prgn>SSH</prgn> è un duro
lavoro, a causa delle sue dipendenze e del fatto che, a differenza di
altri server, <prgn>SSH</prgn> fornisce una shell remota agli utenti.
Così dovrete considerare anche le applicazioni che gli utenti
potranno utilizzare nell'ambiente.


<p>Avete due opzioni per impostare una shell remota con restrizioni:

<list>
<item>Confinare gli utenti ssh in un ambiente chroot; configurando
correttamente il demone ssh potete chiedergli di confinare un utente
in un ambiente chroot dopo l'autenticazione, subito prima che gli venga
fornita una shell. Ogni utente può avere il proprio ambiente.
<item>Mettere il server ssh in chroot poiché, se l'applicazione ssh
stessa viene messa in chroot tutti gli utenti sono in chroot all'interno
dell'ambiente definito.

</list>

<p>La prima opzione ha il vantaggio di rendere possibile la
compresenza di utenti non in chroot ed utenti in chroot; se non
vengono introdotte applicazioni setuid negli ambienti chroot
dell'utente, è più difficile evaderne. Comunque, potrebbe essere
necessario impostare ambienti chroot individuali per ciascun utente
e quindi sarebbe più difficile da configurare (perché richiede 
cooperazione da parte del server SSH). La seconda opzione è più 
facile da configurare e protegge dallo sfruttamento di un possibile 
baco nel server ssh stesso (dal momento che anch'esso è all'interno
del chroot) ma avrà una limitazione che consiste nell'obbligo della 
condivisione, da parte di tutti gli utenti, del medesimo ambiente 
chroot (non si può configurare un ambiente chroot utente per utente).



<sect>Mettere gli utenti ssh in chroot

<p>&Egrave; possibile impostare il server ssh in modo che metta in
chroot un certo insieme di utenti dentro una shell con una scelta
limitata di applicazioni disponibili.




<sect1>Usare <package>libpam-chroot</package>

<p>Probabilmente il metodo più semplice è usare il pacchetto
<package>libpam-chroot</package> fornito in Debian. Una volta
installato dovete:


<list>
<item>Modificare <file>/etc/pam.d/ssh</file> per usare questo modulo
PAM, ed aggiungere come ultima riga<footnote>
          Potete usare l'opzione <em>debug</em> per fare in modo che
          spedisca il progresso raggiunto dal modulo al sistema
          <em>authpriv.notice</em>.
</footnote>:
<example>
session    required   pam_chroot.so
</example>

<item>Configurare un idoneo ambiente chroot per l'utente. Potete
tentare usando gli script disponibili in
<file>/usr/share/doc/libpam-chroot/examples/</file>, usate il
programma <package>makejail</package><footnote>
          Potete creare un ambiente bash molto limitato con la
          seguente definizione Python per makejail, quindi create 
          solamente la directory <file>/var/chroots/users/foo</file>, 
          un file con il seguente contenuto e chiamatelo 
          <file>bash.py</file>:

<example>
chroot="/var/chroots/user/foo"
cleanJailFirst=1
testCommandsInsideJail=["bash ls"]
</example>
          <p>A questo punto eseguite <em>makejail bash.py</em> per
          creare l'ambiente utente in <file>/var/chroots/user/foo</file>.
          Per collaudare il sistema eseguite:
<example>
# chroot /var/chroots/user/foo/ ls
bin  dev  etc  lib  proc  sbin  usr
</example>
</footnote>,
oppure configurate un ambiente minimale Debian con
<package>debootstrap</package>. Verificate che l'ambiente includa i
servizi di cui avete bisogno
<footnote>
          In alcune occasioni potreste avere bisogno dei file
          dispositivo <file>/dev/ptmx</file>, <file>/dev/pty*</file>
          e della sottodirectory <file>/dev/pts/</file>. Eseguire
          MAKEDEV nella directory <file>/dev</file> dell'ambiente
          chroot dovrebbe essere sufficiente per creare i file
          dispositivo nel caso in cui non esistano. Se state usando
          kernel (versione 2.6) che creano dinamicamente i file
          dispositivo dovrete creare i file /dev/pts/ da soli e
          garantire ad essi i permessi necessari.
</footnote>.

<item>Configurate <file>/etc/security/chroot.conf</file>, così che
determinati utenti siano in chroot nella directory che avete
configurato precedentemente. Potreste anche voler avere diverse
directory indipendenti per utenti diversi così che non siano in
grado di vedere né il sistema nella sua interezza né i file l'uno
dell'altro.

<item>Configurate SSH: a seconda della versione di OpenSSH,
l'ambiente in chroot potrebbe funzionare direttamente appena
installato oppure no. Dalla versione 3.6.1p2 la funzione
<em>do_pam_session()</em> viene chiamata dopo che sshd ha ridotto
i privilegi, poiché, siccome chroot() necessita dei privilegi di
root, naturalmente non funzionerà con l'opzione Privilege separation
on. In versioni più recenti di OpenSSH, invece, il codice PAM è stato
modificato e <em>do_pam_session()</em> viene chiamato prima di
ridurre i privilegi, cosi funzionerà anche con Privilege separation
on. Se dovete disabilitarlo, modificate come segue
<file>/etc/ssh/sshd_config</file>:
<example>
UsePrivilegeSeparation no
</example>
<p>Notate che questo abbasserà il livello di sicurezza del vostro
sistema poiché il server OpenSSH verrà eseguito come utente
<em>root</em>. Questo significa che se rilevate un attacco remoto
contro OpenSSH, con esito positivo, un attaccante otterrà i
privilegi di <em>root</em> invece che di <em>sshd</em>, 
compromettendo così tutto il sistema<footnote>
    Se state usando un kernel che implementa le Mandatory Access 
    Control (RSBAC/SElinux) potete evitare tutto questo cambiando
    la configurazione e garantendo all'utente <em>sshd</em> i
    privilegi per eseguire la chiamata di sistema chroot().
</footnote>.

</list>

<p>Se non disabilitate l'opzione <em>Privilege Separation</em>
avrete bisogno di un <file>/etc/passwd</file> che includa l'UID
dell'utente all'interno del chroot perché
<em>Privilege Separation</em> funzioni correttamente.

<p>Se avete l'opzione <em>Privilege Separation</em> impostata su
<strong>yes</strong> e la versione di OpenSSH non si comporta
correttamente allora dovrete disabilitarlo. Altrimenti, gli utenti 
che tenteranno di collegarsi al server e che dovrebbero essere messi 
in chroot da questo modulo vedranno questo:

<example>
$ ssh -l user server
user@server's password:
Connection to server closed by remote host.
Connection to server closed.
</example>

<p>Questo perché il demone ssh, che viene eseguito come 'sshd', non è in
grado di eseguire la chiamata di sistema chroot(). Per disabilitare
l'opzione Privilege separation, dovrete modificare il file di
configurazione <file>/etc/ssh/sshd_config</file>, come descritto in
precedenza.

<p>Notate che se uno dei seguenti manca, gli utenti non
saranno in grado di autenticarsi in chroot:

<list>

<item>Il filesystem <file>/proc</file> dev'essere montato nel chroot
dell'utente.

<item>I file dispositivo necessari in <file>/dev/pts/</file> devono
esistere. Se i file vengono generati automaticamente dal kernel in
esecuzione allora devono esser creati manualmente nella
<file>/dev/</file> del chroot.

<item>La home directory dell'utente deve esistere nel chroot,
altrimenti il demone ssh smetterà di funzionare.

</list>

<p>Si può correggere dai vari errori ognuna di queste questioni se
usate la parola chiave <em>debug</em> nella definizione PAM di
<em>/etc/pam.d/ssh</em>. Se incontrate altre questioni potreste
trovare interessante abilitare il modo di debug anche nel client ssh.

<p>Notate che queste informazioni sono disponibili (e probabilmente
anche più aggiornate) nel file
<file>/usr/share/doc/libpam-chroot/README.Debian.gz</file>, per
favore controllatelo per aggiornarvi sulle ultime novità prima di
eseguire la suddetta procedura.




<sect1>Applicare una patch al server <prgn>SSH</prgn>

<p>Il pacchetto <prgn>sshd</prgn> disponibile in Debian non permette di
restringere i movimenti di un utente che accede al server,
perché non dispone della funzione <prgn>chroot</prgn> che è invece
inclusa nel programma commerciale <prgn>sshd2</prgn>
(mediante 'ChrootGroups' o 'ChrootUsers', vedete
<manref name="sshd2_config" section="5">). Tuttavia è disponibile una
patch per aggiungere questa funzionalità dal
<url id="http://chrootssh.sourceforge.net" name="ChrootSSH project">
(richiesta e disponibile nel <url id="http://bugs.debian.org/139047"
name="Bug report 139047"> in Debian).
La patch potrebbe essere inclusa nelle prossime versioni del
pacchetto OpenSSH. Emmanuel Lacour dispone di pacchetti deb di
<prgn>ssh</prgn> per <em>sarge</em> con questa funzionalità:
<url id="http://debian.home-dn.net/sarge/ssh/">.
Tuttavia, per non rischiare, è sempre consigliabile ricompilarsi il
programma per tenersi aggiornati.

<p>Dopo aver applicato la patch, modificate il file
<file>/etc/passwd</file>, cambiando il percorso della directory home
degli utenti (utilizzando la combinazione di caratteri
speciale <tt>/./</tt>):

<example>
  joeuser:x:1099:1099:Joe Random User:/home/joe/./:/bin/bash
</example>

<p>In questo modo viene limitato <em>sia</em> l'accesso remoto alla shell
<em>che</em> la copia remota attraverso il canale <prgn>ssh</prgn>.

<p>Bisogna accertarsi di avere tutti i binari e le librerie necessarie
nel path soggetto a <prgn>chroot</prgn> per gli utenti.
Questi file dovrebbero essere di proprietà di root per evitare che
gli utenti li manomettano (per sfuggire dalla gabbia
<prgn>chroot</prgn>). Un esempio potrebbe comprendere:

<example>
./bin:
total 660
drwxr-xr-x    2 root     root         4096 Mar 18 13:36 .
drwxr-xr-x    8 guest    guest        4096 Mar 15 16:53 ..
-r-xr-xr-x    1 root     root       531160 Feb  6 22:36 bash
-r-xr-xr-x    1 root     root        43916 Nov 29 13:19 ls
-r-xr-xr-x    1 root     root        16684 Nov 29 13:19 mkdir
-rwxr-xr-x    1 root     root        23960 Mar 18 13:36 more
-r-xr-xr-x    1 root     root         9916 Jul 26  2001 pwd
-r-xr-xr-x    1 root     root        24780 Nov 29 13:19 rm
lrwxrwxrwx    1 root     root            4 Mar 30 16:29 sh -> bash
</example>
<example>
./etc:
total 24
drwxr-xr-x    2 root     root         4096 Mar 15 16:13 .
drwxr-xr-x    8 guest    guest        4096 Mar 15 16:53 ..
-rw-r--r--    1 root     root           54 Mar 15 13:23 group
-rw-r--r--    1 root     root          428 Mar 15 15:56 hosts
-rw-r--r--    1 root     root           44 Mar 15 15:53 passwd
-rw-r--r--    1 root     root           52 Mar 15 13:23 shells
</example>
<example>
./lib:
total 1848
drwxr-xr-x    2 root     root         4096 Mar 18 13:37 .
drwxr-xr-x    8 guest    guest        4096 Mar 15 16:53 ..
-rwxr-xr-x    1 root     root        92511 Mar 15 12:49 ld-linux.so.2
-rwxr-xr-x    1 root     root      1170812 Mar 15 12:49 libc.so.6
-rw-r--r--    1 root     root        20900 Mar 15 13:01 libcrypt.so.1
-rw-r--r--    1 root     root         9436 Mar 15 12:49 libdl.so.2
-rw-r--r--    1 root     root       248132 Mar 15 12:48 libncurses.so.5
-rw-r--r--    1 root     root        71332 Mar 15 13:00 libnsl.so.1
-rw-r--r--    1 root     root        34144 Mar 15 16:10
libnss_files.so.2
-rw-r--r--    1 root     root        29420 Mar 15 12:57 libpam.so.0
-rw-r--r--    1 root     root       105498 Mar 15 12:51 libpthread.so.0
-rw-r--r--    1 root     root        25596 Mar 15 12:51 librt.so.1
-rw-r--r--    1 root     root         7760 Mar 15 12:59 libutil.so.1
-rw-r--r--    1 root     root        24328 Mar 15 12:57 libwrap.so.0
</example>
<example>
./usr:
total 16
drwxr-xr-x    4 root     root         4096 Mar 15 13:00 .
drwxr-xr-x    8 guest    guest        4096 Mar 15 16:53 ..
drwxr-xr-x    2 root     root         4096 Mar 15 15:55 bin
drwxr-xr-x    2 root     root         4096 Mar 15 15:37 lib
</example>
<example>
./usr/bin:
total 340
drwxr-xr-x    2 root     root         4096 Mar 15 15:55 .
drwxr-xr-x    4 root     root         4096 Mar 15 13:00 ..
-rwxr-xr-x    1 root     root        10332 Mar 15 15:55 env
-rwxr-xr-x    1 root     root        13052 Mar 15 13:13 id
-r-xr-xr-x    1 root     root        25432 Mar 15 12:40 scp
-rwxr-xr-x    1 root     root        43768 Mar 15 15:15 sftp
-r-sr-xr-x    1 root     root       218456 Mar 15 12:40 ssh
-rwxr-xr-x    1 root     root         9692 Mar 15 13:17 tty
</example>
<example>
./usr/lib:
total 852
drwxr-xr-x    2 root     root         4096 Mar 15 15:37 .
drwxr-xr-x    4 root     root         4096 Mar 15 13:00 ..
-rw-r--r--    1 root     root       771088 Mar 15 13:01
libcrypto.so.0.9.6
-rw-r--r--    1 root     root        54548 Mar 15 13:00 libz.so.1
-rwxr-xr-x    1 root     root        23096 Mar 15 15:37 sftp-server
</example>




<sect>Eseguire un chroot del  server ssh

<p>Se create un ambiente chroot che contiene al suo interno i file
usati dal server ssh, per esempio <file>/var/chroot/ssh</file>,
potrete avviare il server ssh contenuto in tale ambiente con il 
seguente comando:

<example>
  # chroot /var/chroot/ssh /sbin/sshd -f /etc/sshd_config
</example>

<p>Questo avvierebbe il demone <prgn>sshd</prgn> all'interno 
dell'ambiente chroot. A tal fine dovrete assicurarvi che la 
directory <file>/var/chroot/ssh</file> contenga il server SSH 
e tutti i programmi che gli utenti che si collegheranno tramite 
ssh potrebbero voler usare. In tal caso, dovrete anche 
controllare che SSH usi la <em>separazione dei privilegi</em>
(normalmente nella configurazione base è così) e che la seguente
riga sia presente nel file <file>/etc/ssh/sshd_config</file>:

<example>
UsePrivilegeSeparation yes
</example>

<p>In tal modo il server SSH eseguirà come utente root solo le
operazioni strettamente indispensabili; conseguentemente, verranno
minimizzate le possibilità che un baco nel server SSH permetta di
compromettere l'intero sistema. Notate che, a differenza della
configurazione in cui assegnate ad ogni utente il proprio ambiente
chroot, in questa configurazione il demone ssh condivide l'ambiente
di chroot con altri utenti, perciò vi è almeno un processo con
privilegi di root che, se compromesso, potrebbe essere usato per
uscire fuori dalla gabbia chroot.


<p>Notate inoltre che, per assicurare il corretto funzionamento del 
demone ssh nell'ambiente chroot, la partizione dove risiede la 
directory usata dall'ambiente chroot non può essere montata con 
l'opzione <em>nodev</em> attiva: in tal caso, poiché 
<file>/dev/urandom</file> non funziona in chroot, otterreste il 
seguente errore: <em>PRNG is not seeded</em> (NdT: il generatore di 
numeri pseudo-casuali non riesce a ottenere un punto da cui partire).

<sect1>Come creare un sistema minimale (nella maniera più semplice possibile)

<p>Potreste usare <package>debootstrap</package> per creare un
sistema minimo che includa solo il server ssh. A tal fine dovreste
creare un ambiente chroot seguendo la procedura descritta nella
sezione dedicata a chroot della
<url id="http://www.debian.org/doc/manuals/reference/ch09#_chroot_system"
name="Guida Debian">. Questo metodo è semplice ed efficace (nel
sistema minimo saranno sicuramente presenti tutti i componenti
necessari alla gabbia chroot) ma consuma molto spazio su disco
(un'installazione minimale di Debian richiede comunque alcune
centinaia di megabyte di spazio). Inoltre, tale sistema minimale
potrebbe includere anche alcuni programmi i cui eseguibili hanno
il bit setuid attivo; se un utente riuscisse a compromettere uno di
questi programmi per incrementare i propri privilegi, diventando così
root, potrebbe uscire dall'ambiente chroot.



<sect1>Creazione automatica dell'ambiente chroot (nella maniera più
semplice possibile)

<p>Potete creare facilmente un ambiente di esecuzione limitato in cui
un dato demone possa funzionare senza problemi usando il pacchetto
<package>makejail</package>, che si occupa automaticamente,
utilizzando il comando <prgn>strace</prgn>, di individuare i file
necessari al corretto funzionamento del demone in questione e di
assicurarsi che essi siano presenti nell'ambiente chroot.

<p>Il vantaggio dei programmi che sono in grado di generare
automaticamente un ambiente <prgn>chroot</prgn> risiede nella loro
capacità di inserire un qualsiasi pacchetto (ed eventualmente le
dipendenze di tale pacchetto) automaticamente nell'ambiente
<prgn>chroot</prgn>. In questo modo, fornire al demone i pacchetti
di cui ha bisogno risulta molto più semplice.

<p>Per creare un ambiente chroot per il demone ssh sfruttando gli
esempi forniti con <prgn>makejail</prgn>, create la directory
<file>/var/chroot/sshd</file> ed usate il comando :

<example>
  # makejail /usr/share/doc/makejail/examples/sshd.py
</example>

<p>Tale comando creerà l'ambiente chroot richiesto nella directory
<file>/var/chroot/sshd</file>. Notate che affinché il tutto funzioni
correttamente è necessario che voi:

<list>
<item>Montiate il filesystem  <em>procfs</em> nella directory
<file>/var/chroot/sshd/proc</file>. Il programma
<prgn>Makejail</prgn> effettua automaticamente tale operazione, ma in
caso di riavvio del sistema il filesystem dovrà essere rimontato
usando il comando :

<example>
# mount -t proc proc /var/chroot/sshd/proc
</example>

<p>Si può anche farlo montare in automatico modificando il file
<file>/etc/fstab</file> e aggiungendo questa riga:

<example>
proc-ssh /var/chroot/sshd/proc  proc none 0 0
</example>

<item>Avere syslog in ascolto sul file dispositivo
<file>/dev/log</file> dentro la gabbia chroot. A questo scopo dovrete
modificare <file>/etc/default/syslogd</file> ed aggiungere
<em>-a /var/chroot/sshd/dev/log</em> alla definizione della
variabile <strong>SYSLOGD</strong>.

</list>

<p>Leggete il file di esempio per vedere quali altre modifiche 
all'ambiente devono essere fatte. Alcuni di questi cambiamenti, come 
la copia della directory home dell'utente, non possono essere fatti
automaticamente. Inoltre, limitate l'esposizione di informazioni
sensibili copiando solo i dati di un dato numero di utenti dai file
<file>/etc/shadow</file> o <file>/etc/group</file>. Notate che se
state usando Privilege Separation l'utente <em>sshd</em> deve
esistere in questi file.

<p>L'ambiente di esempio seguente è stato (superficialmente) 
collaudato in Debian 3.0, è stato costruito con il file di 
configurazione fornito nel pacchetto e comprende il pacchetto 
<package>fileutils</package>:

<example>
.
|-- bin
|   |-- ash
|   |-- bash
|   |-- chgrp
|   |-- chmod
|   |-- chown
|   |-- cp
|   |-- csh -> /etc/alternatives/csh
|   |-- dd
|   |-- df
|   |-- dir
|   |-- fdflush
|   |-- ksh
|   |-- ln
|   |-- ls
|   |-- mkdir
|   |-- mknod
|   |-- mv
|   |-- rbash -> bash
|   |-- rm
|   |-- rmdir
|   |-- sh -> bash
|   |-- sync
|   |-- tcsh
|   |-- touch
|   |-- vdir
|   |-- zsh -> /etc/alternatives/zsh
|   `-- zsh4
|-- dev
|   |-- null
|   |-- ptmx
|   |-- pts
|   |-- ptya0
(...)
|   |-- tty
|   |-- tty0
(...)
|   `-- urandom
|-- etc
|   |-- alternatives
|   |   |-- csh -> /bin/tcsh
|   |   `-- zsh -> /bin/zsh4
|   |-- environment
|   |-- hosts
|   |-- hosts.allow
|   |-- hosts.deny
|   |-- ld.so.conf
|   |-- localtime -> /usr/share/zoneinfo/Europe/Madrid
|   |-- motd
|   |-- nsswitch.conf
|   |-- pam.conf
|   |-- pam.d
|   |   |-- other
|   |   `-- ssh
|   |-- passwd
|   |-- resolv.conf
|   |-- security
|   |   |-- access.conf
|   |   |-- chroot.conf
|   |   |-- group.conf
|   |   |-- limits.conf
|   |   |-- pam_env.conf
|   |   `-- time.conf
|   |-- shadow
|   |-- shells
|   `-- ssh
|       |-- moduli
|       |-- ssh_host_dsa_key
|       |-- ssh_host_dsa_key.pub
|       |-- ssh_host_rsa_key
|       |-- ssh_host_rsa_key.pub
|       `-- sshd_config
|-- home
|   `-- userX
|-- lib
|   |-- ld-2.2.5.so
|   |-- ld-linux.so.2 -> ld-2.2.5.so
|   |-- libc-2.2.5.so
|   |-- libc.so.6 -> libc-2.2.5.so
|   |-- libcap.so.1 -> libcap.so.1.10
|   |-- libcap.so.1.10
|   |-- libcrypt-2.2.5.so
|   |-- libcrypt.so.1 -> libcrypt-2.2.5.so
|   |-- libdl-2.2.5.so
|   |-- libdl.so.2 -> libdl-2.2.5.so
|   |-- libm-2.2.5.so
|   |-- libm.so.6 -> libm-2.2.5.so
|   |-- libncurses.so.5 -> libncurses.so.5.2
|   |-- libncurses.so.5.2
|   |-- libnsl-2.2.5.so
|   |-- libnsl.so.1 -> libnsl-2.2.5.so
|   |-- libnss_compat-2.2.5.so
|   |-- libnss_compat.so.2 -> libnss_compat-2.2.5.so
|   |-- libnss_db-2.2.so
|   |-- libnss_db.so.2 -> libnss_db-2.2.so
|   |-- libnss_dns-2.2.5.so
|   |-- libnss_dns.so.2 -> libnss_dns-2.2.5.so
|   |-- libnss_files-2.2.5.so
|   |-- libnss_files.so.2 -> libnss_files-2.2.5.so
|   |-- libnss_hesiod-2.2.5.so
|   |-- libnss_hesiod.so.2 -> libnss_hesiod-2.2.5.so
|   |-- libnss_nis-2.2.5.so
|   |-- libnss_nis.so.2 -> libnss_nis-2.2.5.so
|   |-- libnss_nisplus-2.2.5.so
|   |-- libnss_nisplus.so.2 -> libnss_nisplus-2.2.5.so
|   |-- libpam.so.0 -> libpam.so.0.72
|   |-- libpam.so.0.72
|   |-- libpthread-0.9.so
|   |-- libpthread.so.0 -> libpthread-0.9.so
|   |-- libresolv-2.2.5.so
|   |-- libresolv.so.2 -> libresolv-2.2.5.so
|   |-- librt-2.2.5.so
|   |-- librt.so.1 -> librt-2.2.5.so
|   |-- libutil-2.2.5.so
|   |-- libutil.so.1 -> libutil-2.2.5.so
|   |-- libwrap.so.0 -> libwrap.so.0.7.6
|   |-- libwrap.so.0.7.6
|   `-- security
|       |-- pam_access.so
|       |-- pam_chroot.so
|       |-- pam_deny.so
|       |-- pam_env.so
|       |-- pam_filter.so
|       |-- pam_ftp.so
|       |-- pam_group.so
|       |-- pam_issue.so
|       |-- pam_lastlog.so
|       |-- pam_limits.so
|       |-- pam_listfile.so
|       |-- pam_mail.so
|       |-- pam_mkhomedir.so
|       |-- pam_motd.so
|       |-- pam_nologin.so
|       |-- pam_permit.so
|       |-- pam_rhosts_auth.so
|       |-- pam_rootok.so
|       |-- pam_securetty.so
|       |-- pam_shells.so
|       |-- pam_stress.so
|       |-- pam_tally.so
|       |-- pam_time.so
|       |-- pam_unix.so
|       |-- pam_unix_acct.so -> pam_unix.so
|       |-- pam_unix_auth.so -> pam_unix.so
|       |-- pam_unix_passwd.so -> pam_unix.so
|       |-- pam_unix_session.so -> pam_unix.so
|       |-- pam_userdb.so
|       |-- pam_warn.so
|       `-- pam_wheel.so
|-- sbin
|   `-- start-stop-daemon
|-- usr
|   |-- bin
|   |   |-- dircolors
|   |   |-- du
|   |   |-- install
|   |   |-- link
|   |   |-- mkfifo
|   |   |-- shred
|   |   |-- touch -> /bin/touch
|   |   `-- unlink
|   |-- lib
|   |   |-- libcrypto.so.0.9.6
|   |   |-- libdb3.so.3 -> libdb3.so.3.0.2
|   |   |-- libdb3.so.3.0.2
|   |   |-- libz.so.1 -> libz.so.1.1.4
|   |   `-- libz.so.1.1.4
|   |-- sbin
|   |   `-- sshd
|   `-- share
|       |-- locale
|       |   `-- es
|       |       |-- LC_MESSAGES
|       |       |   |-- fileutils.mo
|       |       |   |-- libc.mo
|       |       |   `-- sh-utils.mo
|       |       `-- LC_TIME -> LC_MESSAGES
|       `-- zoneinfo
|           `-- Europe
|               `-- Madrid
`-- var
    `-- run
        |-- sshd
        `-- sshd.pid

27 directories, 733 files
</example>

<p>Per la distribuzione di Debian 3.1, assicuratevi che l'ambiente includa
anche i file comuni per PAM. I seguenti file devono essere copiati
all'interno del chroot se <prgn>makejail</prgn> non lo ha fatto per
voi:

<example>
$ ls /etc/pam.d/common-*
/etc/pam.d/common-account  /etc/pam.d/common-password
/etc/pam.d/common-auth     /etc/pam.d/common-session
</example>






<sect>Ambiente fatto a mano (nella maniera più brutale)

<p>&Egrave; possibile creare un ambiente chroot usando un metodo per tentativo ed
errori, monitorando i tracciati ed i file di log del server <prgn>sshd</prgn>,
in modo da determinare i file necessari. L'ambiente seguente, fornito da 
José Luis Ledesma, è un elenco di file di esempio in un ambiente 
<prgn>chroot</prgn> per <prgn>ssh</prgn> in 
Debian woody (3.0)<footnote>
Notate che non ci sono file SETUID. Questo rende più difficile
uscire dall'ambiente <prgn>chroot</prgn> agli utenti remoti. Tuttavia
impedisce anche agli utenti di cambiare le loro password, visto che
il programma <prgn>passwd</prgn> non può modificare i file 
<file>/etc/passwd</file> o <file>/etc/shadow</file>.
</footnote>:

<example>
.:
total 36
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ./
drwxr-xr-x 11 root root 4096 Jun 3 13:43 ../
drwxr-xr-x 2 root root 4096 Jun 4 12:13 bin/
drwxr-xr-x 2 root root 4096 Jun 4 12:16 dev/
drwxr-xr-x 4 root root 4096 Jun 4 12:35 etc/
drwxr-xr-x 3 root root 4096 Jun 4 12:13 lib/
drwxr-xr-x 2 root root 4096 Jun 4 12:35 sbin/
drwxr-xr-x 2 root root 4096 Jun 4 12:32 tmp/
drwxr-xr-x 2 root root 4096 Jun 4 12:16 usr/
./bin:
total 8368
drwxr-xr-x 2 root root 4096 Jun 4 12:13 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rwxr-xr-x 1 root root 109855 Jun 3 13:45 a2p*
-rwxr-xr-x 1 root root 387764 Jun 3 13:45 bash*
-rwxr-xr-x 1 root root 36365 Jun 3 13:45 c2ph*
-rwxr-xr-x 1 root root 20629 Jun 3 13:45 dprofpp*
-rwxr-xr-x 1 root root 6956 Jun 3 13:46 env*
-rwxr-xr-x 1 root root 158116 Jun 3 13:45 fax2ps*
-rwxr-xr-x 1 root root 104008 Jun 3 13:45 faxalter*
-rwxr-xr-x 1 root root 89340 Jun 3 13:45 faxcover*
-rwxr-xr-x 1 root root 441584 Jun 3 13:45 faxmail*
-rwxr-xr-x 1 root root 96036 Jun 3 13:45 faxrm*
-rwxr-xr-x 1 root root 107000 Jun 3 13:45 faxstat*
-rwxr-xr-x 1 root root 77832 Jun 4 11:46 grep*
-rwxr-xr-x 1 root root 19597 Jun 3 13:45 h2ph*
-rwxr-xr-x 1 root root 46979 Jun 3 13:45 h2xs*
-rwxr-xr-x 1 root root 10420 Jun 3 13:46 id*
-rwxr-xr-x 1 root root 4528 Jun 3 13:46 ldd*
-rwxr-xr-x 1 root root 111386 Jun 4 11:46 less*
-r-xr-xr-x 1 root root 26168 Jun 3 13:45 login*
-rwxr-xr-x 1 root root 49164 Jun 3 13:45 ls*
-rwxr-xr-x 1 root root 11600 Jun 3 13:45 mkdir*
-rwxr-xr-x 1 root root 24780 Jun 3 13:45 more*
-rwxr-xr-x 1 root root 154980 Jun 3 13:45 pal2rgb*
-rwxr-xr-x 1 root root 27920 Jun 3 13:46 passwd*
-rwxr-xr-x 1 root root 4241 Jun 3 13:45 pl2pm*
-rwxr-xr-x 1 root root 2350 Jun 3 13:45 pod2html*
-rwxr-xr-x 1 root root 7875 Jun 3 13:45 pod2latex*
-rwxr-xr-x 1 root root 17587 Jun 3 13:45 pod2man*
-rwxr-xr-x 1 root root 6877 Jun 3 13:45 pod2text*
-rwxr-xr-x 1 root root 3300 Jun 3 13:45 pod2usage*
-rwxr-xr-x 1 root root 3341 Jun 3 13:45 podchecker*
-rwxr-xr-x 1 root root 2483 Jun 3 13:45 podselect*
-r-xr-xr-x 1 root root 82412 Jun 4 11:46 ps*
-rwxr-xr-x 1 root root 36365 Jun 3 13:45 pstruct*
-rwxr-xr-x 1 root root 7120 Jun 3 13:45 pwd*
-rwxr-xr-x 1 root root 179884 Jun 3 13:45 rgb2ycbcr*
-rwxr-xr-x 1 root root 20532 Jun 3 13:45 rm*
-rwxr-xr-x 1 root root 6720 Jun 4 10:15 rmdir*
-rwxr-xr-x 1 root root 14705 Jun 3 13:45 s2p*
-rwxr-xr-x 1 root root 28764 Jun 3 13:46 scp*
-rwxr-xr-x 1 root root 385000 Jun 3 13:45 sendfax*
-rwxr-xr-x 1 root root 67548 Jun 3 13:45 sendpage*
-rwxr-xr-x 1 root root 88632 Jun 3 13:46 sftp*
-rwxr-xr-x 1 root root 387764 Jun 3 13:45 sh*
-rws--x--x 1 root root 744500 Jun 3 13:46 slogin*
-rwxr-xr-x 1 root root 14523 Jun 3 13:46 splain*
-rws--x--x 1 root root 744500 Jun 3 13:46 ssh*
-rwxr-xr-x 1 root root 570960 Jun 3 13:46 ssh-add*
-rwxr-xr-x 1 root root 502952 Jun 3 13:46 ssh-agent*
-rwxr-xr-x 1 root root 575740 Jun 3 13:46 ssh-keygen*
-rwxr-xr-x 1 root root 383480 Jun 3 13:46 ssh-keyscan*
-rwxr-xr-x 1 root root 39 Jun 3 13:46 ssh_europa*
-rwxr-xr-x 1 root root 107252 Jun 4 10:14 strace*
-rwxr-xr-x 1 root root 8323 Jun 4 10:14 strace-graph*
-rwxr-xr-x 1 root root 158088 Jun 3 13:46 thumbnail*
-rwxr-xr-x 1 root root 6312 Jun 3 13:46 tty*
-rwxr-xr-x 1 root root 55904 Jun 4 11:46 useradd*
-rwxr-xr-x 1 root root 585656 Jun 4 11:47 vi*
-rwxr-xr-x 1 root root 6444 Jun 4 11:45 whoami*
./dev:
total 8
drwxr-xr-x 2 root root 4096 Jun 4 12:16 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
crw-r--r-- 1 root root 1, 9 Jun 3 13:43 urandom
./etc:
total 208
drwxr-xr-x 4 root root 4096 Jun 4 12:35 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rw------- 1 root root 0 Jun 4 11:46 .pwd.lock
-rw-r--r-- 1 root root 653 Jun 3 13:46 group
-rw-r--r-- 1 root root 242 Jun 4 11:33 host.conf
-rw-r--r-- 1 root root 857 Jun 4 12:04 hosts
-rw-r--r-- 1 root root 1050 Jun 4 11:29 ld.so.cache
-rw-r--r-- 1 root root 304 Jun 4 11:28 ld.so.conf
-rw-r--r-- 1 root root 235 Jun 4 11:27 ld.so.conf~
-rw-r--r-- 1 root root 88039 Jun 3 13:46 moduli
-rw-r--r-- 1 root root 1342 Jun 4 11:34 nsswitch.conf
drwxr-xr-x 2 root root 4096 Jun 4 12:02 pam.d/
-rw-r--r-- 1 root root 28 Jun 4 12:00 pam_smb.conf
-rw-r--r-- 1 root root 2520 Jun 4 11:57 passwd
-rw-r--r-- 1 root root 7228 Jun 3 13:48 profile
-rw-r--r-- 1 root root 1339 Jun 4 11:33 protocols
-rw-r--r-- 1 root root 274 Jun 4 11:44 resolv.conf
drwxr-xr-x 2 root root 4096 Jun 3 13:43 security/
-rw-r----- 1 root root 1178 Jun 4 11:51 shadow
-rw------- 1 root root 80 Jun 4 11:45 shadow-
-rw-r----- 1 root root 1178 Jun 4 11:48 shadow.old
-rw-r--r-- 1 root root 161 Jun 3 13:46 shells
-rw-r--r-- 1 root root 1144 Jun 3 13:46 ssh_config
-rw------- 1 root root 668 Jun 3 13:46 ssh_host_dsa_key
-rw-r--r-- 1 root root 602 Jun 3 13:46 ssh_host_dsa_key.pub
-rw------- 1 root root 527 Jun 3 13:46 ssh_host_key
-rw-r--r-- 1 root root 331 Jun 3 13:46 ssh_host_key.pub
-rw------- 1 root root 883 Jun 3 13:46 ssh_host_rsa_key
-rw-r--r-- 1 root root 222 Jun 3 13:46 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 2471 Jun 4 12:15 sshd_config
./etc/pam.d:
total 24
drwxr-xr-x 2 root root 4096 Jun 4 12:02 ./
drwxr-xr-x 4 root root 4096 Jun 4 12:35 ../
lrwxrwxrwx 1 root root 4 Jun 4 12:02 other -> sshd
-rw-r--r-- 1 root root 318 Jun 3 13:46 passwd
-rw-r--r-- 1 root root 546 Jun 4 11:36 ssh
-rw-r--r-- 1 root root 479 Jun 4 12:02 sshd
-rw-r--r-- 1 root root 370 Jun 3 13:46 su
./etc/security:
total 32
drwxr-xr-x 2 root root 4096 Jun 3 13:43 ./
drwxr-xr-x 4 root root 4096 Jun 4 12:35 ../
-rw-r--r-- 1 root root 1971 Jun 3 13:46 access.conf
-rw-r--r-- 1 root root 184 Jun 3 13:46 chroot.conf
-rw-r--r-- 1 root root 2145 Jun 3 13:46 group.conf
-rw-r--r-- 1 root root 1356 Jun 3 13:46 limits.conf
-rw-r--r-- 1 root root 2858 Jun 3 13:46 pam_env.conf
-rw-r--r-- 1 root root 2154 Jun 3 13:46 time.conf
./lib:
total 8316
drwxr-xr-x 3 root root 4096 Jun 4 12:13 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rw-r--r-- 1 root root 1024 Jun 4 11:51 cracklib_dict.hwm
-rw-r--r-- 1 root root 214324 Jun 4 11:51 cracklib_dict.pwd
-rw-r--r-- 1 root root 11360 Jun 4 11:51 cracklib_dict.pwi
-rwxr-xr-x 1 root root 342427 Jun 3 13:46 ld-linux.so.2*
-rwxr-xr-x 1 root root 4061504 Jun 3 13:46 libc.so.6*
lrwxrwxrwx 1 root root 15 Jun 4 12:11 libcrack.so -> libcrack.so.2.7*
lrwxrwxrwx 1 root root 15 Jun 4 12:11 libcrack.so.2 -> libcrack.so.2.7*
-rwxr-xr-x 1 root root 33291 Jun 4 11:39 libcrack.so.2.7*
-rwxr-xr-x 1 root root 60988 Jun 3 13:46 libcrypt.so.1*
-rwxr-xr-x 1 root root 71846 Jun 3 13:46 libdl.so.2*
-rwxr-xr-x 1 root root 27762 Jun 3 13:46 libhistory.so.4.0*
lrwxrwxrwx 1 root root 17 Jun 4 12:12 libncurses.so.4 -> libncurses.so.4.2*
-rwxr-xr-x 1 root root 503903 Jun 3 13:46 libncurses.so.4.2*
lrwxrwxrwx 1 root root 17 Jun 4 12:12 libncurses.so.5 -> libncurses.so.5.0*
-rwxr-xr-x 1 root root 549429 Jun 3 13:46 libncurses.so.5.0*
-rwxr-xr-x 1 root root 369801 Jun 3 13:46 libnsl.so.1*
-rwxr-xr-x 1 root root 142563 Jun 4 11:49 libnss_compat.so.1*
-rwxr-xr-x 1 root root 215569 Jun 4 11:49 libnss_compat.so.2*
-rwxr-xr-x 1 root root 61648 Jun 4 11:34 libnss_dns.so.1*
-rwxr-xr-x 1 root root 63453 Jun 4 11:34 libnss_dns.so.2*
-rwxr-xr-x 1 root root 63782 Jun 4 11:34 libnss_dns6.so.2*
-rwxr-xr-x 1 root root 205715 Jun 3 13:46 libnss_files.so.1*
-rwxr-xr-x 1 root root 235932 Jun 3 13:49 libnss_files.so.2*
-rwxr-xr-x 1 root root 204383 Jun 4 11:33 libnss_nis.so.1*
-rwxr-xr-x 1 root root 254023 Jun 4 11:33 libnss_nis.so.2*
-rwxr-xr-x 1 root root 256465 Jun 4 11:33 libnss_nisplus.so.2*
lrwxrwxrwx 1 root root 14 Jun 4 12:12 libpam.so.0 -> libpam.so.0.72*
-rwxr-xr-x 1 root root 31449 Jun 3 13:46 libpam.so.0.72*
lrwxrwxrwx 1 root root 19 Jun 4 12:12 libpam_misc.so.0 ->
libpam_misc.so.0.72*
-rwxr-xr-x 1 root root 8125 Jun 3 13:46 libpam_misc.so.0.72*
lrwxrwxrwx 1 root root 15 Jun 4 12:12 libpamc.so.0 -> libpamc.so.0.72*
-rwxr-xr-x 1 root root 10499 Jun 3 13:46 libpamc.so.0.72*
-rwxr-xr-x 1 root root 176427 Jun 3 13:46 libreadline.so.4.0*
-rwxr-xr-x 1 root root 44729 Jun 3 13:46 libutil.so.1*
-rwxr-xr-x 1 root root 70254 Jun 3 13:46 libz.a*
lrwxrwxrwx 1 root root 13 Jun 4 12:13 libz.so -> libz.so.1.1.3*
lrwxrwxrwx 1 root root 13 Jun 4 12:13 libz.so.1 -> libz.so.1.1.3*
-rwxr-xr-x 1 root root 63312 Jun 3 13:46 libz.so.1.1.3*
drwxr-xr-x 2 root root 4096 Jun 4 12:00 security/
./lib/security:
total 668
drwxr-xr-x 2 root root 4096 Jun 4 12:00 ./
drwxr-xr-x 3 root root 4096 Jun 4 12:13 ../
-rwxr-xr-x 1 root root 10067 Jun 3 13:46 pam_access.so*
-rwxr-xr-x 1 root root 8300 Jun 3 13:46 pam_chroot.so*
-rwxr-xr-x 1 root root 14397 Jun 3 13:46 pam_cracklib.so*
-rwxr-xr-x 1 root root 5082 Jun 3 13:46 pam_deny.so*
-rwxr-xr-x 1 root root 13153 Jun 3 13:46 pam_env.so*
-rwxr-xr-x 1 root root 13371 Jun 3 13:46 pam_filter.so*
-rwxr-xr-x 1 root root 7957 Jun 3 13:46 pam_ftp.so*
-rwxr-xr-x 1 root root 12771 Jun 3 13:46 pam_group.so*
-rwxr-xr-x 1 root root 10174 Jun 3 13:46 pam_issue.so*
-rwxr-xr-x 1 root root 9774 Jun 3 13:46 pam_lastlog.so*
-rwxr-xr-x 1 root root 13591 Jun 3 13:46 pam_limits.so*
-rwxr-xr-x 1 root root 11268 Jun 3 13:46 pam_listfile.so*
-rwxr-xr-x 1 root root 11182 Jun 3 13:46 pam_mail.so*
-rwxr-xr-x 1 root root 5923 Jun 3 13:46 pam_nologin.so*
-rwxr-xr-x 1 root root 5460 Jun 3 13:46 pam_permit.so*
-rwxr-xr-x 1 root root 18226 Jun 3 13:46 pam_pwcheck.so*
-rwxr-xr-x 1 root root 12590 Jun 3 13:46 pam_rhosts_auth.so*
-rwxr-xr-x 1 root root 5551 Jun 3 13:46 pam_rootok.so*
-rwxr-xr-x 1 root root 7239 Jun 3 13:46 pam_securetty.so*
-rwxr-xr-x 1 root root 6551 Jun 3 13:46 pam_shells.so*
-rwxr-xr-x 1 root root 55925 Jun 4 12:00 pam_smb_auth.so*
-rwxr-xr-x 1 root root 12678 Jun 3 13:46 pam_stress.so*
-rwxr-xr-x 1 root root 11170 Jun 3 13:46 pam_tally.so*
-rwxr-xr-x 1 root root 11124 Jun 3 13:46 pam_time.so*
-rwxr-xr-x 1 root root 45703 Jun 3 13:46 pam_unix.so*
-rwxr-xr-x 1 root root 45703 Jun 3 13:46 pam_unix2.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_acct.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_auth.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_passwd.so*
-rwxr-xr-x 1 root root 45386 Jun 3 13:46 pam_unix_session.so*
-rwxr-xr-x 1 root root 9726 Jun 3 13:46 pam_userdb.so*
-rwxr-xr-x 1 root root 6424 Jun 3 13:46 pam_warn.so*
-rwxr-xr-x 1 root root 7460 Jun 3 13:46 pam_wheel.so*
./sbin:
total 3132
drwxr-xr-x 2 root root 4096 Jun 4 12:35 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
-rwxr-xr-x 1 root root 178256 Jun 3 13:46 choptest*
-rwxr-xr-x 1 root root 184032 Jun 3 13:46 cqtest*
-rwxr-xr-x 1 root root 81096 Jun 3 13:46 dialtest*
-rwxr-xr-x 1 root root 1142128 Jun 4 11:28 ldconfig*
-rwxr-xr-x 1 root root 2868 Jun 3 13:46 lockname*
-rwxr-xr-x 1 root root 3340 Jun 3 13:46 ondelay*
-rwxr-xr-x 1 root root 376796 Jun 3 13:46 pagesend*
-rwxr-xr-x 1 root root 13950 Jun 3 13:46 probemodem*
-rwxr-xr-x 1 root root 9234 Jun 3 13:46 recvstats*
-rwxr-xr-x 1 root root 64480 Jun 3 13:46 sftp-server*
-rwxr-xr-x 1 root root 744412 Jun 3 13:46 sshd*
-rwxr-xr-x 1 root root 30750 Jun 4 11:46 su*
-rwxr-xr-x 1 root root 194632 Jun 3 13:46 tagtest*
-rwxr-xr-x 1 root root 69892 Jun 3 13:46 tsitest*
-rwxr-xr-x 1 root root 43792 Jun 3 13:46 typetest*
./tmp:
total 8
drwxr-xr-x 2 root root 4096 Jun 4 12:32 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
./usr:
total 8
drwxr-xr-x 2 root root 4096 Jun 4 12:16 ./
drwxr-xr-x 9 root root 4096 Jun 5 10:05 ../
lrwxrwxrwx 1 root root 7 Jun 4 12:14 bin -> ../bin//
lrwxrwxrwx 1 root root 7 Jun 4 11:33 lib -> ../lib//
lrwxrwxrwx 1 root root 8 Jun 4 12:13 sbin -> ../sbin//
</example>





<appendix id="chroot-apache-env">Ambiente <prgn>Chroot</prgn>
                                 per <prgn>Apache</prgn>


<sect>Introduzione

<p>L'utilità <prgn>chroot</prgn> viene usata spesso per imprigionare un
demone in un settore
sottoposto a limitazioni, per isolare reciprocamente dei servizi, in modo
che problemi di sicurezza in un pacchetto software non mettano in pericolo
l'intero server. Usando lo script <prgn>makejail</prgn>, impostare ed
aggiornare la zona sottoposta a chroot è più facile.

<p>FIXME: Apache può essere messo in chroot usando 
<url id="http://www.modsecurity.org"> che è disponibile in 
<package>libapache-mod-security</package> (per Apache 1.x) e 
<package>libapache2-mod-security</package> (per Apache 2.x).



<sect1>Licenza

<p>Questo documento è stato sottoposto nel 2002 a diritto d'autore da 
Alexandre Ratti, è stato rilasciato sotto la doppia licenza, GPL 
versione 2 (GNU General Public License) e GNU-FDL versione 1.2 (GNU 
Free Documentation Licence - Licenza sulla libera documentazione 
GNU), vengono incluse in questo manuale con espresso consenso
(dal <url id="http://www.gabuzomeu.net/alex/doc/apache/index-en.html"
name="documento originale">).


</sect1>
</sect>

<sect>Installare il server

<p>
Questa procedura è stata provata su Debian GNU/Linux&nbsp;3.0 (Woody) con
<prgn>makejail</prgn> 0.0.4-1 (in Debian/testing).

<list>

<item><p>Autenticatevi come <prgn>root</prgn> e creare una nuova
         directory-gabbia:

<example>
$ mkdir -p /var/chroot/apache
</example>

 

<item>
<p>Create un nuovo utente ed un nuovo gruppo. Il server Apache sottoposto a
"chroot" sarà attivo in qualità di nuovo utente/gruppo, usato, nel sistema,
solo a questo fine. In questo esempio, entrambi vengono chiamati 
<prgn>chrapach</prgn>.


 <example> 
 $ adduser --home /var/chroot/apache --shell /bin/false \
 --no-create-home --system --group chrapach
 </example>

<p>FIXME: Occorre un nuovo utente? Apache è già attivo come utente Apache.

  

<item>Installate Apache come d'uso, su Debian: <tt>apt-get install apache</tt>.
<item>Impostate Apache (definite i vostri sottodomini, etc.) e, nel file di
configurazione <file>/etc/apache/httpd.conf</file>, impostate 
<em>Group</em> ed <em>User</em> come <tt>chrapach</tt>. 
Riavviate Apache ed assicuratevi che funzioni correttamente.
A questo punto, fermate il demone Apache.
<item>Installate <prgn>makejail</prgn> (disponibile, per ora, in
Debian/testing) ed anche <prgn>wget</prgn> e <prgn>lynx</prgn>, 
giacché vengono usati da <prgn>makejail</prgn> per collaudare il server
sottoposto a "chroot": <tt>apt-get install makejail wget lynx</tt>.
<item>Copiate il file della configurazione esemplificativa per Apache nella
cartella <file>/etc/makejail</file>:

 <example> 
 # cp/usr/share/doc/makejail/examples/apache.py /etc/makejail/ 
 </example>


 
<item>Modificate <file>/etc/makejail/apache.py</file>, cambiando 
le opzioni di <em>chroot</em>, <em>users</em> e <em>groups</em>. Per 
eseguire questa versione di <prgn>makejail</prgn>, potete aggiungere 
anche l'opzione <prgn>packages</prgn>. Vedete nella 
<url id="http://www.floc.net/makejail/current/doc/" 
name="documentazione di makejail">. Un esempio potrebbe essere questo: 

<example>
chroot=&quot;/var/chroot/apache&quot;
testCommandsInsideJail=[&quot;/usr/sbin/apachectl start&quot;]
processNames=[&quot;apache&quot;]
testCommandsOutsideJail=[&quot;wget -r --spider http://localhost/&quot;,
                         &quot;lynx --source https://localhost/&quot;]
preserve=[&quot;/var/www&quot;,
          &quot;/var/log/apache&quot;,
          &quot;/dev/log&quot;]
users=[&quot;chrapach&quot;]
groups=[&quot;chrapach&quot;]
packages=[&quot;apache&quot;, &quot;apache-common&quot;]
userFiles=[&quot;/etc/password&quot;,
           &quot;/etc/shadow&quot;]
groupFiles=[&quot;/etc/group&quot;,
            &quot;/etc/gshadow&quot;]
forceCopy=[&quot;/etc/hosts&quot;,
           &quot;/etc/mime.types&quot;]
</example>

<p><em>FIXME:</em> pare che alcune opzioni non funzionino correttamente.
Per esempio, <file>/etc/shadow</file> e <file>/etc/gshadow</file>
non vengono copiate, mentre <file>/etc/password</file> e
<file>/etc/group</file> sono state copiate completamente, invece 
di essere filtrate.

 
 
<item>Create il sottoalbero sottoposto a chroot: 
<tt>makejail /etc/makejail/apache.py</tt>
<item>Qualora <file>/etc/password</file> ed <file>/etc/group</file> 
siano stati copiati completamente, per sostituirli con copie filtrate,
digitate:

      <example>
      $ grep chrapach /etc/passwd &gt; /var/chroot/apache/etc/passwd
      $ grep chrapach /etc/group &gt; /var/chroot/apache/etc/group
      </example>

<item>Copiate le pagine del sito web ed i file di log nella "gabbia"; 
quei file non vengono copiati automaticamente (vedete l'opzione 
<em>preserve</em> nel file di configurazione di <prgn>makejail</prgn>).

      <example>
      # cp -Rp /var/www /var/chroot/apache/var
      # cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache
      </example>
  

<item>Modificate lo script di avvio per il demone incaricato della registrazione
dei log di sistema, in modo che ascolti anche il socket 
<file>/var/chroot/apache/dev/log</file>.
In <file>/etc/default/syslogd</file>, sostituite <tt>SYSLOGD=&quot;&quot;</tt>
con <tt>SYSLOGD=&quot; -a /var/chroot/apache/dev/log&quot;</tt> e 
riavviate il demone con il comando <tt>/etc/init.d/sysklogd restart</tt>.
<item>Modificate lo script di avvio di Apache 
(<file>/etc/init.d/apache</file>). Per il corretto funzionamento in 
chroot potrebbero rendersi necessari alcuni cambiamenti, come ad 
esempio:

    <list>
      <item><p>Impostare una nuova variabile <em>CHRDIR</em> all'inizio del file;
      <item><p>Modificare le sezioni <em>start</em>, 
            <em>stop</em>, <em>reload</em>, etc.
      <item><p>Aggiungere una riga per montare e smontare il 
            filesystem <file>/proc</file> all'interno della gabbia chroot.

    </list>
<example>
#! /bin/bash
#
# apache        Start the apache HTTP server.
#

CHRDIR=/var/chroot/apache

NAME=apache
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/sbin/apache
SUEXEC=/usr/lib/apache/suexec
PIDFILE=/var/run/$NAME.pid
CONF=/etc/apache/httpd.conf
APACHECTL=/usr/sbin/apachectl 

trap "" 1
export LANG=C
export PATH

test -f $DAEMON || exit 0
test -f $APACHECTL || exit 0

# ensure we don't leak environment vars into apachectl
APACHECTL="env -i LANG=${LANG} PATH=${PATH} chroot $CHRDIR $APACHECTL"

if egrep -q -i "^[[:space:]]*ServerType[[:space:]]+inet" $CONF
then
    exit 0
fi

case "$1" in
  start)
    echo -n "Starting web server: $NAME"
    mount -t proc proc /var/chroot/apache/proc
    start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON \
      --chroot $CHRDIR
    ;;

  stop)
    echo -n "Stopping web server: $NAME"
    start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo
    umount /var/chroot/apache/proc
    ;;

  reload)
    echo -n "Reloading $NAME configuration"
    start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" \
      --signal USR1 --startas $DAEMON --chroot $CHRDIR
    ;;

  reload-modules)
    echo -n "Reloading $NAME modules"
    start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo \
      --retry 30
    start-stop-daemon --start --pidfile $PIDFILE \
      --exec $DAEMON --chroot $CHRDIR
    ;;

  restart)
    $0 reload-modules
    exit $?
    ;;

  force-reload)
    $0 reload-modules
    exit $?
    ;;

  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|reload|reload-modules|force-reload|restart}"
    exit 1
    ;;
esac

if [ $? == 0 ]; then
  echo .
  exit 0
else
  echo failed
  exit 1
fi
</example>

<p><em>FIXME</em>: Il primo processo di Apache
dovrebbe essere lanciato da un utente
diverso da root ( ossia add --chuid chrapach:chrapach)? 
Consiglio: chrapach non avrà bisogno di accesso in scrittura ai log.

  

<item>In <file>/etc/logrotate.d/apache</file> sostituite
<tt>/var/log/apache/*.log</tt> con 
<tt>/var/chroot/apache/var/log/apache/*.log</tt>
<item>Lanciate Apache (<prgn>/etc/init.d/apache start</prgn>) e
controllate cosa viene riportato nei log della gabbia
(<file>/var/chroot/apache/var/log/apache/error.log</file>). Se
la vostra configurazione fosse più complessa, (ossia usate anche PHP e MySQL),
probabilmente mancheranno dei file. Se alcuni file non vengono copiati
automaticamente da <prgn>makejail</prgn>, potete elencarli nell'opzione 
<em>forceCopy</em> (per copiarli direttamente) o <em>packages</em> 
(per copiare interi pacchetti con le loro dipendenze) nel file di 
configurazione <file>/etc/makejail/apache.py</file>.
<item>Scrivete <tt>ps aux | grep apache</tt> per assicurarvi che Apache stia girando.
Dovreste vedere qualcosa tipo:

      <example>
      root 180 0.0 1.1 2936 1436 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 189 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 190 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 191 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 192 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      chrapach 193 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
      </example>
  

<item>Assicuratevi che i processi di Apache stiano girando in chroot 
guardando nel filesystem <file>/proc</file>: 
<tt>ls -la /proc/<em>process_number</em>/root/.</tt> dove 
<em>process_number</em> è uno dei PID elencati sopra (seconda colonna; 
189 per esempio). Dovrebbero esservi elencate le directory di un albero
ristretto: 

   <example>
    drwxr-sr-x 10 root staff 240 Dec 2 16:06 .
    drwxrwsr-x 4 root staff 72 Dec 2 08:07 ..
    drwxr-xr-x 2 root root 144 Dec 2 16:05 bin
    drwxr-xr-x 2 root root 120 Dec 3 04:03 dev
    drwxr-xr-x 5 root root 408 Dec 3 04:03 etc
    drwxr-xr-x 2 root root 800 Dec 2 16:06 lib
    dr-xr-xr-x 43 root root 0 Dec 3 05:03 proc
    drwxr-xr-x 2 root root 48 Dec 2 16:06 sbin
    drwxr-xr-x 6 root root 144 Dec 2 16:04 usr
    drwxr-xr-x 7 root root 168 Dec 2 16:06 var
    </example>
<p>
Per automatizzare questo test, potete scrivere: 
<tt>ls -la /proc/`cat /var/chroot/apache/var/run/apache.pid`/root/.</tt>
<p>
<em>FIXME</em>: Aggiungere altri test da far girare per assicurarsi che 
la gabbia chroot sia chiusa?

	
</list>

<p>
Il motivo per cui mi piace è perché impostare la gabbia non è poi così
difficile ed il server può essere aggiornato con due sole righe:

<example> 
apt-get update &amp;&amp; apt-get install apache
makejail /etc/makejail/apache.py
</example>

</sect>




<sect>Vedete anche

<p>
Se cercate maggiori informazioni potete provare anche queste fonti:

<list>

<item><url id="http://www.floc.net/makejail/" name="makejail homepage">, 
questo programma è stato scritto da Alan Tesio)

</list>



<appendix id="traduzione">Changelog della traduzione

<sect>Versione 3.13 - ottobre 2008

<p>Il coordinamento e la revisione della traduzione è stato 
effettuato da Ferdinando Ferranti 
<email>zappagalattica@inwind.it</email>, hanno tradotto il documento: 


Davide                          <email>lists4davide@gmail.com</email>,
Damiano Biagioli                <email>damiano_biagioli@libero.it</email>,
Bl@ster				<email>dottorblaster@gmail.com</email>,
Gabriele 'LightKnight' Stilli   <email>superenzima@libero.it</email>,
Paolo Massei			<email>mozambo@gmail.com</email>,
Pierluigi teppisti-xpla		<email>xpla@teppisti.it</email> ed
Andrea Zagli                    <email>azagli@inwind.it</email>.

<p>Il manutentore della traduzione: Stefano Canepa <email>sc@linux.it</email>.

<p>Per segnalare errori, per offrirsi come volontario per un 
aggiornamento, per revisionare o per qualsiasi altra cosa vi possa 
venire in mente per contribuire a questa traduzione:
<email>debian-l10n-italian@lists.debian.org</email> 
(o contattate direttamente Stefano...).







<sect>Versione 2.97 - aprile 2003

<p>Il coordinamento e la revisione della traduzione è stato 
effettuato da Ferdinando Ferranti 
<email>zappagalattica@inwind.it</email>, hanno tradotto il documento: 




CarloS <email>enne.enne@tiscalinet.it</email>,
Stefano Canepa <email>sc@linux.it</email>,
Morpheus <email>matrixhasu@libero.it</email>,
Spooky,
Leonardo Canducci <email>lcanducci@libero.it</email>,
Alessandro Melillo <email>alemelo@fastmail.fm</email>, 
Davide Alessio <email>dalessio@softhome.net</email>,
Luigi Bonanno <email>hsaybo@tin.it</email>,
Gavrila <email>gavrilus@tiscalinet.it</email>,
Giacinto Lorusso <email>giacintolorusso@yahoo.it</email>,
Giuseppe Palmieri <email>gpalm@iol.it</email>,
Riccardo Corso <email>rixx@inwind.it</email>,
Stefano Mioli <email>stevie@e4a.it</email>,
Pengz  <email>pengol[at]inwind.it</email>,
Fabio Rapposelli <email>frapposelli@hi-net.it</email>.

<p>Il manutentore della traduzione: Stefano Canepa <email>sc@linux.it</email>.

