Introduzione
L’uso di BIND in un ambiente chrooted è una pratica comune per migliorare la sicurezza del server DNS; la chroot (jail) isola il processo di BIND da altre parti del sistema operativo, limitando il suo accesso ai file di sistema e riducendo la superficie di attacco. Questo approccio è particolarmente utile in contesti in cui è necessario garantire che il server DNS operi in modo sicuro, minimizzando i rischi associati a vulnerabilità di sicurezza o configurazioni errate.
In un ambiente chrooted, il processo di BIND viene eseguito in una directory specifica, chiamata “root jail”, che contiene solo i file e le librerie necessari per il funzionamento del server DNS. Questo implica che dovranno essere configurati percorsi specifici per i file di configurazione, i dati e le librerie, assicurando al contempo che il sistema non venga compromesso in caso di exploit.
Perchè eseguire BIND in una jail chroot
L’idea alla base dell’esecuzione di BIND DNS in una jail chroot è quella di limitare la “quantità” di accesso che un individuo malintenzionato potrebbe ottenere sfruttando le eventuali vulnerabilità di BIND; è per lo stesso motivo che eseguiamo BIND come utente non privilegiato (named). Questo, in ogni caso, deve essere considerato come un supplemento alle normali precauzioni di sicurezza (esecuzione dell’ultima versione, controllo degli accessi, ecc.), non certo come un sostituto di esse.
I vari passaggi
Di seguito, presento una panoramica dettagliata delle fasi necessarie per la compilazione di BIND, rivolta a professionisti del settore, ma anche a coloro che desiderano sperimentare.
Non entro, volutamente, nel merito del sistema operativo; tutti i passaggi indicati di seguito, sono stati eseguiti con utente privilegiato (root), da terminale ssh, in ambiente Linux Almalinux 9.2 (base Red Hat Enterprise).
Prerequisiti
dnf update
dnf install gcc make libtool libxml2-devel openssl-devel
dnf install -y libmaxminddb-devel libuv-devel libnghttp2-devel libxml2-devel jemalloc-devel
Scaricare il Codice Sorgente di BIND
wget https://downloads.isc.org/isc/bind9/9.18.30/bind-9.18.30.tar.xz
Estrazione
tar -xJvf bind-9.18.30.tar.xz
Configurazione
cd bind-9.18.30
configure --prefix=/usr/local/named --sysconfdir=/usr/local/named/etc --mandir=/usr/share/man --enable-largefile \ --with-openssl --with-maxminddb --enable-full-report --with-libxml2 --with-jemalloc
Compilazione
make -j8
Test
make test
Installazione
make install
Preparazione della root jail e creazione dell'account utente (named)
# ---------------------------------------------------------------------------------- # - File Name : init-bind-jail.sh # - Author : NM # - Administrator : NM - Mobile: XXX # - Create : 18/01/2008 # - Last Update : 20/11/2008 # - Description : File per la configurazione jail DNS BIND # - Position : /usr/local/scripts # - Note : NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE # ----------------------------------------------------------------------------------- #/bin/bash # Source function library. . /etc/rc.d/init.d/functions JAILDIR=/jail SERHOME=$JAILDIR/named SERUSER=named SERGROUP=named uexists() { return=`id $SERUSER &> /dev/null` } if ! uexists then uid=$(cat /etc/passwd | cut -f3 -d: | sort -un | awk 'BEGIN { min=5000; max=5100 } { if ($0<min) { uuid=min } else if ($0>=min && $0<=max) {uuid=$0 + 1} } END { print uuid }') gid=$(cat /etc/group | cut -f3 -d: | sort -un | awk 'BEGIN { min=5000; max=5100 } { if ($0<min) { uuid=min } else if ($0>=min && $0<=max) {uuid=$0 + 1} } END { print uuid }') groupadd -g $gid $SERGROUP useradd -d $SERHOME -m -c "Bind User" -g $SERGROUP -u $uid $SERUSER -s /sbin/nologin fi mkdir -p $SERHOME mkdir -p $SERHOME/etc $SERHOME/dev $SERHOME/var/log $SERHOME/var/run $SERHOME/usr/sbin mkdir -p $SERHOME/master $SERHOME/slave $SERHOME/reverse $SERHOME/var/stats $SERHOME/var/dump $SERHOME/var/log $SERHOME/usr/local mknod -m 0666 $SERHOME/dev/null c 1 3 mknod -m 0666 $SERHOME/dev/zero c 1 5 mknod -m 0666 $SERHOME/dev/random c 1 8 mknod -m 0666 $SERHOME/dev/urandom c 1 9 cp /etc/localtime $SERHOME/etc chown -R $SERUSER:$SERGROUP $SERHOME chown -R $SERUSER:$SERGROUP $SERHOME/master chown -R $SERUSER:$SERGROUP $SERHOME/slave chown -R $SERUSER:$SERGROUP $SERHOME/reverse chown -R $SERUSER:$SERGROUP $SERHOME/var/stats chown -R $SERUSER:$SERGROUP $SERHOME/var/dump
Script di avvio del servizio (named)
Script per l’avvio del servizio “named”, e’ sufficiente creare un file in /etc/init.d/named, copiare, incollare e salvare.
# ---------------------------------------------------------------------------------- # - File Name : named # - Author : NM # - Administrator : NM - Mobile: XXX # - Create : 14/04/2006 # - Last Update : 20/01/2007 # - Description : File per lo start/stop named (bind) # - Position : /etc/init.d/ # - Note : NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE # ----------------------------------------------------------------------------------- #!/bin/bash # # named This shell script takes care of starting and stopping # named (BIND DNS server). # # chkconfig: 345 55 45 # description: named (BIND) is a Domain Name Server (DNS) \ # that is used to resolve host names to IP addresses. # probe: true # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network JAILDIR=/jail [ -f /usr/local/named/sbin/named ] || exit 0 [ -f $JAILDIR/named/etc/named.conf ] || exit 0 setretvalue() { RET=$1 if [ -n "$RET" ] && [ "$RET" -eq 0 ] then echo_success else echo_failure fi } start() { # Start daemons. echo -n "Starting named: " if [ ! -f /var/lock/subsys/named ] then daemon /usr/local/named/sbin/named -u named -t $JAILDIR/named -c /etc/named.conf -n 2 RETVAL=$? [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named else setretvalue 1 fi echo return $RETVAL } stop() { PID=`pidof named` # Stop daemons. echo -n "Shutting down named: " if [ -n "$PID" ] then kill -9 $PID RETVAL=$? [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named fi setretvalue $RETVAL echo } case "$1" in start) start ;; stop) stop ;; status) status named RETVAL=$? ;; restart) stop start RETVAL=$? ;; reload) /usr/local/named/sbin/rndc reload RETVAL=$? ;; probe) /usr/local/named/sbin/rndc reload >/dev/null 2>&1 || echo start RETVAL=0 ;; *) echo "Usage: named {start|stop|status|restart|reload}" RETVAL=1 esac exit $RETVAL
chmod +x /etc/init.d/named
systemctl enable named
Considerazioni finali
Provando ad avviare il servizio, non verrà visualizzato nessun errore, ma il servizio, mancando la configurazione, non potrà avviarsi.
In un prossimo articolo, descriverò come realizzare una configurazione a “view” (vista), in modo da mostrare come su possa ottenere una risposta DNS diversa in funzione dell’ IP sorgente che effettua la richiesta.
Documentazione
Per informazione in merito alla documentazione, potete consultare BIND 9.19 Administrator Reference Manual