Verder Terug Inhoud

11. Beveiliging

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.

11.1 Access control

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:

allow-transfer

Beperkt zonetransfers. Standaard zijn zonetransfers toegestaan voor iedereen, maar dat is zeer zelden gewenst. In de voorbeeld named.conf is dit dan ook beperkt.

allow-query

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.

allow-recursion

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.

allow-update

Zie het hoofdstuk over DHCP: allow-update staat dynamische updates toe.

Elk van deze blokken kan een address match list bevatten of de naam van een access control list. Sommigen kunnen ook een key bevatten, voor TSIG-ondertekende aanvragen. Dit is met name nuttig bij zonetransfers en dynamic updates.

Address match lists

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;.

Access control lists

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:

none

De lege ACL

any

Alle mogelijke IP-adressen

localhost

Alle IP adressen van de machine waarop bind draait.

localnets

Alle subnetten waarop de machine waarop bind draait aangesloten is.

De laatste twee ACLs worden automatisch samengesteld aan de hand van de adressen van de netwerkinterfaces van de server op het moment van opstarten.

11.2 Views

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";
        };
};

De naam van een view is puur informatief: bind doet er niets mee. Met 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.


Verder Terug Inhoud