Bind 9 telepítése (Wheezy)

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, és klasszikus, konfigurációs fájl alapú backend-et használva. A cache-only névszerver később tetszés szerint bővíthető pl. Internet névszerverré vagy belső hálózati (dinamikus) DNS kiszolgálóvá.

A cache-only névszerver szolgáltatást rutinszerűen telepíthetjük minden publikus levelező szerverre, webkiszolgálóra, stb. (általában minden standalone kiszolgálóra). 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.

Megjegyzés: egy régi hiba miatt a fogdában futó bind esetén a /etc/init.d/bind9 status parancs hibásan működik, minden esetben failed értékkel tér vissza.

Beállítások

A Bind9 alapbeállításai általában megfelelőek, így az /etc/bind9/named.conf.options állományban csak két kis kiegészítést teszünk:

  • Tiltjuk az IPv6 használatát;
  • Tiltjuk a Bind9 verziószámának publikus lekérdezését (egy kis security in obscurity).
-rw-r--r-- bind bind /etc/bind/named.conf.options

options {
        [...]
        // IPv6 disabled.
        listen-on-v6 { none; };

        // Do not make public version of BIND.
        version none;
};

A módosítások a névszerver következő újraindításakor érvényesülnek.

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

Alapértelmezésben a Bind9 a syslog-ba naplóz, és a naplóban (nyilván terjedelmi okból) az egyes konkrét lekérések nem szerepelnek. Az egyes DNS kérések naplózása alapján lehet pl. a Munin segítségével monitorozni a szerver tevékenységét, a visszautasított kérések naplója pl. a fail2ban számára szükséges. Fentiek számára két új naplóállományt készítünk: a /var/log/bind9/query.log csak a lekéréseket tartalmazza, a /var/log/bind9/bind9.log minden mást.

A beállításhoz készítsünk egy új konfigurációs állományt a Bind számára, és ebben írjuk elő a fentiek syslog-on keresztüli naplózását (ez alapértelmezésben nincs beállítva) és tiltsunk meg néhány feleslegesnek tűnő eseménynaplózást:

touch /etc/bind/named.conf.logging
chown bind:bind /etc/bind/named.conf.logging
mcedit /etc/bind/named.conf.logging
-rw-r--r-- bind bind /etc/bind/named.conf.logging

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

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

A most elkészített konfigurációs állományt a /etc/bind/named.conf állomány részeként fogjuk bejegyezni:

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

[...]

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.logging";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

A Bind beállítása után módosítsuk a syslog beállítását is, hogy ténylegesen két külön fájlba menjen az így keletkező 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 { facility(daemon) and match("named" value("PROGRAM")) and match("query:" value("MESSAGE")); };
filter f_bind9 { facility(daemon) and match("named" value("PROGRAM")); };
[...]

Végül a logs rész elejére (így a final flag miatt csak az új logokban jelennek meg a named üzenetek, 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); flags(final); };
[...]

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/bind9/bind9.log

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/bind9/bind9.log

Remélem, ezt kijavítják.

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

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

Gondoskodjunk az új naplók 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
    postrotate
       [ -e /etc/init.d/bind9 ] && /etc/init.d/bind9 reload > /dev/null 2>&1 || true
    endscript
}

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

Opcionális beállítás; belső hálózati és nem kifejezetten DNS kiszolgáló gépeken alkalmazzuk.

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.

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 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-node/plugin-state/bind9.state; chown root:munin /var/lib/munin-node/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

Hiba esetén ellenőrizzük a plugin beállító állományát:

-rw-r--r-- root root /etc/munin/plugin-conf.d/bind9

[bind9]
    user root
    env.statefile /var/lib/munin-node/plugin-state/bind9.state
    env.logfile /var/log/bind9/query.log

A munin-addons régebbi változataiban ez env.statefile path máshova mutat, ezt szükség esetén javítsuk ki.

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.

Publikus DNS kiszolgálás előkészítése

Az alábbi beállításokra csak akkor van szükség, ha a lokális DNS szolgáltatást mások számára is ki szeretnénk terjeszteni, azaz publikus DNS kiszolgálót telepítünk.

fail2ban integráció

A fail2ban segítségével a kiszolgáló túlterhelése (DOS) ellen védekezünk.

Egészítsük ki a maintainer által biztosított, a named-re vonatkozó szabályokat úgy, hogy vonatkozzék a dinamikus update kísérletekre 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 házirend szerinti tűzfalszabályokban 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

Rekurzív DNS kérések engedélyezése

Alapértelmezetten a BIND csak azokra a DNS kérésekre válaszol bárkinek (azaz nem a localhost-nak), amelyekre nézve authoritatív (azaz a válaszhoz nem kell további, külső lekérdezéseket indítania). Amennyiben a telepítés alatt álló gép dedikált DNS szerver valamely IP tartomány számára (pl. egy SOHO hálózat DNS szervere, azaz bármilyen innen érkező kérést ki kell szolgálnia), akkor ezt a viselkedést a /etc/bind/named.conf.options állományban engedélyezni kell:

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

options {
[...]
        allow-recursion { IP.IP.IP.IP/MASK; localhost; };
};

A változtatást a BIND újraindításával érvényesíthetjük:

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

Irodalom