Product SiteDocumentation Site

5.7. Rendere sicuro BIND

Ci sono diversi problemi da affrontare per rendere sicuro il demone del domain server, questi sono simili a quelli che incontrate normalmente quando vengono resi sicuri altri servizi:

5.7.1. Configurazione di Bind per evitare abusi

Dovreste limitare alcune delle informazioni che vengono servite tramite DNS ai client esterni, in modo che non possa essere usato per reperire importanti informazioni, che non volete far conoscere, sulla vostra organizzazione. Questo consiste nell'aggiungere le seguenti opzioni: allow-transfer, allow-query, allow-recursive e version. Potete anche limitarle nella sezione globale (in modo che vengano applicate in tutte le zone servite) oppure per zona. Questa informazione viene documentata nel pacchetto bind-doc, potrete leggere di più su questo argomento in /usr/share/doc/bind/html/index.html una volta che avrete installato il pacchetto.
Immaginate che il vostro server sia connesso ad Internet ed alla vostra rete interna, con vostro IP locale impostato a 192.168.1.2 (un server base con due connessioni di rete), non volete offrire nessun servizio su Internet e volete solamente abilitare il la risoluzione DNS per vostri host interni. Potete effettuare quest'operazione includendo le seguenti righe in /etc/bind/named.conf:
options {
            allow-query { 192.168.1/24; } ;
            allow-transfer { none; } ; 
            allow-recursion { 192.168.1/24; } ;
            listen-on { 192.168.1.2; } ;
            forward { only; } ;
            forwarders { A.B.C.D; } ;
};
L'opzione listen-on vincola il DNS sull'interfaccia che ha l'indirizzo interno e anche se questa interfaccia è la stessa che si connette ad Internet (ad esempio se state utilizzando NAT), le richieste verranno accettate solamente se provengono dai vostri host interni. Se il sistema ha interfacce multiple e non è presente il parametro listen-on, solo gli utenti interni potranno effettuare richieste, anche se, visto che la porta sarebbe accessibile agli attacchi dall'esterno, qualcuno potrebbe cercare di farvi andare in crash (o provando attacchi di tipo buffer overflow) il server DNS. Potete anche fare in modo che il DNS ascolti unicamente su 127.0.0.1 se non dovete fornire il servizio ad altri sistemi tranne che a voi stessi.
Il record version.bind della classe chaos contiene la versione del processo bind che sta girando correntemente. Questa informazione viene spesso usata da scanner automatici o individui maliziosi con l'intento di determinare se bind è vulnerabile o meno ad un dato attacco. Non fornendo informazioni o fornendole false all'interno del record version.bind, vengono limitate le probabilità che il server venga attaccato sulla base della versione pubblicata. Per fornire la vostra versione utilizzate la direttiva version nella seguente maniera:
 options { ... various options here ...
version "Not available."; };
Cambiare il record version.bind non fornisce protezione a fronte di eventuali attacchi, ma può essere considerata un'utile salvaguardia.
Un esempio di configurazione del file named.conf potrebbe essere la seguente:
acl internal {
        127.0.0.1/32;           // localhost
        10.0.0.0/8;             // internal
        aa.bb.cc.dd;            // eth0 IP
};

acl friendly {
        ee.ff.gg.hh;            // slave DNS
        aa.bb.cc.dd;            // eth0 IP
        127.0.0.1/32;           // localhost
        10.0.0.0/8;             // internal
};

options {
        directory "/var/cache/bind";
        allow-query { internal; };
        allow-recursion { internal; };
        allow-transfer { none; };
};
// From here to the mysite.bogus zone 
// is basically unmodified from the debian default
logging {
        category lame-servers { null; };
        category cname { null; };   
};

zone "." {
        type hint;
        file "/etc/bind/db.root";
};

zone "localhost" {
        type master;
        file "/etc/bind/db.local";
};

zone "127.in-addr.arpa" {
        type master;
        file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
        type master;
        file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
        type master;
        file "/etc/bind/db.255";
};

// zones I added myself
zone "mysite.bogus" {
        type master;
        file "/etc/bind/named.mysite";
        allow-query { any; };
        allow-transfer { friendly; };
};
Controllate il Bug Tracking System riguardo a Bind, specificatamente il http://bugs.debian.org/94760. Sentitevi liberi di riportare informazioni sui bug che riscontrate, se pensate di poter aggiungere informazioni utili.

