Il processo di blindatura passo-passo

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 . 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. Utilizzando dselect, 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. Aggiornate tutti i programmi dal più recente pacchetto disponibile da security.debian.org come spiegato precedentemente in . Applicate i suggerimenti presentati in questo manuale al riguardo delle quote utente, definizioni di login e lilo.

Compilate una lista di servizi attivi al momento sul sistema. Eseguite:

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

In questo caso è necessario installare `lsof-2.2` per avere a disposizione il comando (che lavorerà da root). Dovreste fare attenzione che lsof potrebbe tradurre il termine LISTEN secondo le vostre impostazioni locali. 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 lsof e dpkg, fa proprio questo:

#!/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
Una volta che avete individuato un qualsiasi servizio che non volete fornire, rimuovete il pacchetto che lo genera (con dpkg --purge), o disabilitate la partenza automatica del servizio all'avvio del sistema utilizzando update-rc.d (vedete in ). Per i servizi avviati da inetd (lanciati tramite il superdemone), verificate che i servizi siano abilitati in /etc/inetd.conf, utilizzando:
$ grep -v "^#" /etc/inetd.conf | sort -u
Per disabilitare quei servizi che non desiderate è necessario commentare le righe dello script che li avviano in /etc/inetd.conf, altrimenti, rimuovere il pacchetto che fornisce il servizio, o utilizzare update-inetd. Se avete servizi wrapped (quelli che usano /usr/sbin/tcpd), verificate che i file /etc/hosts.allow e /etc/hosts.deny siano configurati in accordo con la vostra politica di sicurezza. 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). Riavviate la macchina, o commutate sulla modalità monoutente e quindi tornate a quella multiutente, utilizzando i comandi:
$ init 1 (....) $ init 2

Controllate i servizi adesso disponibili e se necessario, ripetete i passi appena esposti.

Ora installate i servizi che ritenete necessari, se non avete già agito così e configurateli appropriatamente.

Usate il seguente comando da shell, per determinare con quale identità ogni servizio disponibile sta girando:

# 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

Valutate l'opportunità di modificare questi servizi associandoli a specifici utenti/gruppi mediante gabbie chroot per avere maggior sicurezza. Potete farlo modificando lo script /etc/init.d che avvia il servizio. La maggior parte dei servizi in Debian usano start-stop-daemon che ha l'opzione (`--change-uid` e `--chroot`) per apportare le modifiche di cui sopra. Alcuni avvertimenti al riguardo dei servizi in chroot: 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 chroot. Le informazioni per configurare un ambiente chroot per il programma ssh possono essere trovate in . 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. Verificate i servizi installati per controllare che funzionino come avete previsto. Controllate il sistema con un rilevatore di vulnerabilità (come `nessus`), al fine di determinare le vulnerabilità nel sistema (p.e. errate configurazioni, servizi vecchi o non necessari). Installate rilevatori di intrusioni su macchine e su reti come `snort` e `logsentry`. Ripetete la sequenza dell'esame della rete e verificate che i sistemi di rilevamento delle intrusioni stiano funzionando correttamente.

Se siete persone realmente paranoiche dovreste valutare anche quanto segue: Aggiungere funzionalità "firewall" al sistema, accettando connessioni in ingresso solo per servizi offerti e limitando le connessioni uscenti alle sole autorizzate. Ricontrollare l'installazione con una nuova verifica di vulnerabilità usando uno scanner di rete. 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.

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.

Verifica della configurazione

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 ed il .

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

