BIND: Configurazione delle Viste (view) DNS in Chroot | SolutionCAFE IT

BIND: Configurazione delle Viste (view) DNS in Chroot

BIND: Configurazione delle Viste (view) DNS in Chroot

1920 1280 Nicola Montemurro

BIND: Configurazione delle Viste (view) DNS in Chroot

Premessa

Prima di iniziare a descrivere la configurazione DNS a viste (view) con BIND in ambiente Chroot, già anticipata nell’articolo BIND e Chroot: Compilazione e installazione occorre descrivere cosa sono le viste (view)  DNS e perchè si utilizzano.

Cosa sono le viste in BIND?

La configurazione delle viste in BIND consente di gestire in modo più flessibile le risoluzioni DNS, permettendo di fornire risposte differenti a query provenienti da fonti differenti. Questa funzionalità è particolarmente utile negli scenari complessi, come reti aziendali o ISP, dove è necessario gestire accessi in modo granulare ai dati DNS; permettono di definire diverse configurazioni di zone per diverse categorie di client. Ogni vista può avere record DNS distinti, e il server DNS restituisce la risposta corretta in base all’indirizzo IP del client che fa la richiesta.

Facendo l’esempio della Società che possiede più BU (Business Unit) distribuite sul territorio, ciascuna con il proprio ramo di rete (branch), con il proprio server CMS posto all’interno del datacenter della Società, potrebbero entrambi usare la stessa URL (cms.esempio.com), per terminare su server differenti, così per gli utenti VPN di ciascuna BU, mentre per gli utenti internet, la richiesta di accesso alla medesima URL potrebbe terminare sul CMS della società.

Realizzazione di una configurazione di esempio

Nei passaggi seguenti, saranno indicati percorsi, che saranno implicitamente, ricondotti alla root jail, creata dello script pubblicato nell’articolo “Bind e Chroot: Compilazione e Installazione“; La sostanza non cambia, per coloro che desiderassero effettuare una installazione senza root jail, che dovranno solo modificare il percorso dei file adattandoli al proprio ambiente.

File e directory principali

L’elenco delle directory della root jail è questo;

[root@fe01 ~]# cd /jail/named
[root@fe01 named]# ls -l
total 0
drwxr-xr-x 2 named named 59 Oct 2 12:08 dev
drwxr-xr-x 2 named named 23 Oct 2 12:08 etc
drwxr-xr-x 2 named named 6 Oct 2 12:08 master
drwxr-xr-x 2 named named 6 Oct 2 12:08 reverse
drwxr-xr-x 2 named named 6 Oct 2 12:08 slave
drwxr-xr-x 4 named named 31 Oct 2 12:08 usr
drwxr-xr-x 6 named named 53 Oct 2 12:08 var
[root@fe01 named]# cd etc/
[root@fe01 etc]# ls -l
total 36
-rw-r--r-- 1 named named 2641 Oct 2 12:08 localtime
-rw-r--r-- 1 named named 1277 Oct 2 17:07 named.acl
-rw-r--r-- 1 named named 4532 Oct 2 17:04 named.conf
-rw-r--r-- 1 named named 2839 Oct 2 16:46 named.logger
-rw-r--r-- 1 named named 441 Oct 2 16:47 rndc.key

Il file fondamentale per il funzionamento di BIND è il named.conf che deve trovarsi nella directory /etc  e può contenere tutta la configurazione oppure essere suddivisa in più file, per una migliore gestione.

In questo esempio, suddivideremo la configurazione, anche per aiutare a comprendere ciascun contesto; spiegheremo i punti salienti per aiutare a comprendere il concetto di vista (view), senza entrare nel merito di ciascuna istruzione, che potrà essere verificata nella documentazione ufficiale;

Esempio di file named.conf

# -----------------------------------------------------------------------------
# - Zone file name      :       named.conf
# - Author              :       NM
# - DNS administrator   :       NM
# - Create              :       02.10.2024
# - Last Update         :       02.10.2024
# - Description         :       File di configurazione BIND su Linux Almalinux 9.2
# - Position            :       /etc
# - Info                :       
# - Note                :       NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE
#  ----------------------------------------------------------------------------

Include "/etc/named.acl";
Include "/etc/named.logger";
#Include "/etc/rndc.key";

