19.12.2017 | 09:41

krystian

Własny serwer DNS – to nie takie straszne ani trudne jak się wydaje

Myśleliście o tym, by usługę DNS utrzymywać także samodzielnie, we własnej infrastrukturze? Gdybyście chcieli zainstalować i skonfigurować własny serwer DNS — oto krótki poradnik jak sobie poradzić z tym zagadnieniem.

Pamiętacie artykuł w którym wspominaliśmy o ataku MiTM gdzie atakujący uzyskał dostęp do wpisów DNS głównej domeny Fox-IT.com, utrzymywanych przez firmę trzecią? Ta historia mogła potoczyć się inaczej, gdyby Fox-IT podjął inne decyzje na temat tego, jaką część infrastruktury odda w ręce firm trzecich.

Artykuł pod patronatem Aruba Cloud

We współpracy z firmą ArubaCloud pokazaliśmy Wam, jak postawić swój serwer backupów, jak skonfigurować własny serwer VPN i podłączyć do niego komputer, telefony komórkowe oraz domowy ruter a także jak schować się przed cenzurą sieci i jak zacząć serwer zabezpieczać, jak postawić swój własny zdalny pulpitswój serwer WWWjak monitorować zmiany w plikachjak zablokować reklamy na komórce, jak skonfigurować bezpieczną kopię zapasowąjak zabezpieczyć logowanie do serwera za pomocą jednorazowych tokenów  lub za pomocą klucza Yubikey a także jak monitorować swoje systemy w dwóch odsłonach oraz jak postawić swój serwer Jabbera, jak synchronizować pliki a także jak logować zdarzenia systemowe.

Jeśli nie macie jeszcze swojego własnego serwera, to jest to dobra okazja by się w taki wyposażyć. Aruba oferuje dwa miesiące korzystania ze swojego podstawowego serwera gratis – a po zakończeniu promocji będzie on Was kosztował zaledwie 4 złote miesięcznie. Co więcej Aruba ma już serwerownię w Warszawie. Instrukcję jak krok po kroku skorzystać z promocji i uruchomić swój serwer znajdziecie w tym artykule. Jeśli macie już swój serwer – to zapraszamy do lektury kolejnych akapitów.

W artykule przedstawimy jak zainstalować usługę PowerDNS. Pliki stref będą przechowywane w bazie danych SQL. Zarządzanie plikami stref z poziomu interfejsu webowego umili nam (lub nie) PowerAdmin napisany w języku PHP. Aby wszystko zaczęło poprawnie działać będziemy potrzebowali serwera WWW (w tym przypadku Apache2, choć nie ma przeciwwskazań aby zainstalować i skonfigurować nginx’a), bazę danych MariaDB oraz przykładową domenę. Poniżej znajdziecie film z zapisanym przebiegiem całej konfiguracji, a pod nim także opis tekstowy.

pakiet bind

Na podstawie informacji CVE dla pakietu bind zgłoszono następującą liczbę błędów:

CVE dla BIND

Sytuacja z PowerDNS’em wygląda nastepująco:

Wniosek? Eksperci od bezpieczeństwa nie byli aż tak zainteresowani kodem źródłowym powerdns jak w przypadku bind’a ;-)

Instalujemy, konfigurujemy…

Zaczynamy od instalacji serwera SQL – MariaDB:

yum install mariadb-server mariadb

Zezwalamy na uruchomienie usługi MariaDB podczas startu systemu:

systemctl enable mariadb.service

Uruchamiamy usługę MariaDB:

systemctl start mariadb.service

Wykonujemy obowiązkową konfigurację usługi MariaDB:

mysql_secure_installation
# Zwracamy uwagę na:
 Set root password? [Y/n] Y
 Remove anonymous users? [Y/n] Y
 Disallow root login remotely? [Y/n] Y
 Remove test database and access to it? [Y/n] Y
 Reload privilege tables now? [Y/n] Y

Instalujemy usługę PowerDNS wraz z obsługą bazy danych MySQL:

yum install pdns-backend-mysql pdns

Zezwalamy na uruchomienie usługi PowerDNS podczas startu systemu:

systemctl enable pdns.service