Limitate le capacità di avvio e di accesso fisico Abilitate la password del BIOS Disabilitate l'avvio da floppy/cdrom/ ... Impostate una password per GRUB o LILO (rispettivamente /etc/lilo.conf o /boot/grub/menu.lst); verificate che i file di configurazione di LILO o GRUB siano protetti da scrittura. Partizionamento Separate i dati scrivibili dagli utenti, i dati non di sistema e i dati run-time che cambiano velocemente, in partizioni distinte. Impostate le opzioni di mount `nosuid,noexec,nodev` in /etc/fstab per partizioni ext2/3 che non dovrebbero bloccare binari come /home o /tmp. Accuratezza delle password e sicurezza per il login Assegnate a root una buona password. Abilitate il password shadowing e l'MD5. Installate ed utilizzate PAM. Aggiungete il supporto per MD5 a PAM e assicuratevi che (in generale) le voci nel file /etc/pam.d/, che garantiscono l'accesso alla macchina, abbiano il secondo campo nel file pam.d impostato a `requisite` o `required`. Modificate /etc/pam.d/login in modo che permetta il login solamente a root solamente in locale. Inoltre segnate le tty:s autorizzate nel file /etc/security/access.conf e in generale configurate il file affinché le login da root siano limitate il più possibile. Aggiungete pam_limits.so se volete impostare un limite per ciascun utente. Modificate /etc/pam.d/passwd: aumentate la lunghezza minima delle passwords (6 caratteri probabilmente) e abilitate l'MD5. Aggiungete il gruppo wheel a /etc/group se lo desiderate; aggiungete la voce pam_wheel.so group=wheel in /etc/pam.d/su. Per personalizzare i controlli relativi a ciascun utente, usate un'apposita voce pam_listfile.so dove appropriato. Create un file /etc/pam.d/other e configuratelo con un'alta sicurezza. Impostate i limiti /etc/security/limits.conf (notate che /etc/limits non viene utilizzato se usate PAM). Limitate i permessi al file /etc/login.defs; inoltre, se avete abilitato MD5 e/o PAM, assicuratevi di fare i cambiamenti corrispondenti. Disabilitate l'accesso root via ftp in /etc/ftpusers. Disabilitate l'accesso root dalla rete; usate oppure . Considerate l'opportunità di installare `sudo`. Usate PAM per rendere più sicuri gli accessi con login? Altri suggerimenti sulla sicurezza locale Adattamenti del kernel (vedete in ). Patch per il kernel (vedete in ). Rendete più restrittivi i permessi ai file di log (/var/log/{last,fail}log, i log di Apache) Verificate che il controllo SETUID sia abilitato in /etc/checksecurity.conf. 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). Configurate il controllo sull'integrità dei file (vedete in ). Installate `debsums`. Loggare tutto su una stampante locale? Scrivere su un CD avviabile la propria configurazione e fare il boot da CD? Disabilitare i moduli del kernel? Limitate l'accesso alla rete Installate e configurate ssh (si suggerisce di impostare a No le voci PermitRootLogin e PermitEmptyPasswords nel file /etc/ssh/sshd_config; notate anche gli altri suggerimenti nel testo). Considerate la possibilità di disabilitare o rimuovere in.telnetd, se installato. In linea di massima, disabilitate i servizi inutili in /etc/inetd.conf usando update-inetd --disable (oppure disabilitate inetd completamente, o ancora usate un sostituto come ad esempio xinetd o rlinetd). Disabilitate altri servizi di rete inutili; ftp, DNS, WWW etc. non dovrebbero essere eseguiti se non sono necessari e peraltro, tenuti regolarmente sotto controllo. 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. Impostate gabbie chroot per utenti e demoni esterni. Configurate firewall e tcpwrappers (per esempio ); notate il trucco per /etc/hosts.deny nel testo. Se eseguite ftp, impostate il server ftpd per essere eseguito sempre in chroot nella home directory dell'utente. Se usate X, disabilitate l'autenticazione xhost ed usate ssh 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 /etc/X11/xdm/xdm-config impostando a 0 la requestPort). Disabilitate l'accesso dall'esterno alle stampanti. Effettuate il tunneling di qualsiasi sezione POP o IMAP attraverso SSL o ssh; installate stunnel se volete fornire questo servizio agli utenti remoti del servizio di posta. Impostate un log host e configurate tutti gli altri host a spedire i log a questo host (/etc/syslog.conf). Rendete sicuri BIND, Sendmail e altri demoni complessi (eseguiteli in una gabbia chroot; eseguiteli come pseudo-utente non-root). Installate tiger o un simile strumento di logging. Installate snort o un simile strumento di logging. Se possibile, fate a meno di NIS ed RPC (disabilitate portmap). Documenti sulle politiche adottate 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. Proibite l'uso di protocolli che usano password in chiaro (telnet, rsh e simili; ftp, imap, http, ...). Proibite i programmi che usano SVGAlib. Usate la gestione delle quote disco. Tenetevi informati circa le notizie riguardanti la sicurezza Iscrivetevi a mailing list di sicurezza. Configurate `apt` per gli aggiornamenti di sicurezza; aggiungete al file /etc/apt/sources.list una riga per http://security.debian.org/debian-security. Ricordatevi anche di eseguire periodicamente apt-get update; apt-get upgrade (potreste farlo eseguire ad un job cron?) come spiegato in .