options { 
        directory "/";
//      Size of the sent packets
        max-udp-size 4096;
//      Size of received packets
        edns-udp-size 4096;
        listen-on { 127.0.0.1; 172.16.60.40; };
        dnssec-validation no;
        max-cache-size 1024M;  // 25% of MEM
        max-cache-ttl 60; // limit cached record to a 60s TTL
        max-ncache-ttl 60; // limit cache neg. resp. to a 60s TTL
        version "My Name is Bind, James Bind";
        forward first;
        forwarders { 8.8.8.8; 1.1.1.1; }; // da commentare con uso di root.hints
        // forwarders { IP.1.DNS.PROVIDER; IP.2.DNS.PROVIDER; }; // da commentare con uso di root.hints
        pid-file "/var/run/named.pid";
        dump-file "/var/dump/named.db";
        statistics-file "/var/stats/named.stats";
        transfers-in 100;
        transfers-out 100;
//        datasize 20M;
        allow-transfer { none; };
        allow-recursion { net-internals; };

   };


controls {
       inet 127.0.0.1 port 953
               allow { 127.0.0.1; } keys { "rndc-key"; };
  };

statistics-channels {
        inet 127.0.0.1 port 9999 allow { 127.0.0.1; };
  };
   

view "internal" {
        match-clients { !net-externals; net-internals; localhost; };
        allow-query { localhost; net-internals; };

        zone "." {
                type hint;
                file "root.hints";
        };

        zone "localhost" {
                type master;
                file "master/localhost/localhost.zone";
                allow-update { none; };
        };

        zone "0.0.127.in-addr.arpa" {
                type master;
                file "reverse/127.0.0.in-addr.arpa.zone";
                allow-update { none; };
        };

        zone "60.16.172.in-addr.arpa.zone" {
                type master;
                file "reverse/172.16.60.in-addr.arpa.zone";
                allow-update { none; };
        };

        zone "esempio.com"  {
                type master;
                file "master/esempio.com/int.esempio.com.zone";
                allow-update { none; };
        };

        zone "solutioncafe.it" { 
                type master; 
                file "master/solutioncafe.it/int.solutioncafe.it.zone"; 
                allow-update { none; }; 
        };

// FORWARD

        zone "esempio.loc"  {
                type forward;
                forwarders { 192.168.58.4; };
                forward only ;
        };

        zone "8.10.10.in-addr.arpa"    {
                type forward;
                forwarders { 10.10.100.1; };
                forward only ;
        };
        
        zone "7.10.10.in-addr.arpa"    {
                type forward;
                forwarders { 10.10.100.1; };
                forward only ;
        };
        
  }; // end internal view


view "external" {
      match-clients { any; };
      allow-recursion { net-externals; };
      allow-query { any; };

        zone "esempio.com"  { 
                type master;
                file "master/esempio.com/ext.esempio.com.zone";
                allow-query { any; };
        };

        zone "solutioncafe.it"  { 
                type master;
                file "master/solutioncafe.it/ext.solutioncafe.it.zone";
                allow-query { any; };
        };

  }; // end external view

descrizione: il file named.conf di esempio, si divide in:

configurazione globale: contiene la configurazione globale del server DNS;

  1. listen-on { 127.0.0.1; x.x.x.x; }; riferisce con quali indirizzo/i dell’ host erogare il servizio.
  2. forwarders { x.x.x.x; y.y.y.y;  }; riferisce a quale indirizzo/i inoltrare le richieste che non può risolvere in autonomia (last resort ).

view “internals”: contiene la lista dei nomi dei file di zona per ciascun dominio per il quale il DNS è autoritativo.

  1. match-clients { !net-externals; net-internals; localhost; };  si riferisce a quali gruppi di IP (clients) possono accedere a questa vista, in questo caso è negato l’accesso (!) al gruppo net-externals è invece permesso al gruppo net-internals e localhost;
  2. allow-query { localhost; net-internals; }; si riferisce a quali gruppi di IP (clients) che possono effettuare query alle zone per domini di questa vista.
  3. zone “.” si riferisce al dominio . (root); il file contiene la lista dei root DNS ai quale inoltrare le richieste che il DNS non può risolvere in autonomia; sostituisce i forwarders visti in precedenza qualora si abbia la possibilità di esporre a internet il DNS.
  4. // FORWARD  alla linea (linea 100), indica un gruppo di domini, per i quali non esiste il file di configurazione, ma la cui risoluzione deve essere inoltrata a un forwarders { x.x.x.x; }; specifico per ciascun dominio dell’elenco ed è diverso dagli indirizzi dei forwarders globali; questa tecnica è chiamata forwarding condizionale.

view “esternals”: contiene la lista dei nomi dei file di zona per ciascun dominio per il quale il DNS è autoritativo;

  1. match-clients { any; };  si riferisce a IP (clients) possono accedere a questa vista, in questo caso qualsiasi IP;
  2. allow-recursion { net-externals; };  indica che le query ricorsive, possono essere fatte solo dalle reti interne.

Il numero di viste è arbitrario, in questa configurazione mi sono limitato a specificarne due, per non complicare troppo l’esposizione.

