[parte II] DNS, questo sconosciuto.. Configurazione di un Master autoritativo puro

By j0lly, gio 19 giugno 2014, in category Sysadmin

bind, dns

Eccomi per la configurazione personale del mio Bind9 Master, autoritativo per il mio dominio, ed assolutamente non ricorsivo :).

bind9

Nell'articolo mostro anche dei test con dig per verificare le configurazioni ed il livello di sicurezza; consiglio di leggere la teoria alla base delle scelte di configurazione scritte nell'articolo I sui DNS.

Premetto che la maggior parte del lavoro di configurazione è stato preso da questo articolo, dove l'autore sembra davvero competente. Lui ha utilizzato una confgurazioen in chroot; io spero di poter testare la cosa in futuri, come compendio ad un terzo articolo sugli slave o magari sull'implementazione di un dns interno con forwarding etc.

La mia confgurazione consiste in:

Bind9 su debian utilizza 4 principali files di configurazione:

  1. named.conf

  2. named.conf.default-zones

  3. named.conf.options

  4. named.conf.local

named.conf fa semplicemente il source degli altri 3 files.

named.conf.default-zones contiene le zone di default, tra cui gli indirizzi dei root servers e le zone per localhost (necessarie se si usa bind come resolver interno); anche questo file può non essere toccato.

Named.conf.options è il file che gestisce tutte le regole globali del NameServer, non specificatamente definite all'interno dei contesti "zone".

Ecco il mio:

/*
* Deny transfers by default except for the listed hosts.
* If we have other name servers, place them here.
*/
acl "xfer" {
xxx.xxx.xxx.xxx;
};

/*
* You might put in here some ips which are allowed to use the cache or
* recursive queries
*/
acl "trusted" {
127.0.0.0/8;
};

options {
directory "/var/cache/bind";
pid-file "/var/run/named/named.pid";
dump-file "/tmp/named_master_dump.db";

listen-on-v6 { none; };
// listen-on { 127.0.0.1; };
listen-on { any; };

/*
* Accept queries from our "trusted" ACL. We will
* allow anyone to query our master zones below.
* This prevents us from becoming a free DNS server
* to the masses.
*/
allow-query {
trusted;
};

/* Use the cache for the "trusted" ACL. */
allow-query-cache {
trusted;
};

/* Only trusted addresses are allowed to use recursion. */
allow-recursion {
trusted;
};

/* Zone tranfers are denied by default. */
allow-transfer {
none;
};

/* Don't allow updates, e.g. via nsupdate. */
allow-update {
none;
};

/* if you have problems and are behind a firewall: */
//query-source address * port 53;

dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
version "windows NT";

//forward first

// forwarders {
// 0.0.0.0;
// };
};

In soldoni, questo file crea alcune acl: la prima da applicare al xfer transfer, nel caso creiate degli slave, basta aggiungere i loro ip sostituendoli alle xxx; la seconda crea un gruppo di ip trusted che potranno usare il NameServer come resolver ricorsivo (a la Google DNS).

Alla configurazione di default ho aggiunto l'opzione dump-file, perché esiste un bug (per lo meno nel pacchetto debian) che di default scrive il dump delle zone in una cartella non accessibile a bind, facendomi impazzire in fase di troubleshooting; più in basso è stato disabilitato l'IPv6..

Le direttive successive in pratica abilitano query, lettura record in cache e recursion solo per gli IP trusted (localhost) e vedremo che queste opzioni vengono sovrascritte all'interno della nostra zona particolare.

Ultima direttiva utile è il deny del trasfer che, anch'esso, verrà riabilitato per determinati host in sede di opzioni di zona.

la direttiva version che ho aggiunto, beh, ne parlo dopo :P

Named.conf.local è il file preposto alla gestione delle zone personali, con confgurazioni ad-hoc e il richiamo al file.db con i dati della zona; il mio è così:

//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

// We are the master server for j0llyb0x.org
zone "j0llyb0x.org" {
type master;
file "/etc/bind/db.j0llyb0x.org";
allow-query { any; };
allow-transfer { xfer; };
};

Nella configurazione di zona, come si vede, si punta al file (ricordate il path assoluto!) che hosta i records, per i quali siamo Master; le due direttive allow-query e allow-transfer, servono a gestire questa zona particolare, permettendo le query non ricorsive (la cache dei record e la ricorsività restano disabilitati a livello di conf globali) per i record specifici e il transfer da parte degli host slave "sicuri".