Tworzymy użytkownika o loginie 'pdns’ wraz z bazą o nazwie 'pdnsdb’. Utworzonemu użytkownikowi nadajemy wszystkie możliwe uprawnienia dla utworzonej bazy.

mysql -uroot -p

> CREATE DATABASE pdnsdb;
> CREATE USER 'pdns'@'localhost' IDENTIFIED BY '<hasło sql dla użytkownika pdns>';
> GRANT ALL on pdnsdb.* TO 'pdns' IDENTIFIED BY '<hasło sql dla użytkownika pdns>';
> FLUSH PRIVILEGES;

Po utworzeniu dedykowanej bazy oraz utworzeniu nowego użytkownika, importujemy schemat bazy:

mysql -updns -p -hlocalhost pdnsdb < /usr/share/doc/pdns-backend-mysql-3.4.11/schema.mysql.sql

Konfiguracja PowerDNS:

Edytujemy plik /etc/pdns.pdns.conf:

emacs /etc/pdns/pdns.conf

Po zapoznaniu się z zawartością pliku, na jego końcu dopisujemy:

launch=gmysql
gmysql-host=localhost
gmysql-user=pdns #nazwa użytkownika w bazie danych
gmysql-password=<hasło sql dla użytkownika pdns>
gmysql-dbname=pdnsdb #nazwa bazy danych

PowerDNS będzie przechowywał ustawienia domen w bazie danych SQL. Baza ta nie jest jedyną bazą, która jest obsługiwana przez PowerDNS. W repozytorium CentOS znajdują się następujące pakiety:

yum search pdns
===== N/S matched: pdns =====
 pdns-backend-geo.x86_64 : Geo backend for pdns
 pdns-backend-geoip.x86_64 : GeoIP backend for pdns
 pdns-backend-ldap.x86_64 : LDAP backend for pdns
 pdns-backend-lmdb.x86_64 : LMDB backend for pdns
 pdns-backend-lua.x86_64 : LUA backend for pdns
 pdns-backend-mydns.x86_64 : MyDNS backend for pdns
 pdns-backend-mysql.x86_64 : MySQL backend for pdns
 pdns-backend-opendbx.x86_64 : OpenDBX backend for pdns
 pdns-backend-pipe.x86_64 : Pipe backend for pdns
 pdns-backend-postgresql.x86_64 : PostgreSQL backend for pdns
 pdns-backend-remote.x86_64 : Remote backend for pdns
 pdns-backend-sqlite.x86_64 : SQLite backend for pdns
 pdns-backend-tinydns.x86_64 : TinyDNS backend for pdns

Po wprowadzeniu zmian restartujemy usługę PowerDNS:

systemctl restart pdns.service

Sprawdzamy czy usługa nasłuchuje na porcie 53/udp oraz 53/tcp:

netstat -tulnp |egrep pdns

tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 2984/pdns_server
udp 0 0 0.0.0.0:53 0.0.0.0:* 2984/pdns_server

Jeśli macie włączonego firewalla na serwerze, pamiętajcie o zezwoleniu ruchu na te porty.

Instalacja Apache2

Zainstalujemy wymagane moduły przez PowerAdmina. Dodatkowo zainstalujemy mod_ssl aby utworzyć odpowiedni certyfikat SSL/TLS.

# Instalacja modułu mod_ssl
yum install httpd mod_ssl
# Instalacja interpretera skryptów php
yum install php php-mysql mcrypt 
# Zezwalamy na uruchomienie usługi httpd podczas startu systemu
systemctl enable httpd

Zielona kłódka

Jak wdrożyć automatycznie odnawiane, darmowe certyfikaty SSL od Let’s Encrypt

Instalujemy pakiet certbot:

yum install python2-certbot-apache

Tworzymy plik /etc/httpd/conf.d/ssl_arubatest.conf:

nano /etc/httpd/conf.d/ssl_arubatest.conf

<VirtualHost *:80>
 ServerName arubatest.pl
 ServerAlias www.arubatest.pl
 DocumentRoot /var/www/html
 ErrorLog /var/log/httpd/arubatest.pl/error.log
</VirtualHost>