Esempio di file named.acl

# -----------------------------------------------------------------------------
# - Zone file name      :       named.acl
# - Author              :       NM
# - DNS administrator   :       NM
# - Create              :       02.10.2024
# - Last Update         :       02.10.2024
# - Description         :       File di configurazione BIND Almalinux 9.2
# - Position            :       /jail/named/etc
# - note                :       NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE
#  ----------------------------------------------------------------------------

// acl's "localhost", "none", "any", "localnets" are built-in in BIND
// NOTE: "localnets"  --> matches all the IP address(es) and subnetmasks of the server on which BIND is installed


acl "host-vpn-vps" {
        172.16.89.5/32;
  };

acl "net-vpn-roadwarrior" {
        172.16.88.0/25;
  };

acl "net-office" {
        10.10.7.0/27;
        10.10.8.0/27;
        172.16.60.32/27;
  };

acl "net-internals" {
        127.0.0.1;
        localhost;
        net-office;
        host-vpn-vps;
        net-vpn-roadwarrior;
  };

acl "net-externals" {
        5.2.22.56/29;             ### RETE PUBBLICA
        15.235.197.206/32;        ### HOST VPS (ipv4)
        2402:1f00:8000:800::19be; ### HOST VPS (ipv6)
  };

descrizione: Il file acl, raggruppa indirizzi IP di reti e host, poi utilizzati nel file named.conf per “condizionare” il comportamento del flusso di richieste; il file contiene tre gruppi in cui sono elencati i relativi indirizzi IP che vengono poi aggiunti, utilizzando il nome specifico, a ulteriori due gruppi che saranno, poi, utilizzati nelle viste.

La scelta di creare tre gruppi da confluire in ulteriori due gruppi, potrebbe sembrare inutile, ma la gestione granulare, realizzata in questo modo, agevola di molto leggibilità e di conseguenza la manutenzione, soprattutto i numero di reti da gestire è elevato; in ogni caso, nulla vieta di creare solo il gruppo da utilizzare nella vista (in questo caso due).

Esempio di file named.logger

# -----------------------------------------------------------------------------
# - Zone file name      :       named.logger
# - Author              :       NM
# - DNS administrator   :       NM
# - Create              :       02.10.2024
# - Last Update         :       02.10.2024
# - Description         :       File di configurazione BIND Almalinux 9.2
# - Position            :       /jail/named/etc
# - note                :       NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE
#  ----------------------------------------------------------------------------
// defaults to use 7 files in rotation
// BIND 9.x parses the whole file before using the log
// failure messages up to this point are in (syslog) /var/log/messages

logging {
        channel log-syslog {
                syslog daemon;
                severity info;
                };

        channel log-config {
                file "var/log/config.log" versions 99 size 10M;
                severity info;
                print-severity yes;
                print-time yes;
                print-category yes;
                };

        channel log-client {
                file "var/log/client.log" versions 99 size 10M;
                severity info;
                print-severity yes;
                print-time yes;
                print-category yes;
                };

        channel log-query {
                file "var/log/query.log" versions 99 size 20M;
                severity info;
                print-severity yes;
                print-time yes;
                print-category yes;
                };

        channel log-security {
                file "var/log/security.log" versions 99 size 10M;
                severity info;
                print-severity yes;
                print-time yes;
                print-category yes;
                };

        channel log-xfer-in {
                file "/var/log/xfer-in.log" versions 99 size 10M;
                severity info;
                print-severity yes;
                print-time yes;
                print-category yes;
                };

        channel log-xfer-out {
                file "/var/log/xfer-out.log" versions 99 size 10M;
                severity info;
                print-severity yes;
                print-time yes;
                print-category yes;
                };

        category config {
                log-syslog;
                };

        category client {
                log-client;
                };

        category queries {
                log-query;
                };

        category security {
                log-security;
                };

        category xfer-in {
                log-xfer-in;
                };

        category xfer-out {
                log-xfer-out;
                };

  };

descrizione: nel file named.logger sono definite le regole di logging, il file di esempio permette la gestione separata per ciascuno dei sette canali implementato da BIND in modo di raccogliere le informazioni in modo granulare.

Esempio di file della zona interna (int.esempio.com.zone)

;# -----------------------------------------------------------------------------
;# - Zone file name      :       int.esempio.com.zone
;# - Author              :       NM
;# - DNS administrator   :       NM
;# - Create              :       02.10.2024
;# - Last Update         :       03.10.2024
;# - Description         :       file per la zona esempio.com
;# - Position            :       /master/esempio.com
;# - Info                :
;# - Note                :       NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE
;#  ----------------------------------------------------------------------------

$TTL    86400

