Bind 9 telepítése (Squeeze)
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