Tworzymy katalog /var/log/httpd/arubatest.pl/ oraz uruchamiamy usługę httpd

mkdir /var/log/httpd/arubatest.pl/
systemctl restart httpd

Generujemy certyfikat SSL/TLS dla usługi Apache2:

certbot -d arubatest.pl -d www.arubatest.pl --apache

Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for arubatest.pl
tls-sni-01 challenge for www.arubatest.pl
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/httpd/conf.d/ssl_www-le-ssl.conf
Deploying Certificate for arubatest.pl to VirtualHost /etc/httpd/conf.d/ssl_www-le-ssl.conf
Deploying Certificate for www.arubatest.pl to VirtualHost /etc/httpd/conf.d/ssl_www-le-ssl.conf

Po pozyskaniu certyfikatu z Let’s Encrypt ponownie restartujemy usługę httpd w celu zastosowania zmian:

systemctl restart httpd

Jeśli chcecie zwiększyć bezpieczeństwo swojego serwera WWW opartego na oprogramowaniu Apache2, zapraszamy do poniższego artykułu gdzie zajmowaliśmy się tą tematyką:

Jak uruchomić swój własny serwer WWW w Aruba Cloud

PowerAdmin

PowerAdmin to jedno z narzędzi, które ułatwi administratorom zarządzanie poszczególnymi strefami w DNS. Narzędzie napisane jest w języku PHP więc będziemy potrzebowali interpretera skryptów PHP.

# Przechodzimy do katalogu /var/www/html
cd /var/www/html/
# Pobieramy najnowszą wersję narzędzia PowerAdmin
wget https://github.com/poweradmin/poweradmin/archive/master.zip
mv poweradmin-master poweradmin

Po pobraniu i rozpakowaniu pliku, odwiedzamy katalog /poweradmin/install na serwerze.

PowerAdmin – krok 1/7

PowerAdmin – krok 2/7

PowerAdmin – krok 3/7

W polu Username podajemy nazwę użytkownika do bazy danych MySQL wraz z hasłem w polu Password. W polu Database podajemy nazwę bazy danych utworzonej w bazie MySQL. W ostatnim polu jakim jest Poweradmin administrator password definiujemy hasło dla użytkownika admin. Tym hasłem będziemy się posługiwać przy logowaniu się do PowerAdmina.

PowerAdmin – krok 4/7

W kroku 4. w polu Username definiujemy użytkownika w bazie MySQL dla interfejsu webowego oraz nadajemy hasło.

PowerAdmin – krok 5/7

PowerAdmin – krok 6/7

Instalator nie mógł wprowadzić zmian w pliku /var/www/html/poweradmin/inc/config.inc.php więc tworzymy plik wraz z zawartością na stronie:

nano /var/www/html/poweradmin/inc/config.inc.php

<?php
$db_host = 'localhost';
$db_name = 'pdnsdb';
$db_user = 'admin-arubatest';
$db_pass = '...';
$db_type = 'mysql';

$session_key = 'jgygtg@hJ9E2Pp!-f#5TktMoU_w1x^etwTKtGCap!mbG(z';

$iface_lang = 'en_EN';

$dns_hostmaster = '';
$dns_ns1 = 'ns1.arubatest.pl';
$dns_ns2 = 'ns2.arubatest.pl';

PowerAdmin – krok 7/7

Po zakończeniu kreatora usuwamy katalog /var/www/html/poweradmin/install.

rm -rf /var/www/html/poweradmin/install

Opcja1: Ograniczamy dostęp do katalogu /poweradmin dla naszego adres IP z którego chcemy mieć dostęp:

nano /etc/httpd/conf.d/ssl_arubatest-le-ssl.conf

<Directory /var/www/html/poweradmin>
AllowOverride All
Order deny,allow
Deny from all
Allow from ADRES.IP
</Directory>

Opcja 2: Tworzymy plik /var/www/html/poweradmin/.htaccess w którym ograniczamy dostęp do zasobu /poweradmin za pomocą kolejnego loginu i hasła:

cat <<EOF > /var/www/html/poweradmin/.htaccess
AuthType Basic
AuthName "Password Protected Area"
AuthUserFile /etc/httpd/passwd
Require valid-user
EOF