Configurazione ed installazione di un sistema autonomo IDS

Si può facilmente configurare un sistema Debian dedicato come Intrusion Detection System autonomo usando `snort` ed un'interfaccia basata su web per analizzare gli avvisi che rilevano un'intrusione: Installare un sistema di base Debian senza selezionare pacchetti aggiuntivi. Installare una versione di Snort con supporto ai database e configurare l'IDS per registrare gli avvisi in un database. 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. Scaricare ed installare i pacchetti necessari

Solitamente i pacchetti di cui avete bisogno vengono installati come dipendenza.
.

BASE viene impacchettato correntemente per Debian in `acidbase` ed ACID viene impacchettato come `acidlab`

È possibile anche scaricarlo da , o .
. Entrambi forniscono un'interfaccia grafica basata su web per l'output di Snort.

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

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.

Dovreste configurare entrambe le interfacce nel file di configurazione standard di Debian /etc/network/interfaces. 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:

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

Così viene configurata un'interfaccia per leggere tutto il traffico sulla rete in una configurazione di tipo stealth (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 relativo a Snort) ed inoltre, buffer overflow remoti possono essere iniziati dal processare un pacchetto di rete.

Potreste anche voler anche leggere lo e la documentazione disponibile presso il .

Impostare un bridge firewall

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 `iptables`. 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.

Per configurare il kernel con il necessario supporto, eseguite `make menuconfig` o `make xconfig`. Nella sezione Networking options, abilitate le seguenti opzioni:

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

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

[ ] Network packet filtering debugging (NEW)

Dopodiché, aggiungete le opzioni corrette nella sezione IP: Netfilter Configuration. Quindi, compilate ed installate il kernel. Se volete farlo alla maniera Debian, installate `kernel-package` e lanciate make-kpkg 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 `bridge-utils`.

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. Un bridge con funzionalità NAT e firewall

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:

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)

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

# 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
Bridge con funzionalità di firewall

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

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)

Le seguenti istruzioni mostrano come sia possibile configurare questo bridge.

# 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

Se eseguite un traceroute verso il Linux Mail Server, non vedrete il bridge. Se volete accedere al bridge con ssh, 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.

Regole base di IPtables

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

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
Script di esempio per modificare l'installazione predefinita di Bind

Questo script automatizza la procedura per cambiare l'installazione predefinita del server dei nomi bind versione 8, in modo che non venga eseguito con i privilegi di superutente. Notate che bind versione 9, in Debian, si comporta già così in maniera predefinita

Dalla versione 9.2.1-5. Vale a dire dal rilascio di Debian sarge.
, ed è meglio usare questa versione piuttosto che bind versione 8.

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 /etc/default/bind e /etc/init.d/bind, così il programma verrà eseguito con quell'utente. Usate estrema cautela poiché non è stato collaudato estensivamente.

Potete anche creare manualmente gli utenti ed usare la patch disponibile per lo script predefinito allegato al .

#!/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 > $INITD # Now put the options in the /etc/default/bind file: cat >>$DEFAULT <<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

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

Aggiornamenti di sicurezza protetti da un firewall

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.

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

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.

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.

# 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

Notate: usare una politica DROP nella catena di INPUT è la cosa più corretta da fare, ma fate molta 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

Come knockd. 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:
#!/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

Ovviamente, dovreste disabilitare ogni backdoor prima di mettere il sistema in produzione.

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.

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

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

Ambiente Chroot per SSH

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