@       IN      SOA     ns1.esempio.com. admin.esempio.com. (

                          2024100201 ; Serial
                          3600       ; Refresh
                          1800       ; Retry
                          604800     ; Expire
                          86400 )    ; Negative Cache TTL
;

@       IN      NS      ns1.esempio.com.
@       IN      A       192.168.1.10

ns1     IN      A       172.16.60.40

www     IN      A       192.168.1.10

mail    IN      A       192.168.1.11
smtp    IN      CNAME   mail

Esempio di file della zona esterna (ext.esempio.com.zone)

;# -----------------------------------------------------------------------------
;# - Zone file name      :       ext.esempio.com.zone
;# - Author              :       NM
;# - DNS administrator   :       NM
;# - Create              :       02.10.2024
;# - Last Update         :       03.10.2024
;# - Description         :       file per la zona esempio.com
;# - Position            :       named/master/esempio.com
;# - Info                :
;# - Note                :       NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE
;#  ----------------------------------------------------------------------------

$TTL    86400

@       IN      SOA     ns1.esempio.com. admin.esempio.com. (

                          2024100201 ; Serial
                          3600       ; Refresh
                          1800       ; Retry
                          604800     ; Expire
                          86400 )    ; Negative Cache TTL
;

@       IN      NS      ns1.esempio.com.

@       IN      A       203.0.113.10

ns1     IN      A       203.0.113.10
www     IN      A       203.0.113.10

mail    IN      A       203.0.113.11
smtp    IN      CNAME   smtp.myprovider.com.

Avvio del server DNS

tips & tricks

Per controllare che non ci siano errori di sintassi nel file named.conf, eseguite:

/usr/local/named/bin/named-checkconf -t /jail/named /etc/named.conf

Assegnazione dei permessi corretti a tutti i file nella root jail

chown -R named:named /jail/named

Avvio del server

systemctl restart named

Un’occhiata al log messages

tail -f /var/log/messages

Oct 2 21:18:01 fe01 named[4110]: automatic empty zone: view external: EMPTY.AS112.ARPA
Oct 2 21:18:01 fe01 named[4110]: automatic empty zone: view external: HOME.ARPA
Oct 2 21:18:01 fe01 named[4110]: automatic empty zone: view external: RESOLVER.ARPA
Oct 2 21:18:01 fe01 named[4110]: command channel listening on 127.0.0.1#953
Oct 2 21:18:01 fe01 named[4110]: managed-keys-zone/internal: loaded serial 0
Oct 2 21:18:01 fe01 named[4110]: managed-keys-zone/external: loaded serial 0
Oct 2 21:18:01 fe01 named[4110]: zone esempio.com/IN/internal: loaded serial 2024100201
Oct 2 21:18:01 fe01 named[4110]: zone esempio.com/IN/external: loaded serial 2024100201
Oct 2 21:18:01 fe01 named[4110]: all zones loaded
Oct 2 21:18:01 fe01 named[4110]: running

Verifica del processo

ps -ef |grep named

named 4110 1 0 21:18 ? 00:00:00 /usr/local/named/sbin/named -u named -t /jail/named -c /etc/named.conf -n 2

Prova di lookup, dal server dns stesso

[root@fe01 esempio.com]# nslookup
> www.esempio.com
Server: 172.16.60.40
Address: 172.16.60.40#53

Name: www.esempio.com
Address: 192.168.1.10
>

Prova di lookup da un server diverso su rete diversa

[root@web01 named]# nslookup
> www.esempio.com
Server: 203.0.113.10
Address: 203.0.113.10#53

Name: www.esempio.com
Address: 203.0.113.10
>

Considerazioni finali

La configurazione delle viste in BIND è uno strumento potente per gestire scenari DNS complessi, consentendo di personalizzare le risposte in base alle esigenze specifiche di diversi gruppi di client.

Nicola Montemurro

Nicola Montemurro un Consulente IT specializzato in sicurezza e resilienza infrastrutturale, Windows, Linux, VMWare, CCNA

Tutte le storie di:Nicola Montemurro

    Preferenze Privacy

    Quando visiti il nostro sito web, possono essere memorizzate alcune informazioni, di servizi specifici, tramite il tuo browser, di solito sotto forma di cookie. Qui puoi modificare le tue preferenze sulla privacy. Il blocco di alcuni cookie può influire sulla tua esperienza sul nostro sito Web e sui servizi che offriamo.

    Click to enable/disable Google Analytics tracking code.
    Click to enable/disable Google Fonts.
    Click to enable/disable Google Maps.
    Click to enable/disable video embeds.
    Il nostro sito web utilizza cookie, principalmente di terze parti. Personalizza le preferenze sulla privacy e/o acconsenti all'utilizzo dei cookie.