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, saranno elencate in dettaglio le fasi necessarie alla compilazione di BIND.
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).
Installazione dei 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
Recupero il Codice Sorgente
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 del codice compilato
make test
Installazione
make install
Script per la 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 per l’avvio del servizio “named”.
# ----------------------------------------------------------------------------------
# - 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.
Documentazione
Per informazione in merito alla documentazione, potete consultare BIND 9.19 Administrator Reference Manual