Avete due opzioni per impostare una shell remota con restrizioni: 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. 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.

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). Mettere gli utenti ssh in chroot

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

Usare `libpam-chroot`

Probabilmente il metodo più semplice è usare il pacchetto `libpam-chroot` fornito in Debian. Una volta installato dovete: Modificare /etc/pam.d/ssh per usare questo modulo PAM, ed aggiungere come ultima riga

Potete usare l'opzione debug per fare in modo che spedisca il progresso raggiunto dal modulo al sistema authpriv.notice.
:
session required pam_chroot.so
Configurare un idoneo ambiente chroot per l'utente. Potete tentare usando gli script disponibili in /usr/share/doc/libpam-chroot/examples/, usate il programma `makejail`
Potete creare un ambiente bash molto limitato con la seguente definizione Python per makejail, quindi create solamente la directory /var/chroots/users/foo, un file con il seguente contenuto e chiamatelo bash.py:
chroot="/var/chroots/user/foo" cleanJailFirst=1 testCommandsInsideJail=["bash ls"]

A questo punto eseguite makejail bash.py per creare l'ambiente utente in /var/chroots/user/foo. Per collaudare il sistema eseguite:

# chroot /var/chroots/user/foo/ ls bin dev etc lib proc sbin usr
, oppure configurate un ambiente minimale Debian con `debootstrap`. Verificate che l'ambiente includa i servizi di cui avete bisogno
In alcune occasioni potreste avere bisogno dei file dispositivo /dev/ptmx, /dev/pty* e della sottodirectory /dev/pts/. Eseguire MAKEDEV nella directory /dev 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.
. Configurate /etc/security/chroot.conf, 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. 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 do_pam_session() 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 do_pam_session() viene chiamato prima di ridurre i privilegi, cosi funzionerà anche con Privilege separation on. Se dovete disabilitarlo, modificate come segue /etc/ssh/sshd_config:
UsePrivilegeSeparation no

Notate che questo abbasserà il livello di sicurezza del vostro sistema poiché il server OpenSSH verrà eseguito come utente root. Questo significa che se rilevate un attacco remoto contro OpenSSH, con esito positivo, un attaccante otterrà i privilegi di root invece che di sshd, compromettendo così tutto il sistema

Se state usando un kernel che implementa le Mandatory Access Control (RSBAC/SElinux) potete evitare tutto questo cambiando la configurazione e garantendo all'utente sshd i privilegi per eseguire la chiamata di sistema chroot().
.

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

Se avete l'opzione Privilege Separation impostata su yes 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:

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

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 /etc/ssh/sshd_config, come descritto in precedenza.

Notate che se uno dei seguenti manca, gli utenti non saranno in grado di autenticarsi in chroot: Il filesystem /proc dev'essere montato nel chroot dell'utente. I file dispositivo necessari in /dev/pts/ devono esistere. Se i file vengono generati automaticamente dal kernel in esecuzione allora devono esser creati manualmente nella /dev/ del chroot. La home directory dell'utente deve esistere nel chroot, altrimenti il demone ssh smetterà di funzionare.

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

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

Applicare una patch al server SSH

Il pacchetto sshd disponibile in Debian non permette di restringere i movimenti di un utente che accede al server, perché non dispone della funzione chroot che è invece inclusa nel programma commerciale sshd2 (mediante 'ChrootGroups' o 'ChrootUsers', vedete ). Tuttavia è disponibile una patch per aggiungere questa funzionalità dal (richiesta e disponibile nel in Debian). La patch potrebbe essere inclusa nelle prossime versioni del pacchetto OpenSSH. Emmanuel Lacour dispone di pacchetti deb di ssh per sarge con questa funzionalità: . Tuttavia, per non rischiare, è sempre consigliabile ricompilarsi il programma per tenersi aggiornati.

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

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

In questo modo viene limitato sia l'accesso remoto alla shell che la copia remota attraverso il canale ssh.

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

./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
./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
./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
./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
./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
./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
Eseguire un chroot del server ssh

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

# chroot /var/chroot/ssh /sbin/sshd -f /etc/sshd_config