5.7.2. Cambiare l'utente di BIND

Riguardo il come limitare i privilegi di BIND dovete sapere che se un utente normale (quindi non superutente) fa partire BIND, questo ultimo non potrà riconoscere le nuove interfacce automaticamente, ad esempio se inserite una scheda PCMCIA nel vostro portatile. Controllate il file README.Debian nella vostra documentazione di named (/usr/share/doc/bind/README.Debian) per ulteriori informazioni su questo problema. Ci sono stati recentemente diversi problemi di sicurezza riguardo BIND per cui cambiare utente diviene comodo quando è possibile farlo. Spiegheremo dettagliatamente i passi da compiere per realizzare questo procedimento, tuttavia, se volete farlo in modo automatizzato potreste provare lo script inserito in Sezione B.5, «Script di esempio per modificare l'installazione predefinita di Bind».
Notate che, in ogni caso, ciò si applica solo alla versione 8 di BIND. Nei pacchetti Debian della versione 9 di BIND (dalla versione 9.2.1-5, disponibile a partire da sarge) l'utente bind viene creato ed usato impostando la variabile OPTIONS in /etc/default/bind9. Se state usando la versione 9 di BIND ed il vostro domain name server non sta girando come utente bind, verificate le impostazioni contenute in quel file.
Per fare girare BIND sotto un altro utente, la prima cosa da fare è creare un utente separato ed un gruppo apposito (non è una buona idea usare nobody e nogroup per tutti i servizi che non girano come root). In questo esempio verranno utilizzati l'utente ed il gruppo named. Potete crearli digitando:
addgroup named
adduser --system --home /home/named --no-create-home --ingroup named \
      --disabled-password --disabled-login named
Notate che l'utente named sarà parecchio limitato. Se volete, per una qualsiasi ragione, avere un utente con meno limitazioni, utilizzate:
adduser --system --ingroup named named
Adesso modificate il file /etc/init.d/bind, con il vostro editor preferito, la riga che inizia con:
start-stop-daemon --start
in[39]:
start-stop-daemon --start --quiet --exec /usr/sbin/named -- -g named -u named
Altrimenti potete cambiare (creare se già non esiste) il file di configurazione predefinito (/etc/default/bind per la versione 8 di BIND) ed inserire le seguenti voci:
OPTIONS="-u named -g named"
Cambiate i permessi dei file usati da bind, incluso /etc/bind/rndc.key:
-rw-r-----    1 root     named          77 Jan  4 01:02 rndc.key
ed anche dove bind crea il suo pidfile, usando, ad esempio, /var/run/named invece di /var/run:
$ mkdir /var/run/named
$ chown named.named /var/run/named
$ vi /etc/named.conf
[ ... update the configuration file to use this new location ...]
options { ...
        pid-file "/var/run/named/named.pid";
};
[ ... ]
Inoltre, per evitare di far girare qualcosa come superutente, modificate la riga di reload nello script init.d da così:
reload)
       /usr/sbin/ndc reload
a così:
reload)
        $0 stop
        sleep 1
        $0 start
Notate: a seconda della versione di Debian che state usando potreste dover cambiare anche la riga restart. Questo problema, in Debian, è stato sistemato nella versione 1:8.3.1-2 di bind.
Tutto quello che dovete fare adesso è far ripartire bind con il comando /etc/init.d/bind restart e controllare il vostro syslog nelle due voci:
Sep  4 15:11:08 nexus named[13439]: group = named
Sep  4 15:11:08 nexus named[13439]: user = named
Voilà! Your named now does not run as root. If you want to read more information on why BIND does not run as non-root user on Debian systems, please check the Bug Tracking System regarding Bind, specifically http://bugs.debian.org/50013 and http://bugs.debian.org/132582, http://bugs.debian.org/53550, http://bugs.debian.org/52745, and http://bugs.debian.org/128129. Feel free to contribute to the bug reports if you think you can add useful information.

5.7.3. Eseguire il name server in chroot

