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!.
Tartalomjegyzék
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