Questo avvierebbe il demone sshd all'interno dell'ambiente chroot. A tal fine dovrete assicurarvi che la directory /var/chroot/ssh 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 separazione dei privilegi (normalmente nella configurazione base è così) e che la seguente riga sia presente nel file /etc/ssh/sshd_config:

UsePrivilegeSeparation yes

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.

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 nodev attiva: in tal caso, poiché /dev/urandom non funziona in chroot, otterreste il seguente errore: PRNG is not seeded (NdT: il generatore di numeri pseudo-casuali non riesce a ottenere un punto da cui partire).

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

Potreste usare `debootstrap` 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 . 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.

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

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

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

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

# makejail /usr/share/doc/makejail/examples/sshd.py

Tale comando creerà l'ambiente chroot richiesto nella directory /var/chroot/sshd. Notate che affinché il tutto funzioni correttamente è necessario che voi: Montiate il filesystem procfs nella directory /var/chroot/sshd/proc. Il programma Makejail effettua automaticamente tale operazione, ma in caso di riavvio del sistema il filesystem dovrà essere rimontato usando il comando :

# mount -t proc proc /var/chroot/sshd/proc

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

proc-ssh /var/chroot/sshd/proc proc none 0 0
Avere syslog in ascolto sul file dispositivo /dev/log dentro la gabbia chroot. A questo scopo dovrete modificare /etc/default/syslogd ed aggiungere -a /var/chroot/sshd/dev/log alla definizione della variabile SYSLOGD.

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 /etc/shadow o /etc/group. Notate che se state usando Privilege Separation l'utente sshd deve esistere in questi file.

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 `fileutils`:

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

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 makejail non lo ha fatto per voi:

$ 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
Ambiente fatto a mano (nella maniera più brutale)

È possibile creare un ambiente chroot usando un metodo per tentativo ed errori, monitorando i tracciati ed i file di log del server sshd, in modo da determinare i file necessari. L'ambiente seguente, fornito da José Luis Ledesma, è un elenco di file di esempio in un ambiente chroot per ssh in Debian woody (3.0)

Notate che non ci sono file SETUID. Questo rende più difficile uscire dall'ambiente chroot agli utenti remoti. Tuttavia impedisce anche agli utenti di cambiare le loro password, visto che il programma passwd non può modificare i file /etc/passwd o /etc/shadow.
:
.: 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//
Ambiente Chroot per Apache Introduzione

L'utilità chroot 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 makejail, impostare ed aggiornare la zona sottoposta a chroot è più facile.

FIXME: Apache può essere messo in chroot usando che è disponibile in `libapache-mod-security` (per Apache 1.x) e `libapache2-mod-security` (per Apache 2.x).

Licenza

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

Installare il server

Questa procedura è stata provata su Debian GNU/Linux 3.0 (Woody) con makejail 0.0.4-1 (in Debian/testing).

Autenticatevi come root e creare una nuova directory-gabbia:

$ mkdir -p /var/chroot/apache

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

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

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

# cp/usr/share/doc/makejail/examples/apache.py /etc/makejail/
Modificate /etc/makejail/apache.py, cambiando le opzioni di chroot, users e groups. Per eseguire questa versione di makejail, potete aggiungere anche l'opzione packages. Vedete nella . Un esempio potrebbe essere questo:
chroot="/var/chroot/apache" testCommandsInsideJail=["/usr/sbin/apachectl start"] processNames=["apache"] testCommandsOutsideJail=["wget -r --spider http://localhost/", "lynx --source https://localhost/"] preserve=["/var/www", "/var/log/apache", "/dev/log"] users=["chrapach"] groups=["chrapach"] packages=["apache", "apache-common"] userFiles=["/etc/password", "/etc/shadow"] groupFiles=["/etc/group", "/etc/gshadow"] forceCopy=["/etc/hosts", "/etc/mime.types"]

FIXME: pare che alcune opzioni non funzionino correttamente. Per esempio, /etc/shadow e /etc/gshadow non vengono copiate, mentre /etc/password e /etc/group sono state copiate completamente, invece di essere filtrate. Create il sottoalbero sottoposto a chroot: `makejail /etc/makejail/apache.py` Qualora /etc/password ed /etc/group siano stati copiati completamente, per sostituirli con copie filtrate, digitate:

