De standaard configuratie van bind staat vrijwel alles toe: iedereen
mag alle data opvragen en alle data is voor iedereen gelijk. Op het
huidige internet is dat niet meer altijd gewenst. Soms is het zelfs
niet netjes om iedereen toegang te geven tot alle data: A-records
die wijzen naar privé-ranges zoals 10.* zouden niet mogen worden
gezien door mensen op het internet.
In dit hoofdstuk bespreek ik twee manieren om je DNS-server te beveiligen: access control en views.
Met access control zijn bepaalde acties te beperken voor bepaalde IP-ranges. Dit is in te stellen voor de gehele server of per zone.
Dit zijn de meest belangrijke access controls:
Beperkt zonetransfers. Standaard zijn zonetransfers toegestaan
voor iedereen, maar dat is zeer zelden gewenst. In de
voorbeeld named.conf is dit dan ook beperkt.
Beperkt queries. Hiermee is in te stellen wie queries mag doen
op de server of een zone. Als ns.example.com een slave
zou zijn van office.example.com, dan zouden queries
bijvoorbeeld beperkt kunnen worden tot het netwerk van
example.com.
Een recursieve query is een query voor een record waarvoor de
server niet authoritative is. De server moet dus contact
opnemen met andere nameservers om het antwoord te vinden. Dit
levert een belasting op op de server die niet altijd gewenst
is. In de voorbeeld named.conf is recursie beperkt tot
het lokale netwerk.
Zie het hoofdstuk over DHCP: allow-update staat dynamische updates toe.
TSIG-ondertekende aanvragen. Dit is
met name nuttig bij zonetransfers en dynamic updates.
Een address match list bestaat uit een lijst met IP-adressen of
IP-ranges gescheiden door puntkomma's. Een voorbeeld van een address
match list is: 10/8; 172.16/12; 192.168/16;.
Een access control list (ACL) is een naam voor een address match list.
Overal waar je een address match list kunt gebruiken, kunt je ook de
naam van een ACL gebruiken. Hierdoor is named.conf korter,
leesbaarder en beter onderhoudbaar te maken.
Overigens kan een address match list ook weer de naam van een ACL bevatten.
Een ACL wordt gedefinieerd met: acl "naam" { address match list;
};". Een voorbeeld hiervan hebben we al gezien:
acl "local_net" {
localhost;
10/8;
172.16/12;
192.168/16;
};
Er zijn vier voorgedefinieerde ACLs:
De lege ACL
Alle mogelijke IP-adressen
Alle IP adressen van de machine waarop bind draait.
Alle subnetten waarop de machine waarop bind draait aangesloten is.
Er zijn situaties waarin access control niet meer genoeg is. Bijvoorbeeld wanneer er binnen één zone zowel publieke- als privé-adressen gebruikt worden. In dat geval kun je views gebruiken.
Een voorbeeld van views, gedefinieerd in named.conf:
view "intern" {
match-clients {
local_net;
};
recursion yes;
zone "example.com" {
type master;
file "db.example.com.internal";
};
};
view "extern" {
match-clients {
any;
};
recursion no;
zone "example.com" {
type master;
file "db.example.com.external";
};
};
match-clients selecteer je voor welke clients de view geldig is.
Bind selecteert altijd de eerste view die voldoet.
In het
eerste voorbeeld van named.conf wordt recursie beperkt door middel van
allow-recursion, hier zie je hoe dat ook met views kan.
Beide views zien het domein example.com, maar de data komt uit
verschillende zonefiles. Het kan soms handig zijn om een bestand
db.example.com.common te maken met daarin de RR's die gedeeld
worden tussen alle views. Met $INCLUDE db.example.com.common is
dit bestand weer in te voegen in de beide zonefiles.