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 Alf/red/

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