// named.conf - RoCSIRT - 2012
//
// Fisier dezvoltat pe baza celui disponibil la Team Cymru
// - http://www.cymru.com/Documents/secure-bind-template.html
//
// Istoric:
//    v1.1 - 04 Oct 2012 - Valeriu Vraciu
//      *) IPv6 in ACL trusted
//      *) definire zona reverse IPv6 in view-uri
//      *) corecturi minore in text
//
//    v1.0 - 23 Sep 2012 - Manuel Subredu
//      *) versiunea initiala a fisierului

// In aceasta lista de acces (ACL) se vor trece toate adresele IP ale serverelor DNS
// catre care vor fi exporate zonele de DNS (NS-urile secundare, acolo unde exista).
// Implicit: nu se pot transfera zone de DNS spre alte servere
acl "xfer" {
    none;
};

// In aceasta lista de acces vor fi trecute clasele/prefixele de adrese IP (publice
// sau nu), folosite in cadrul institutiei. Acest ACL este foarte
// important deoarece numai adresele IP incluse aici vor putea
// efectua interogari recursive.
acl "trusted" {
    192.168.1.0/24;
    2001:db8:1::/48;
    localhost; 
};

// In aceasta sectiune se defineste modul in care vor fi stocate
// jurnalele serviciului DNS.
logging {
    channel default_syslog {
        // Majoritatea mesajelor se trimit in syslog
        syslog local2;
        severity debug; 
    };

    channel audit_log {
        // Mesajele de securitate se stocheaza intr-un fisier separat. 
        // IMPORTANT: Asigurati-va ca directorul in care va fi stocat
        //            acest fisier, exista, iar utilizatorul sub care
        //            ruleaza serviciul BIND are drepturi de scriere.
        file "/var/named/bind/named.log";
        severity debug;
        print-time yes; 
    };

    category default { default_syslog; };
    category general { default_syslog; };
    category security { audit_log; default_syslog; };
    category config { default_syslog; };
    category resolver { audit_log; };
    category xfer-in { audit_log; };
    category xfer-out { audit_log; };
    category notify { audit_log; };
    category client { audit_log; };
    category network { audit_log; };
    category update { audit_log; };
    category queries { audit_log; };
    category lame-servers { audit_log; }; 
};

// Optiuni de securitate
options {
    // Optiunile de mai jos au setari implicite din distributie.
    // Inainte de a utiliza optiunile ce modifica directoarele si
    // fisierele necesare serviciului, asigurati-va ca acestea sunt
    // in concordanta cu modul in care a fost compilat serviciul de 
    // DNS.
    // Decomentati mai jos doar dupa verificare !!!
    // directory "/var/named";
    // pid-file "/var/named/named.pid";
    // statistics-file "/var/named/named.stats";
    // memstatistics-file "/var/named/named.memstats";
    // dump-file "/var/adm/named.dump";
    // zone-statistics yes;

    // Prevenirea atacurilor de tip DoS ce genereaza cereri
    // false de transfer ale zonelor de DNS. Activarea acestei
    // optiuni va avea ca si consecinta o actualizare mai lenta
    // a serverelor secundare (slave) in cazul modificarii zonei master (ele
    // nemaifiind notificate imediat in cazul unor modificari ale inregistrarilor din fisierele
    // zonei sau zonelor de DNS).
    notify no;

    // Generarea mai eficienta a transferurilor de zone prin 
    // includerea mai multor inregistrari DNS intr-un mesaj.
    // Implicit, un mesaj DNS contine o singura inregistrare.
    transfer-format many-answers;

    // Timpul maxim de transfer a unei zone de DNS. In acest caz
    // specificam ca timpul maxim in care o zona trebuie sa fie
    // transferata este de 60 de minute. Daca o zona nu poate fi
    // transferata in 60 de minute atunci este putin probabil ca
    // transferul sa se mai termine. ATENTIE !!! Daca aveti zone
    // de DNS cu foarte multe inregistrari modificati
    // valoarea de mai jos astfel incat sa permita transferarea
    // acestora.
    max-transfer-time-in 60;

    // Daca nu aveti interfete dinamice (pppoe, ppp, etc), atunci
    // BIND-ul nu are nevoie sa urmareasca evenimentele asociate
    // schimbarii starii interfetelor {UP|DOWN}.
    interface-interval 0;

    // Cine are voie sa transfere zonele de DNS de pe server
    allow-transfer {
        // Doar acele adrese IP incluse in ACL-ul xfer (definit mai sus)
        xfer;
    };

    // Cine are voie sa interogheze serverul de DNS
    allow-query {
        // Acceptam cereri doar de la adresele IP incluse in ACL-ul
        // "trusted" (definit mai sus) si vom permite interogari pentru
        // zonele master mai jos. Astfel, evitam transformarea serviciului
        // DNS in unul de tip OpenResolver.
        trusted;
    };

    // Cui permitem sa interogheze cache-ul serverului de DNS
    allow-query-cache {
        // Doar acelor adrese IP incluse in ACL-ul trusted.
        trusted;
    };
};

