Bind

Konfiguracja BIND

 

 

Testowanie serwera DNS

Do testowania serwera DNS można wykorzystać:

nslookup

dig

oraz strony internetowe analizujące konfigurację wskazanych domen np.: infoDNS.

Konfiguracja DLZ – wykorzystania bazy danych w BIND

Aby dynamicznie ładować konfigurację plików DNS należy przebudować aplikację. Następnie należy utworzyć bazę danych oraz tabelę zawierającą odpowiednie kolumny. Skrypt konfiguracyjny dla PostgreSQLa:

CREATE TABLE records (
 zone varchar(255) NOT NULL,
 ttl int NOT NULL default '86400',
 type varchar(255) NOT NULL,
 host varchar(255) NOT NULL default '@',
 mx_priority int default NULL,
 data text,
 primary_ns varchar(255) default NULL,
 resp_contact varchar(255) default NULL,
 serial bigint default NULL,
 refresh int default NULL,
 retry int default NULL,
 expire int default NULL,
 minimum int default NULL,
 );
 CREATE INDEX host_index ON records using btree (host);
 CREATE INDEX type_index    ON records using btree (type);
 CREATE INDEX zone_index ON records using btree (zone);
INSERT INTO records (zone, ttl, type, host, mx_priority, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum) VALUES ('sample.com', 86400, 'SOA', '@', NULL, NULL, 'ns1.ns.com.', 'hostmaster.ns.com.', 2007080601, 10800, 7200, 604800, 86400);
INSERT INTO records (zone, ttl, type, host, mx_priority, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum) VALUES ('sample.com', 86400, 'NS', '@', NULL, 'ns1.ns.com.', NULL, NULL, NULL, NULL, NULL, NULL, NULL);INSERT INTO records (zone, ttl, type, host, mx_priority, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum) VALUES ('sample.com', 86400, 'NS', '@', NULL, 'ns2.ns.com.', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO records (zone, ttl, type, host, mx_priority, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum) VALUES ('sample.com', 86400, 'MX', '@', 10, 'mail.mail.com.', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO records (zone, ttl, type, host, mx_priority, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum) VALUES ('sample.com', 86400, 'A', '@', NULL, '123.12.12.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL);INSERT INTO records (zone, ttl, type, host, mx_priority, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum) VALUES ('sample.com', 86400, 'A', 'www', NULL, '123.12.12.1', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
CREATE TABLE xfr (
 zone varchar(255) NOT NULL,
 client varchar(255) NOT NULL,
 );
 CREATE INDEX zone_client_index ON xfr_table_1 using btree (zone, client);

a po stronie BINDa należy w named.conf dodać następujący wpis:

dlz "postgres zone" {
 database "postgres 2
 {host=localhost dbname=named user=named}
 {SELECT zone FROM records WHERE zone = '$zone$'}
 {SELECT ttl, type, mx_priority, case when lower(type)='txt' then '\"' || data
 || '\"' else data end AS data
 FROM records
 WHERE zone = '$zone$' AND host = '$record$' AND type <> 'SOA' AND type <> 'NS'}
 {SELECT ttl, type, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum
 FROM records
 WHERE zone = '$zone$' AND (type = 'SOA' OR type='NS')}
 {SELECT ttl, type, host, mx_priority, case when lower(type)='txt' then '\"' || data
 || '\"' else data end AS data, resp_contact, serial, refresh, retry, expire, minimum
 FROM records
 WHERE zone = '$zone$' AND type <> 'SOA' AND type <> 'NS'}
 {SELECT zone FROM xfr where zone='$zone$' AND client = '$client$'}";
 };

Sposób przygotowania BINDa wykorzystując MySQLa opisany został na stronie.

Zabezpieczenie przed wykorzystaniem naszego serwera do ataków (np.: DDoS)

Aby zabezpieczyć się przed pozostaniem serwerem wykorzystywanym do ataku typu DDoS, należy odpowiednio skonfigurować serwer BIND. Najważniejsze jest to aby nie umożliwiać dowolnej liczby zapytań typu recursive. Zezwolenie na zapytania typu recursive oznacza że usługa może być wykorzystywany przez inne komputery do tłumaczenia nazw.

Brak ograniczenia liczby zapytań w czasie oraz listy komputerów do listy zaufanych urządzeń może spowodować że nasza usługa zostanie wykorzystana do ataku DDoS na inne serwery DNS.

Aby temu zapobiec należy odpowiednio skonfigurować nasz serwer:
Gdy nie ma potrzeby aby inne komputery korzystały z naszego DNSa to do konfiguracji należy wstawić:

options {
  allow-query-cache { none; };
  recursion no;
  rate-limit {
    responses-per-second 5;
    window 5;
  };
}

Jeżeli natomiast nasz serwer ma świadczyć usługi pośredniczenia w tłumaczeniu nazw to musimy określić zaufane adresy IP, dla których będziemy świadczyć usługi poprzez Access Control List (ACL):

acl ListaZaufanych { 192.168.1.0/24; 192.168.2.0/24; };
options{
  allow-query { any; };
  allow-recursion { ListaZaufanych; };
}

* Szczegółowy opis ataku i sposobów zabezpieczenia znajduje się na stronie.