Nadajemy odpowiednie uprawnienia dla pliku /etc/httpd/passwd w którym będziemy przetrzymywać hasła:

chown apache:apache /etc/httpd/passwd
chmod 600 /etc/httpd/passwd

Generujemy użytkownika i hasło:

htpasswd -c /etc/httpd/passwd krystian

Opcja 3: Jeśli czujecie się na siłach, nie musicie korzystać z PowerAdmina.

Tworzymy strefę dla naszej domeny – na cele artykułu będzie to domena arubatest.pl:

Konfiguracja strefy dla domeny arubatest.pl

Pentest serwera DNS:

Do przeprowadzenia audytu bezpieczeństwa posłużymy się narzędziem DNSRecon.

[*] Performing General Enumeration of Domain: arubatest.pl
[*] Checking for Zone Transfer for arubatest.pl name servers
[*] Resolving SOA Record
[-] Error while resolving SOA record.
[*] Resolving NS Records
[*] NS Servers found:
[*]     NS ns1.safedns.pl 80.211.245.13
[*]     NS ns2.safedns.pl 80.211.245.13
[*] Removing any duplicate NS server IP Addresses...
[*]
[*] Trying NS server 80.211.245.13
[+] 80.211.245.13 Has port 53 TCP Open
[-] Zone Transfer Failed!
[-] No answer or RRset not for qname
[*] Checking for Zone Transfer for arubatest.pl name servers
[*] Resolving SOA Record
[-] Error while resolving SOA record.
[*] Resolving NS Records
[*] NS Servers found:
[*]     NS ns1.safedns.pl 80.211.245.13
[*]     NS ns2.safedns.pl 80.211.245.13
[*] Removing any duplicate NS server IP Addresses...
[*]
[*] Trying NS server 80.211.245.13
[+] 80.211.245.13 Has port 53 TCP Open
[-] Zone Transfer Failed!
[-] No answer or RRset not for qname
[-] DNSSEC is not configured for arubatest.pl
[-] Error while resolving SOA record.
[*]      NS ns1.safedns.pl 80.211.245.13
[*]      Bind Version for 80.211.245.13 PowerDNS Authoritative Server 3.4.11 ([email protected] built 20170116223245 [email protected])
[*]      NS ns2.safedns.pl 80.211.245.13
[*]      Bind Version for 80.211.245.13 PowerDNS Authoritative Server 3.4.11 ([email protected] built 20170116223245 [email protected])
[-] Could not Resolve MX Records for arubatest.pl
[*]      A arubatest.pl 80.211.245.13
[*] Enumerating SRV Records
[-] No SRV Records Found for arubatest.pl
[+] 0 Records Found

Szybki test wykazał, że serwer DNS przedstawia się pełną wersją oprogramowania. Jak ukryć lub zmienić ten komunikat?

Zgodnie z instrukcją:

nano /etc/pdns/pdns.conf
#Na końcu pliku dodajemy:
version-string=":-)"

To wszystko! Skoro zapoznaliście się z naszą konfiguracją i hasłami – zachęcamy do testów – arubatest.pl ;-). Dla najefektywniejszego psotnika — nagroda!

Powrót