Da notare che non ho ancora configurato i PTR records, ma non è complesso partendo da quello di default per localhost (127.in-addr.arpa). In questo file viene specificata una zona di competenza, per la quale bind è autoritativo e Master.

Ed ecco il contenuto del mio file di zona db.j0llyb0x.org:

;
; Zone file for j0llyb0x.org
;
$TTL 3D
@ 100 IN SOA ns1.j0llyb0x.org. admin.j0llyb0x.org. (

201406181 ; serial, todays date+todays serial
28800 ; refresh, seconds
7200 ; retry, seconds
360000 ; expire, seconds
86400 ; minimum, seconds
)

; DEFINE NS RECORDS
ns1 100 IN A xxx.xxx.xxx.xxx
@ 100 IN NS ns1.j0llyb0x.org.
; DEFINE A RECORDS
@ 100 IN A xxx.xxx.xxx.xxx
madhatter 100 IN A xxx.xxx.xxx.xxx
newsun 100 IN A xxx.xxx.xxx.xxx
mail 100 IN A xxx.xxx.xxx.xxx

; DEFINE CNAME
www 100 IN CNAME @
ftp 100 IN CNAME newsun
ns 100 IN CNAME madhatter

; DEFINE MX RECORDS
@ 100 IN MX 0 mail

Non ho studiato molto i parametri e valori ottimali per timeout etc, ma credo che questi (presi dal blog già referenziato sopra) siano più che accettabili per un uso didattico.

La lista è semplice: viene richiamato un record SOA che punta al NS Master primario per il dominio j0llyb0x.org (@ sta per il nome referenziato nel file di zona in named.conf.local); come seconda cosa, ho referenziato il NS con un record A e, poi, definendolo come NS per il dominio.

Successivamente ho impostato alcuni record A ad alcuni server; infine dei CNAME ed un MX server (totalmente fittizio dato che non ho un server di posta :P ).

Non sto qui a spiegare cosa fanno i vari record perché esiste una marea di documentazione e, soprattutto, esistono gli RFC 1034 e 1035!

Come chicca, vorrei lasciare alcune info che ho reperito sulla rete rispetto al discovery di informazioni sensibili da parte del Server Bind (alcuni post sull'argomento risalgono al 2006 :P):

all'interno del codice di Bind, si trovano dei record di zona non dichiarati esplicitamente, che possono mostrare alcune info importanti come:

dal codice:

"
#
# Zones in the "_bind" view are NOT counted in the count of zones.
#
view "_bind" chaos {
recursion no
notify no
allow-new-zones no

zone "version.bind" chaos {
type master
database "_builtin version"
}

zone "hostname.bind" chaos {
type master
database "_builtin hostname"
}

zone "authors.bind" chaos {
type master
database "_builtin authors"
}

zone "id.server" chaos {
type master
database "_builtin id"
}
}

"

Con la configurazione Bind che ho fatto, queste informazioni non sono rivelate alla rete, ma potete provarle facendo una query particolare con dig da un ip in acl "trusted" o, se preferite, su qualche sventurato server (io non l'ho detto):

dig -t TXT -c CHAOS {HOSTNAME,VERSION,AUTHORS}.BIND @[bind.ip]

Il mio risultato :)

[root@newsun][~]
06:54:37 # dig -t TXT -c CHAOS VERSION.BIND @127.0.0.1

; DiG 9.8.4-rpz2+rl005.12-P1 ; -t TXT -c CHAOS VERSION.BIND @127.0.0.1
; global options: +cmd
; Got answer:
; HEADER - opcode: QUERY, status: NOERROR, id: 40540
; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
; WARNING: recursion requested but not available

; QUESTION SECTION:
VERSION.BIND. CH TXT

; ANSWER SECTION:
VERSION.BIND. 0 CH TXT "windows NT"

; AUTHORITY SECTION:
VERSION.BIND. 0 CH NS VERSION.BIND.

; Query time: 0 msec
; SERVER: 127.0.0.1#53(127.0.0.1)
; WHEN: Thu Jun 19 06:54:42 2014
; MSG SIZE rcvd: 67

come di consueto lascio le referenze:

stavrovski

hostingtalk

debianizzati

openlogic

zytrax

Qualcosa di simile