// Pentru asigurarea unei securitati sporite a serviciului de DNS
// si pentru o separare clara a propriilor adrese IP de cele publice
// vom folosi in continuare facilitatea de views disponibila in BIND.
// BIND-ul permite raspunsuri diferite in functie de adresa IP de la care se face interogarea.

view "internal-in" in {
    // View-ul intern, de incredere. Acest view permite doar interogari
    // venite din reteaua interna. De asemenea, pe acest view vom activa
    // interogarile recursive si interogarile cache-ului.

    // Doar adresele IP incluse in ACL-ul trusted (definit mai sus),
    // vor putea folosi aceasta zona
    match-clients { trusted; };
    recursion yes;
    additional-from-auth yes;
    additional-from-cache yes;


    // Zona . trebuie inclusa in toate zonele.
    zone "." in {
        type hint;
        file "db.cache";
    };

    // In continuare se includ toate zonele pentru care serverul de DNS
    // este autoritativ (atat cele pentru care este master cat si cele
    // pentru care este slave).
    zone "example.edu.ro" in {
        type master;
        file "master/example.edu.ro.txt";
    };

    zone "1.168.192.in-addr.arpa" in {
        type master;
        file "master/rev.192.168.1.txt";
    }; 

    zone "1.0.0.0.0.3.b.0.1.0.0.2.ip6.arpa {
        type master;
        file "master/rev.2001.b30.1.txt";
    };
};

// View-ul pentru "ceilalti"
view "external-in" in {
    // Acest view este cel in care definim modul in care serverul de DNS
    // va trata cererile venite din afara retelei locale. Pentru acest
    // view, nu vom permite decat interogari ale zonelor pentru care
    // serverul de DNS este autoritativ (master sau slave). Cererile
    // recursive sau cererile de interogare a cache-ului nu vor fi permise

    match-clients { any; };
    recursion no;
    additional-from-auth no;
    additional-from-cache no;

    // Link in our zones
    zone "." in {
        type hint;
        file "db.cache";
    };


    // Mai departe se includ toate zonele pentru care dorim ca
    // serverul de DNS sa raspunda la oricine. Daca se doreste ca
    // o anumita zona definita in view-ul "internal-in" (definit
    // mai sus) sa nu fie disponibila catre "public", atunci prin
    // simpla sa excludere din zona curenta aceasta va fi accesibila
    // doar adreselor IP considerate interne (incluse in ACL-ul
    // "trusted").

    zone "example.edu.ro" in {
        type master;
        file "master/example.edu.ro.txt";

	// Pentru aceasta zona permitem interogarea de la orice sursa
        allow-query {
            any;
        };
    };

    zone "1.168.192.in-addr.arpa" in {
        type master;
        file "master/rev.192.168.1.txt";
	
	// Pentru aceasta zona permitem interogarea de la orice sursa
        allow-query {
            any;
        };
    }; 

    zone "1.0.0.0.0.3.b.0.1.0.0.2.ip6.arpa {
        type master;
        file "master/rev.2001.b30.1.txt";
        allow-query {
           any;
        };
    };
};

