Bind 9 telepítése (Squeeze)

Innen: AdminWiki

Ez a leírás egy cache-only BIND-9 DNS kiszolgáló telepítését írja le chroot fogdába zárva. A cache-only névszerver később tetszés szerint bővíthető.

A cache-only névszerver szolgáltatást rutinszerűen telepíthetjük minden publikus levelező szerverre, webkiszolgálóra, stb. Jogos kérdés, hogy ere a feladatra a monolitikus és terjedelmes BIND-9 kell-e (sokak szerint nem). Más DNS szerverek megismerése, leírása: TODO!.

Telepítés

Debian csomagból történik. Teszteléshez és az adminisztráció megkönnyítésére az alapvető klienseket tartalmazó dnsutils csomagot is telepítsük:

apt-get install bind9 dnsutils # Plusz függőség könyvtárak

A telepítés elindítja a konfigurálatlan névszervert, ezt állítsuk le:

/etc/init.d/bind9 stop

A chroot fogda beállítása

A jail-t egy írható és futtatható partícióra kell tenni, ez célszerűen külön lehet mount-olva, pl. a /srv/chroot/bind mountpoint-ra. TODO: bind-mount illetve a chroot-on belüli szigorítások meggondolása!

Rendezzük be a fogdát:

mkdir -p -m 755 /srv/chroot/bind
# etc
mkdir /srv/chroot/bind/etc
mv /etc/bind /srv/chroot/bind/etc
chown -R bind:bind /srv/chroot/bind/etc/bind
cp /etc/localtime /srv/chroot/bind/etc/localtime
ln -s /srv/chroot/bind/etc/bind /etc/bind # Security, stb. update-ek miatt
# dev
mkdir /srv/chroot/bind/dev
mknod /srv/chroot/bind/dev/null c 1 3
mknod /srv/chroot/bind/dev/random c 1 8
chmod 666 /srv/chroot/bind/dev/null /srv/chroot/bind/dev/random
# var
mkdir -p /srv/chroot/bind/var/cache/bind
mkdir -p /srv/chroot/bind/var/run/bind/run
chown -R bind:bind /srv/chroot/bind/var/*

A syslog-ng használata esetén a chroot-olt bind képes a syslog-ba írni, erre vonatkozó külön beállítás nem szükséges.

A fogda elkészítése után adjuk meg annak útvonalát a bind konfigurációs állományában:

-rw-r--r-- root root /etc/default/bind9

# BIND chrooted!
OPTIONS="-u bind -t /srv/chroot/bind"

és indítsuk el a démont:

/etc/init.d/bind9 start; tail -f /var/log/syslog

A syslog-ban ellenőrizhető a démon indulása.

BIND bejegyzése a Tiger által ismert démonok közé

A DNS szerver a bind Linux felhasználó nevében állandóan fut, így a biztonsági figyelmeztetések elkerülése érdekében be kell azt jegyezni a tigerrc állományba:

-rw-r--r-- root root /etc/tiger/tigerrc

[...]
Tiger_Listening_ValidUsers='[...]|bind|[...]'
[...]
Tiger_Listening_ValidProcs='[...]|named|[...]'
[...]
Tiger_Running_Procs='[...] /usr/sbin/named [...]'
[...]

Kérések és biztonsági riasztások naplózása

A DNS kérések naplózása azért célszerű, mert ennek alapján lehet a Munin segítségével monitorozni a szerver tevékenységét, illetve visszautasított kérések naplója a fail2ban számára szükséges. Ehhez a Bind számára írjuk elő a fentiek syslogon keresztüli logolását (ez alapértelmezésben nincs beállítva):

-rw-r--r-- root bind /etc/bind/named.conf.options

options {
[...]
};

logging {
    channel b_query {
        syslog daemon;
        print-time yes;
        severity info;
    };

    category default { default_syslog; default_debug; };
    category queries { b_query; };
    category unmatched { null; };
    // Disable some annoying log entries
    category lame-servers {null; };
    category edns-disabled { null; };
};

és módosítsuk a syslog beállítását, hogy külön file-ba menjen a napló. A házirendben szereplő syslog-ng esetében a destinations rész végére szúrjuk be az alábbiakat:

-rw-r--r-- root root /etc/syslog-ng/syslog-ng.conf

[...]
# Bind 9 separate logging
destination d_bind9_queries
{
  file ("/var/log/bind9/query.log"
  owner(root)
  group(adm)
  );
};
destination d_bind9
{
  file ("/var/log/bind9/bind9.log"
  owner(root)
  group(adm)
  );
};
[...]

A filters rész végére írjuk be az alábbiakat:

-rw-r--r-- root root /etc/syslog-ng/syslog-ng.conf

[...]
# Bind 9 separate logging
filter f_bind9_queries
{
  level (info) and match ("query:" value ("MESSAGE")) and facility(daemon);
};
filter f_bind9
{
  level (info..emerg) and match ("named" value ("PROGRAM")) and facility(daemon);
};
[...]

Végül a logs rész elejére (így a final flag miatt csak az új query.log logban jelennek meg a normális lekérések, azaz nem zavarják a logcheck-et, stb.) szúrjuk be az alábbiakat:

-rw-r--r-- root root /etc/syslog-ng/syslog-ng.conf

[...]
# Bind 9 separate logging
log
{
  source (s_src);
  filter (f_bind9_queries);
  destination (d_bind9_queries);
  flags(final);
};
log
{
  source (s_src);
  filter (f_bind9);
  destination (d_bind9);
};
[...]

A változtatásokat a syslog-ng és a bind9 újraindításával érvényesíthetjük:

/etc/init.d/syslog-ng restart; /etc/init.d/bind9 restart; tail -f /var/log/syslog

Bug: jelenleg a syslog-ng nem hozza létre a /var/log/bind9 könyvtárat, így azt manuálisan kell elkészíteni.

# Ha a fenti parancs sikertelen volt:
mkdir -m 755 /var/log/bind9
/etc/init.d/syslog-ng restart; /etc/init.d/bind9 restart; tail -f /var/log/syslog

Remélem, ezt kijavítják.

Gyorstesztként indítsunk egy lekérést, és nézzük meg, hogy bekerül-e a logba:

dig @localhost www.debian.org; tail -f /var/log/bind9/query.log

Gondoskodjunk az új logok rotálásáról:

-rw-r--r-- root root /etc/logrotate.d/bind9

/var/log/bind9/*.log {
    daily
    rotate 7
    compress
    missingok
    create 0640 root adm
}

Végül vegyünk fel egy logcheck szabályt a (kevéssé releváns) visszautasított kérések kiszűrésére:

touch /etc/logcheck/ignore.d.server/bind-query-denied
chown root:logcheck /etc/logcheck/ignore.d.server/bind-query-denied
chmod 640 /etc/logcheck/ignore.d.server/bind-query-denied
mcedit /etc/logcheck/ignore.d.server/bind-query-denied
-rw-r----- root logcheck /etc/logcheck/ignore.d.server/bind-query-denied

^\w{3} [ :0-9]{11} [-._[:alnum:]]+ named\[[0-9]+\]: client [.:[:xdigit:]]+#[[:digit:]]+: query (\(cache\))? '[^']*' denied$
^\w{3} [ :0-9]{11} [-._[:alnum:]]+ named\[[0-9]+\]: client [.:[:xdigit:]]+#[[:digit:]]+: update '[^']*' denied$

Belső hálózati zóna kezelése

Előfordulhat, hogy adott zónák adatait nem az alapértelmezett nameserverekről szeretnénk megkapni - pl. egy két hálózati interface-szel rendelkező szervergépnél a belhálózati neveket illetve reverse-eket a helyi DNS szerver(ek)ről szeretnénk megkapni (máshonnét nem is lehetne), de az általános DNS feloldásokat nem - azokat "saját hatáskörben" intéznénk. Ilyenkor a belső zónák és a belhálózati IP tartomány reverse-e számára forwarder bejegyzéseket érdemes definiálni a /etc/bind/named.conf.local állományban:

-rw-r--r-- bind bind /etc/bind/named.conf.local

[...]
// local domain
zone "OFFICE.MYDOMAIN.COM" {
	type forward;
        forward only;
	forwarders {IP.IP.IP.IP; IP.IP.IP.IP;};
};

// RFC-1918 non-routable IP range (reverse)
zone "10.in-addr.arpa" {
	type forward;
        forward only;
	forwarders {IP.IP.IP.IP; IP.IP.IP.IP;};
};

ahol IP.IP.IP.IP a belső hálózati DNS szerver(ek) IP címei (a belhálózati domain nevet és az - RFC-1918 szerinti - IP tartományt módosítsuk az általunk használtra!).

A beállítás arra utasítja a named-et, hogy a megnevezett zóna illetve reverse IP tartomány feloldásait csak a felsorolt nameserver(ek)től kérje.

Kérések monitorozása a Muninnal

Amennyiben telepítve van a munin-addons csomag, a monitorozás az alábbi parancsokkal vehető használatba:

cp -p /usr/local/share/munin/plugin-conf.d/bind9 /etc/munin/plugin-conf.d/bind9
ln -s /usr/local/share/munin/plugins/bind9 /etc/munin/plugins/bind9
touch /var/lib/munin/plugin-state/bind9.state; chown root:munin /var/lib/munin/plugin-state/bind9.state # Bug lehet...
/etc/init.d/munin-node restart

Gyorsteszt:

dig @localhost www.debian.org
telnet localhost 4949
[...]
fetch bind9
>  query_A.value 1
>  query_other.value 0
>  .
quit

A cache only DNS használatba vétele

TODO: pontosítani!

A Debian telepítés utáni BIND azonnal használható cache-only névszerverként, ha névkiszolgálóként történő használatát előírjuk a /etc/resolv.conf állományban:

-rw-r--r-- root root /etc/resolv.conf

[...]
nameserver 127.0.0.1
[...]

Amennyiben a telepítés alatt álló gép DHCP-n keresztül kap IP-címet, érdemes előírni a DHCP kliensnek, hogy ezt a beállítást hagyja meg elsőként használatos nameservernek (ellenkező esetben a következő IP lease megújításnál bejegyzésünk felülíródhat). Ehhez módosítsuk a /etc/dhcp/dhclient.conf állományt (vegyük ki a commentet az alábbi sor elől):

-rw-r--r-- root root /etc/dhcp/dhclient.conf

[...]
prepend domain-name-servers 127.0.0.1;

Ezután kérjünk egy DNS feloldást a dig paranccsal, pl.

dig www.debian.hu
[...]
;; Query time: 62 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
[...]

A válasz végén látható, hogy az valóban a helyi névkiszolgálón keresztül érkezett (127.0.0.1) és megfigyelhető a válaszidő is. A kérés ismételt kiadása esetén ez a válaszidő (közel) 0 lesz, jelezve, hogy a feloldás a helyi cache-ből történt.

Nyilvános DNS szolgáltatás

Az alábbi beállításokra akkor van szükség, ha a DNS szolgáltatás nyilvános. Ez esetben a ne felejtsük el kitölteni az allow-transfer (a secondary-k és a NIC felé, ha primary DNS szervert üzemeltetünk) illetve az allow-recursion (ha van olyan IP tartomány, amely számára mi szolgáltatjuk a teljes DNS-t) részeket a named.local.options állományban!

TODO!

fail2ban integráció

Egészítsük ki a maintainer által biztosított, a named-re vonatkozó szabályokat úgy, hogy tiltsa a dinamikus update-et is:

-rw-r--r-- root root /etc/fail2ban/filter.d/named-refused.conf

[...]
failregex = %(__line_prefix)sclient <HOST>#\S+: query(?: \(cache\))? '.*' denied\s*$
            %(__line_prefix)sclient <HOST>#\S+: update '.*' denied\s*$
[...]

Adjuk meg a bind9.log naplót a fail2ban számára figyelendőnek, és rendeljük hozzá a megfelelő szabályokat:

-rw------- root root /etc/fail2ban/jail.local

[...]

# TCP only - see http://nion.modprobe.de/blog/archives/690-fail2ban-+-dns-fail.html
[named-refused-tcp]
enabled = true
logpath = /var/log/bind9/bind9.log

Olvastassuk újra a fail2ban konfigurációját, és a naplóban ellenőrizzük, hogy megjelent-e a named-re vonatkozó jail:

/etc/init.d/fail2ban stop; /etc/init.d/fail2ban start; tail -f /var/log/fail2ban.log

Gyors tesztként TODO!

DNS kérés átengedése a bástyagép tűzfalán

A kifelé menő DNS kérések a tűzfal policy-ban eleve engedélyezettek. Beérkező kérés átengedésére csak akkor van szükség, ha BIND nemcsak cache-only, hanem tényleges névszerverként is üzemel.

Shorewall használata esetén:

-rw-r----- root root /etc/shorewall/rules

[...]
DNS/ACCEPT        ZONE    fw
[...]

engedélyezi a DNS igénybe vételét a ZONE zóna felől. A változtatás érvényesítéséhez a Shorewall-t újra kell indítani:

/etc/init.d/shorewall restart

Irodalom