<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.21"> <TITLE>Chroot-BIND HOWTO: Preparazione della gabbia</TITLE> <LINK HREF="Chroot-BIND-HOWTO-3.html" REL=next> <LINK HREF="Chroot-BIND-HOWTO-1.html" REL=previous> <LINK HREF="Chroot-BIND-HOWTO.html#toc2" REL=contents> </HEAD> <BODY> <A HREF="Chroot-BIND-HOWTO-3.html">Avanti</A> <A HREF="Chroot-BIND-HOWTO-1.html">Indietro</A> <A HREF="Chroot-BIND-HOWTO.html#toc2">Indice</A> <HR> <H2><A NAME="s2">2.</A> <A HREF="Chroot-BIND-HOWTO.html#toc2">Preparazione della gabbia</A></H2> <H2><A NAME="ss2.1">2.1</A> <A HREF="Chroot-BIND-HOWTO.html#toc2.1">Creazione di un utente</A> </H2> <P>Come detto nell'introduzione, è una pessima idea eseguire BIND con i privilegi di root. Quindi, prima di cominciare, creiamo un utente a parte per BIND. Non dovete mai usare a questo scopo un generico utente già presente, come <CODE>nobody</CODE>. Comunque, alcune distribuzioni come SuSE e Mandrake hanno iniziato a fornire un utente specifico per BIND (di solito chiamato <CODE>named</CODE>) che potete modificare invece di crearne uno da zero.</P> <P>Per creare l'utente dovete aggiungere in <CODE>/etc/passwd</CODE> una riga come questa:</P> <P> <BLOCKQUOTE><CODE> <PRE> named:x:200:200:Nameserver:/chroot/named:/bin/false </PRE> </CODE></BLOCKQUOTE> </P> <P>E per il gruppo un'altra come questa in <CODE>/etc/group</CODE>: <BLOCKQUOTE><CODE> <PRE> named:x:200: </PRE> </CODE></BLOCKQUOTE> </P> <P>Questo crea un utente e un gruppo per BIND chiamati <CODE>named</CODE>. Accertatevi che l'UID e il GID (nel nostro esempio entrambi 200) siano unici sul vostro sistema. La shell è impostata a <CODE>/bin/false</CODE> perché questo utente non avrà mai bisogno di fare il login.</P> <H2><A NAME="ss2.2">2.2</A> <A HREF="Chroot-BIND-HOWTO.html#toc2.2">Struttura delle directory</A> </H2> <P>Ora dobbiamo impostare la struttura delle directory che useremo per la gabbia chroot in cui BIND verrà eseguito. Può essere ovunque nel vostro filesystem, i più paranoici potrebbero anche metterla in una partizione separata. In seguito assumeremo di usare <CODE>/chroot/named</CODE>. Iniziamo creando questo albero di directory:</P> <P> <BLOCKQUOTE><CODE> <PRE> /chroot +-- named +-- dev +-- etc | +-- namedb | +-- slave +-- var +-- run </PRE> </CODE></BLOCKQUOTE> </P> <P>Se usate l'utilità GNU <CODE>mkdir</CODE> (come sui sistemi Linux), potete crearlo con questi comandi:</P> <P> <BLOCKQUOTE><CODE> <PRE> # mkdir -p /chroot/named # cd /chroot/named # mkdir -p dev etc/namedb/slave var/run </PRE> </CODE></BLOCKQUOTE> </P> <H2><A NAME="ss2.3">2.3</A> <A HREF="Chroot-BIND-HOWTO.html#toc2.3">Sistemare i dati di BIND</A> </H2> <P>Supponendo che abbiate già installato BIND in modo convenzionale e che lo stiate già utilizzando, avrete già un file <CODE>named.conf</CODE> e i file di zona. Questi file devono essere spostati (o solo copiati, per sicurezza) nella gabbia chroot, in modo che BIND possa accedervi: <CODE>named.conf</CODE> va in <CODE>/chroot/named/etc</CODE> e i file di zona possono andare in <CODE>/chroot/named/etc/namedb</CODE>. Per esempio: <BLOCKQUOTE><CODE> <PRE> # cp -p /etc/named.conf /chroot/named/etc/ # cp -a /var/named/* /chroot/named/etc/namedb/ </PRE> </CODE></BLOCKQUOTE> Normalmente BIND necessiterebbe di poter scrivere nella directory <CODE>namedb</CODE>, ma nell'interesse della sicurezza non glielo permetteremo. Se il vostro nameserver fa da slave per qualche zona dovrà aggiornare quei file di zona, il che significa che dovremo metterli in un'altra directory a cui BIND potrà accedere.</P> <P> <BLOCKQUOTE><CODE> <PRE> # chown -R named:named /chroot/named/etc/namedb/slave </PRE> </CODE></BLOCKQUOTE> </P> <P>Ricordate che dovrete spostare tutti i file delle zone per cui fate da slave in questa directory ed aggiornare il vostro <CODE>named.conf</CODE>.</P> <P>BIND avrà anche bisogno di scrivere i suoi pidfile e le informazioni sulle statistiche di uso nella directory <CODE>/var/run</CODE>, perciò permettiamogli di farlo: <BLOCKQUOTE><CODE> <PRE> # chown named:named /chroot/named/var/run </PRE> </CODE></BLOCKQUOTE> </P> <H2><A NAME="ss2.4">2.4</A> <A HREF="Chroot-BIND-HOWTO.html#toc2.4">File per il supporto al sistema</A> </H2> <P>Una volta che BIND è nella sua gabbia chroot non potrà più accedere a <B>nessun</B> file fuori da essa. Però avrà bisogno di accedere ad alcuni file fondamentali, anche se non a tanti quanti ne servivano a BIND 8.</P> <P>Uno dei file che gli serviranno nella sua gabbia è il buon vecchio <CODE>/dev/null</CODE>. Attenzione che il comando esatto per creare questo device node può variare da sistema a sistema; controllate il vostro script <CODE>/dev/MAKEDEV</CODE> per sicurezza. Alcuni sistemi potrebbero richiedere anche <CODE>/dev/zero</CODE>, che può essere creato in modo simile. Si dice che la release candidata BIND 9.2.0 richieda anche <CODE>/dev/random</CODE>. Per la maggior parte dei sistemi Linux potete usare i seguenti comandi: <BLOCKQUOTE><CODE> <PRE> # mknod /chroot/named/dev/null c 1 3 # mknod /chroot/named/dev/random c 1 8 # chmod 666 /chroot/named/dev/{null,random} </PRE> </CODE></BLOCKQUOTE> </P> <P>Per FreeBSD 4.3 invece: <BLOCKQUOTE><CODE> <PRE> # mknod /chroot/named/dev/null c 2 2 # mknod /chroot/named/dev/random c 2 3 # chmod 666 /chroot/named/dev/{null,random} </PRE> </CODE></BLOCKQUOTE> </P> <P>Vi servirà anche un altro file nella directory <CODE>/etc</CODE> all'interno della gabbia. Dovete copiare <CODE>/etc/localtime</CODE> (su alcuni sistemi noto come <CODE>/usr/lib/zoneinfo/localtime</CODE>) in modo che i log di BIND riportino l'ora esatta degli eventi registrati. Lo potete fare con il seguente comando: <BLOCKQUOTE><CODE> <PRE> # cp /etc/localtime /chroot/named/etc/ </PRE> </CODE></BLOCKQUOTE> </P> <H2><A NAME="logging"></A> <A NAME="ss2.5">2.5</A> <A HREF="Chroot-BIND-HOWTO.html#toc2.5">Logging</A> </H2> <P>A differenza di un normale avanzo di galera, BIND non può scrivere le sue registrazioni di log sui muri :-). In genere a questo scopo BIND usa <CODE>syslogd</CODE>, il demone dei log di sistema. Comunque questo tipo di logging è effettuato scrivendo le voci di registrazione nello speciale socket <CODE>/dev/log</CODE>, che però ora non può usare perché si trova fuori dalla sua gabbia. Per fortuna ci sono un paio di soluzioni a questo problema.</P> <H3>La soluzione ideale</H3> <P>Il modo ideale per risolvere il problema richiede una versione ragionevolmente recente di <CODE>syslogd</CODE>, che supporti lo switch <CODE>-a</CODE> introdotto da OpenBSD. Controllate la pagina di manuale <CODE>syslogd(8)</CODE> per sapere se la versione di syslogd che avete lo supporta o no.</P> <P>Se sì, tutto quello che dovete fare è aggiungere lo switch "<CODE>-a /chroot/named/dev/log</CODE>" alla linea di comando che lancia <CODE>syslogd</CODE>. Sui sistemi che usano il SysV-init completo (ovvero la maggior parte delle distribuzioni Linux) tale riga si trova solitamente nel file <CODE>/etc/rc.d/init.d/syslog</CODE>. Per esempio, sul mio sistema Linux Red Hat ho cambiato la riga</P> <P> <BLOCKQUOTE><CODE> <PRE> daemon syslogd -m 0 </PRE> </CODE></BLOCKQUOTE> in <BLOCKQUOTE><CODE> <PRE> daemon syslogd -m 0 -a /chroot/named/dev/log </PRE> </CODE></BLOCKQUOTE> </P> <P>È interessante notare come dalla Red Hat 7.2 questo processo sia anche più facile. Ora c'è un file <CODE>/etc/sysconfig/syslog</CODE> in cui definire parametri supplementari per syslogd.</P> <P>I sistemi Caldera OpenLinux usano un esecutore di demoni, <CODE>ssd</CODE>, che legge la configurazione dal file <CODE>/etc/sysconfig/daemons/syslog</CODE>. In questo caso dovrete soltanto modificare la riga delle opzioni in questo modo: <BLOCKQUOTE><CODE> <PRE> OPTIONS_SYSLOGD="-m 0 -a /chroot/named/dev/log" </PRE> </CODE></BLOCKQUOTE> </P> <P>In modo simile, mi è stato detto che sui sistemi SuSE il posto migliore per aggiungere questa opzione è il file <CODE>/etc/rc.config</CODE>. Cambiare la riga <BLOCKQUOTE><CODE> <PRE> SYSLOGD_PARAMS="" </PRE> </CODE></BLOCKQUOTE> e metterci <BLOCKQUOTE><CODE> <PRE> SYSLOGD_PARAMS="-a /chroot/named/dev/log" </PRE> </CODE></BLOCKQUOTE> dovrebbe funzionare.</P> <P>E per ultimo ma non per importanza, con FreeBSD 4.3 sembra che dobbiate soltanto modificare il file <CODE>rc.conf</CODE> e scrivere: <BLOCKQUOTE><CODE> <PRE> syslogd_flags="-s -l /chroot/named/dev/log" </PRE> </CODE></BLOCKQUOTE> Il <CODE>-s</CODE> è per motivi di sicurezza e fa parte delle impostazioni predefinite. Il <CODE>-l</CODE> è una directory locale in cui mettere un altro nodo di log.</P> <P>Una volta capito come intervenire sul vostro syslogd e scritta la sua nuova configurazione riavviate <CODE>syslogd</CODE>, o con kill e riavviandolo (con i parametri supplementari), oppure usando gli script SysV-init che lo fanno per voi: <BLOCKQUOTE><CODE> <PRE> # /etc/rc.d/init.d/syslog stop # /etc/rc.d/init.d/syslog start </PRE> </CODE></BLOCKQUOTE> </P> <P>Appena ripartito syslogd, dovreste vedere un "file" in <CODE>/chroot/named/dev</CODE> di nome <CODE>log</CODE>, che dovrebbe apparire così:</P> <P> <PRE> srw-rw-rw- 1 root root 0 Mar 13 20:58 log </PRE> </P> <H3>Le altre soluzioni</H3> <P>Se avete un <CODE>syslogd</CODE> troppo vecchio dovrete trovare un altro sistema per scrivere i vostri log. Ci sono un paio di programmi in giro, come <CODE>holelogd</CODE>, che aiutano agendo come "proxy" ed accettando le voci di log dal BIND in chroot e passandole al vero socket <CODE>/dev/log</CODE>.</P> <P>In alternativa potete configurare BIND per fargli scrivere i log su normali file invece di farli passare attraverso syslog. Leggete la documentazione di BIND per scoprire i dettagli su come farlo se scegliete questa strada.</P> <H2><A NAME="perm"></A> <A NAME="ss2.6">2.6</A> <A HREF="Chroot-BIND-HOWTO.html#toc2.6">Restrizione dei permessi</A> </H2> <P>Prima di tutto sentitevi autorizzati a restringere l'accesso all'intera directory <CODE>/chroot</CODE> al solo utente <CODE>root</CODE>. Chiaramente non tutti potrebbero volerlo fare, soprattutto se avete altri software installati in quella directory che non apprezzano la cosa.</P> <P> <BLOCKQUOTE><CODE> <PRE> # chown root /chroot # chmod 700 /chroot </PRE> </CODE></BLOCKQUOTE> </P> <P>Potete anche tranquillamente limitare l'accesso a <CODE>/chroot/named</CODE> all'utente <CODE>named</CODE>:</P> <P> <BLOCKQUOTE><CODE> <PRE> # chown named:named /chroot/named # chmod 700 /chroot/named </PRE> </CODE></BLOCKQUOTE> </P> <P>Per un accesso ancora più ristretto, sui sistemi Linux possiamo rendere alcuni file e directory immutabili, usando l'utilità <CODE>chattr</CODE> sui filesystem ext2:</P> <P> <BLOCKQUOTE><CODE> <PRE> # cd /chroot/named # chattr +i etc etc/localtime var </PRE> </CODE></BLOCKQUOTE> </P> <P>In modo equivalente, su FreeBSD 4.3 potreste voler dare un'occhiata a <CODE>chflags</CODE> se volete rendere file e directory immutabili. Per esempio il comando che segue dovrebbe rendere immutabile tutto il contenuto della directory <CODE>/chroot/named/etc</CODE>: <BLOCKQUOTE><CODE> <PRE> # chflags schg /chroot/named/etc/*(*). </PRE> </CODE></BLOCKQUOTE> </P> <P>Sarebbe una bella cosa farlo anche per la directory <CODE>dev</CODE> ma purtroppo questo impedirebbe a <CODE>syslogd</CODE> di creare il suo socket <CODE>dev/log</CODE>. Potete impostare il bit immutabile anche per altri file o directory della gabbia chroot, come i file di zona primaria, se sapete che non non cambieranno mai.</P> <HR> <A HREF="Chroot-BIND-HOWTO-3.html">Avanti</A> <A HREF="Chroot-BIND-HOWTO-1.html">Indietro</A> <A HREF="Chroot-BIND-HOWTO.html#toc2">Indice</A> </BODY> </HTML>