Komentarze

  • 2017.12.19 10:18 q

    Artykuł nie porusza ważnych kwestii takich jak dnssec, czy replikacji. Już lepiej jest postawić FreeIPA. No i jeszcze ten interfejs wystawiony na świat.

    Odpowiedz
  • 2017.12.19 10:28 hmk

    Fajny artykuł – jedno ale: to, że eksperci nie byli zainsteresowani PowerDNS’em nie znaczy, że jest bezpieczniejszy. To, że w BINdzie znaleziono więcej podatności jest raczej na korzyść BINDa, bo zostaną załatane a jak PowerDNS stanie się bardziej popularny to kto wie co ludzie znajdą – bo dziury są wszędzie.

    Odpowiedz
  • 2017.12.19 10:32 uiop

    dziękuję za ten artykuł-zastanawiałem się nad utworzeniem własnego serwera dns i nie wiedziałem co wybrać. mam alergię na binda

    Odpowiedz
  • 2017.12.19 10:34 Alf/red/

    Jeżeli porównujemy błędy ilościowo, to do Powerdns trzeba dodać 73 błędy MariaDB i wychodzimy na dokładnie tyle samo, a być może także dodać błędy Apacza i PHP.

    Odpowiedz
  • 2017.12.19 10:36 www

    takie pytanie:
    1. po co mi to?
    2.do czego mógłbym mi się przydać takie postawienie serweru dns?

    łł

    Odpowiedz
    • 2017.12.19 16:18 markac

      Mam serwer DNS i też się nad tym zastanawiam…
      Można wymienić chyba łatwość tworzenia kopii zapasowej serwera wraz z usługami.
      Mam wszystko w jedynym, czyli www, poczta, dns itp. i szybko można to przywrócić.
      Teoretycznie, bo nie musiałem próbować :-)
      Ja osobiście polecam pakiet VestaCP.

      Odpowiedz
  • 2017.12.19 14:08 MatM

    Apache??? Stawianie tego serwera tylko na potrzeby panelu administracyjnego to jakieś nieporozumienie. Nie chcę zbytnio wdawać się w dyskusję o wyższości jednego oprogramowania nad innym ale porównajcie to do rozwiązań (paneli administracyjnych) opartych o Node.js, Pythona czy Ruby. Już chyba lepiej użyć Nginx niż Apache. Po co wam cała piekarnia skoro chcecie zjeść tylko jedną bułkę?

    Odpowiedz
    • 2018.01.03 18:40 adrb

      aha.. a jak wypada porównanie nginx do paneli administracyjnych opartych o Node.js, Pythona czy Ruby? Kiedy według Ciebie
      instalowanie apache jest uzasadnione?

      Odpowiedz
  • 2017.12.19 15:47 Ja

    Miłego odpierania DDOSa :P

    Odpowiedz
  • 2017.12.19 16:18 majk3l

    Regulamin Aruby chyba nie zezwala na publicznie dostępny serwer DNS. Poprawcie mnie jeśli się mylę

    Odpowiedz
    • 2017.12.19 23:34 rafal

      Mylisz się :)

      Odpowiedz
  • 2017.12.19 20:48 Jan

    Gdzie nasz serwer DNS odpytuje zapytania o domeny których nie posiada w swojej bazie? Konfigurację się zewnętrzny DNS?

    Odpowiedz
    • 2017.12.20 20:52 /dev/

      nigdzie.

      $ host wp.pl arubatest.pl
      Using domain server:
      Name: arubatest.pl
      Address: 80.211.245.13#53
      Aliases:

      Host wp.pl not found: 5(REFUSED)

      to nie jest openresolver.

      Odpowiedz
  • 2017.12.19 21:50 Karol

    A jak postawić i skonfigurować proxyDNS? Taki np jak używam (i płacę za niego) w UK żeby oglądać polskie VOD?

    Odpowiedz
  • 2017.12.19 23:48 agresor

    Done :)

    Odpowiedz
  • 2017.12.20 07:20 Krzysztof

    AFAIR (bo kiedyś uzywałem) PowerDNS ma ten sam grzech, co bind: jest jednocześnie autorytatywnym DNSem i rekursywnym (resolver). Tak więc może faktycznie cierpieć na te same problemy co bind.

    Dla takich dinozaurów jak ja, którzy jednak wolą konsolę i konfigurację w plikach tekstowych, to polecam przyjrzeć się duetowi: unbound + nsd. Naprawdę działa bardzo dobrze. Jeden pełni tylko rolę rekursywnego (resolvera), drugi jest tylko dawcą stref. Do unbound-a można podczepiać skrypty pythoonowe, zatem możliwości (np. dns-bh, „filtrowania treści”) są spore…

    Odpowiedz
    • 2017.12.20 19:34 Adam

      Nigdy nie miałem problemów z połączeniem funkcji resolvera i autorytatywnego serwera stref w bindzie. Od czego masz ACL?

      Odpowiedz
  • 2017.12.20 18:30 null

    ja się nigdy nie odważyłem na odpalenie publicznego dns’a. Nie przekonaliście mnie żebym spróbował ;P

    Odpowiedz
    • 2017.12.20 20:51 /dev/

      ale to nie jest publiczny dns który jest resolverem.

      Odpowiedz
  • 2017.12.21 16:52 Deka-DENT

    Wszystko pięknie jak potrzebny jest primary. A jakby chcieć postawić swój własny recursive w chmurze to jak zabezpieczyć dostęp (z losowych ip) żeby nie był używany do ddosów?

    Odpowiedz
  • 2020.03.08 22:55 Tomasz

    Witam mam problem robiłem według poradnika i nie może mi ruszyć pdns.
    logi :
    Mar 8 22:50:28 server043195 pdns_server: Reading random entropy from '/dev/urandom’
    Mar 8 22:50:28 server043195 pdns_server: Loading '/usr/lib64/pdns/libgmysqlbackend.so’
    Mar 8 22:50:28 server043195 pdns_server: This is a standalone pdns
    Mar 8 22:50:28 server043195 pdns_server: Listening on controlsocket in '/var/run/pdns.controlsocket’
    Mar 8 22:50:28 server043195 pdns_server: Unable to bind UDP socket to '0.0.0.0:53′: Address already in use
    Mar 8 22:50:28 server043195 pdns_server: Fatal error: Unable to bind to UDP socket
    Mar 8 22:50:28 server043195 systemd: pdns.service: main process exited, code=exited, status=1/FAILURE
    Mar 8 22:50:28 server043195 systemd: Unit pdns.service entered failed state.
    Mar 8 22:50:28 server043195 systemd: pdns.service failed.
    Mar 8 22:50:29 server043195 systemd: pdns.service holdoff time over, scheduling restart.
    Mar 8 22:50:29 server043195 pdns_server: Reading random entropy from '/dev/urandom’
    Mar 8 22:50:29 server043195 pdns_server: Loading '/usr/lib64/pdns/libgmysqlbackend.so’
    Mar 8 22:50:29 server043195 pdns_server: This is a standalone pdns
    Mar 8 22:50:29 server043195 pdns_server: Listening on controlsocket in '/var/run/pdns.controlsocket’
    Mar 8 22:50:29 server043195 pdns_server: Unable to bind UDP socket to '0.0.0.0:53′: Address already in use
    Mar 8 22:50:29 server043195 pdns_server: Fatal error: Unable to bind to UDP socket
    Mar 8 22:50:29 server043195 systemd: pdns.service: main process exited, code=exited, status=1/FAILURE
    Mar 8 22:50:29 server043195 systemd: Unit pdns.service entered failed state.
    Mar 8 22:50:29 server043195 systemd: pdns.service failed.

    Prosze o pomoc

    Odpowiedz
    • 2020.03.09 00:06 Krystian

      Masz już uruchomiony jakiś serwer DNS. Sprawdź jaki:
      netstat -tulnp |grep 53

      Odpowiedz
      • 2020.03.09 18:26 Tomasz

        Kolego Krystian miałeś racje, odinstalowałem inny program zajmujący port 53.Dzięki bardzo
        Spotkałem się jeszcze z takimi komendami, co one powodują ?
        sudo sed -i ‘s/# recursor=/recursor=8.8.8.8/g’ /etc/powerdns/pdns.conf
        sudo sed -i ‘s/allow-recursion=127.0.0.1/allow-recursion=127.0.0.1,192.168.0.0\/24/g’ /etc/powerdns/pdns.conf
        Warto je dodawać ?

        Odpowiedz
        • 2020.03.10 09:13 Krystian

          W wielkim uproszczeniu: w artykule skonfigurowana jest domena arubatest.pl. Serwer dns obsługuje tylko tą domenę. Polecenia które wkleiłeś powodują, że jeśli serwer otrzyma zapytanie o inną domenę, odpyta serwer 8.8.8.8 (google dns).

          Odpowiedz

Zostaw odpowiedź do markac

Jeśli chcesz zwrócić uwagę na literówkę lub inny błąd techniczny, zapraszamy do formularza kontaktowego. Reagujemy równie szybko.

Własny serwer DNS – to nie takie straszne ani trudne jak się wydaje

Komentarze