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

dodał 19 grudnia 2017 o 09:41 w kategorii Top  z tagami:
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 = '[email protected]!-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!