$ grep chrapach /etc/passwd > /var/chroot/apache/etc/passwd $ grep chrapach /etc/group > /var/chroot/apache/etc/group
Copiate le pagine del sito web ed i file di log nella "gabbia"; quei file non vengono copiati automaticamente (vedete l'opzione preserve nel file di configurazione di makejail).
# cp -Rp /var/www /var/chroot/apache/var # cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache
Modificate lo script di avvio per il demone incaricato della registrazione dei log di sistema, in modo che ascolti anche il socket /var/chroot/apache/dev/log. In /etc/default/syslogd, sostituite `SYSLOGD=""` con `SYSLOGD=" -a /var/chroot/apache/dev/log"` e riavviate il demone con il comando `/etc/init.d/sysklogd restart`. Modificate lo script di avvio di Apache (/etc/init.d/apache). Per il corretto funzionamento in chroot potrebbero rendersi necessari alcuni cambiamenti, come ad esempio:

Impostare una nuova variabile CHRDIR all'inizio del file;

Modificare le sezioni start, stop, reload, etc.

Aggiungere una riga per montare e smontare il filesystem /proc all'interno della gabbia chroot.

#! /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

FIXME: 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. In /etc/logrotate.d/apache sostituite `/var/log/apache/*.log` con `/var/chroot/apache/var/log/apache/*.log` Lanciate Apache (/etc/init.d/apache start) e controllate cosa viene riportato nei log della gabbia (/var/chroot/apache/var/log/apache/error.log). 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 makejail, potete elencarli nell'opzione forceCopy (per copiarli direttamente) o packages (per copiare interi pacchetti con le loro dipendenze) nel file di configurazione /etc/makejail/apache.py. Scrivete `ps aux | grep apache` per assicurarvi che Apache stia girando. Dovreste vedere qualcosa tipo:

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

Per automatizzare questo test, potete scrivere: `ls -la /proc/`cat /var/chroot/apache/var/run/apache.pid`/root/.`

FIXME: Aggiungere altri test da far girare per assicurarsi che la gabbia chroot sia chiusa?

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

apt-get update && apt-get install apache makejail /etc/makejail/apache.py
Vedete anche

Se cercate maggiori informazioni potete provare anche queste fonti: , questo programma è stato scritto da Alan Tesio)

Changelog della traduzione Versione 3.13 - ottobre 2008

Il coordinamento e la revisione della traduzione è stato effettuato da Ferdinando Ferranti zappagalattica@inwind.it, hanno tradotto il documento: Davide lists4davide@gmail.com, Damiano Biagioli damiano_biagioli@libero.it, Bl@ster dottorblaster@gmail.com, Gabriele 'LightKnight' Stilli superenzima@libero.it, Paolo Massei mozambo@gmail.com, Pierluigi teppisti-xpla xpla@teppisti.it ed Andrea Zagli azagli@inwind.it.

Il manutentore della traduzione: Stefano Canepa sc@linux.it.

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: debian-l10n-italian@lists.debian.org (o contattate direttamente Stefano...). Versione 2.97 - aprile 2003

Il coordinamento e la revisione della traduzione è stato effettuato da Ferdinando Ferranti zappagalattica@inwind.it, hanno tradotto il documento: CarloS enne.enne@tiscalinet.it, Stefano Canepa sc@linux.it, Morpheus matrixhasu@libero.it, Spooky, Leonardo Canducci lcanducci@libero.it, Alessandro Melillo alemelo@fastmail.fm, Davide Alessio dalessio@softhome.net, Luigi Bonanno hsaybo@tin.it, Gavrila gavrilus@tiscalinet.it, Giacinto Lorusso giacintolorusso@yahoo.it, Giuseppe Palmieri gpalm@iol.it, Riccardo Corso rixx@inwind.it, Stefano Mioli stevie@e4a.it, Pengz pengol[at]inwind.it, Fabio Rapposelli frapposelli@hi-net.it.

Il manutentore della traduzione: Stefano Canepa sc@linux.it.