BIND: Chroot DNS, Compilazione e installazione

BIND: Chroot DNS, Compilazione e installazione

1024 683 Nicola Montemurro

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