To achieve maximum BIND security, now build a chroot jail (see Sezione 5.10, «Paranoie generiche riguardo chroot e suid») around your daemon. There is an easy way to do this: the -t option (see the named(8) manual page or page 100 of http://www.nominum.com/content/documents/bind9arm.pdf). This will make Bind chroot itself into the given directory without you needing to set up a chroot jail and worry about dynamic libraries. The only files that need to be in the chroot jail are:
dev/null
etc/bind/       - should hold named.conf and all the server zones
sbin/named-xfer - if you do name transfers
var/run/named/  - should hold the PID and the name server cache (if
                  any) this directory needs to be writable by named user
var/log/named   - if you set up logging to a file, needs to be writable
                  for the named user
dev/log         - syslogd should be listening here if named is configured to
                  log through it
Per far sì che il demone Bind funzioni correttamente, necessita dei permessi giusti sui file named. Questo è un compito semplice, dal momento che i file di configurazione sono sempre in /etc/named/. Tenete presente che necessita solo dell'accesso in lettura ai file di zona, a meno che non si tratti di un name server secondario o di cache. Se questo è il caso, dovrete concedere i permessi di lettura-scrittura alle zone necessarie (in modo che i trasferimenti di zona dal server primario funzionino).
Also, you can find more information regarding Bind chrooting in the http://www.tldp.org/HOWTO/Chroot-BIND-HOWTO.html (regarding Bind 9) and http://www.tldp.org/HOWTO/Chroot-BIND8-HOWTO.html (regarding Bind 8). This same documents should be available through the installation of the doc-linux-text (text version) or doc-linux-html (HTML version). Another useful document is http://web.archive.org/web/20011024064030/http://www.psionic.com/papers/dns/dns-linux.
Nel caso in cui stiate creando una gabbia chroot per l'esecuzione di Bind in Debian (senza usare l'opzione -t), assicuratevi di aver incluso i seguenti file[40]:
dev/log - syslogd should be listening here
dev/null
etc/bind/named.conf 
etc/localtime
etc/group - with only a single line: "named:x:GID:"
etc/ld.so.cache - generated with ldconfig 
lib/ld-2.3.6.so
lib/libc-2.3.6.so
lib/ld-linux.so.2 - symlinked to ld-2.3.6.so
lib/libc.so.6 - symlinked to libc-2.3.6.so
sbin/ldconfig - may be deleted after setting up the chroot
sbin/named-xfer - if you do name transfers
var/run/
Modificate inoltre syslogd, in ascolto su $CHROOT/dev/log in modo che il name server possa scrivere gli eventi nel syslog del sistema locale di log.
Se volete eliminare i problemi con le librerie dinamiche, potete compilare bind staticamente. Potete usare apt-get a questo scopo, con l'opzione source. Potete anche scaricare il pacchetto che si compilerà in modo opportuno. Dovrete eseguire qualcosa di simile a questo:
$ apt-get source bind
# apt-get build-dep bind
$ cd bind-8.2.5-2
  (edit src/port/linux/Makefile so CFLAGS includes the '-static'
   option)
$ dpkg-buildpackage -rfakeroot -uc -us
$ cd ..
# dpkg -i bind-8.2.5-2*deb
Dopo l'installazione, dovrete spostare i file all'interno della gabbia chroot[41]. Potete mantenere gli script init.d in /etc/init.d, così il sistema avvierà automaticamente il name server. Però dovrete modificarlo per aggiungere --chroot /percorso_del_chroot nella chiamata a start-stop-daemon presente in quegli script, oppure potete usare l'opzione -t di BIND impostando l'argomento OPTIONS nel file di configurazione /etc/default/bind (per la versione 8) o in /etc/default/bind9 (per la versione 9).
Per maggiori informazioni su come configurare gabbie chroot vedete Sezione 5.10, «Paranoie generiche riguardo chroot e suid».


[39] Notate che, a seconda della vostra versione di bind, potreste non avere l'opzione -g, in particolare se state usando bind 9 presente in sarge (versione 9.2.4).
[40] Questa configurazione non è ancora stata collaudata per il nuovo rilascio di Bind.
[41] A meno che non utiliziate l'opzione instdir quando chiamate dpkg, ma in questo caso la gabbia chroot potrebbe essere leggermente più complessa.