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.
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 pulpit, swój serwer WWW, jak monitorować zmiany w plikach, jak 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:
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ą:
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.
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.
W kroku 4. w polu Username definiujemy użytkownika w bazie MySQL dla interfejsu webowego oraz nadajemy hasło.
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';
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:
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!
Komentarze
Artykuł nie porusza ważnych kwestii takich jak dnssec, czy replikacji. Już lepiej jest postawić FreeIPA. No i jeszcze ten interfejs wystawiony na świat.
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.
dziękuję za ten artykuł-zastanawiałem się nad utworzeniem własnego serwera dns i nie wiedziałem co wybrać. mam alergię na binda
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.
takie pytanie:
1. po co mi to?
2.do czego mógłbym mi się przydać takie postawienie serweru dns?
łł
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.
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ę?
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?
Miłego odpierania DDOSa :P
Regulamin Aruby chyba nie zezwala na publicznie dostępny serwer DNS. Poprawcie mnie jeśli się mylę
Mylisz się :)
Gdzie nasz serwer DNS odpytuje zapytania o domeny których nie posiada w swojej bazie? Konfigurację się zewnętrzny DNS?
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.
A jak postawić i skonfigurować proxyDNS? Taki np jak używam (i płacę za niego) w UK żeby oglądać polskie VOD?
Done :)
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…
Nigdy nie miałem problemów z połączeniem funkcji resolvera i autorytatywnego serwera stref w bindzie. Od czego masz ACL?
ja się nigdy nie odważyłem na odpalenie publicznego dns’a. Nie przekonaliście mnie żebym spróbował ;P
ale to nie jest publiczny dns który jest resolverem.
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?
Do tego służy powerdns recursor:
https://www.powerdns.com/recursor.html
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
Masz już uruchomiony jakiś serwer DNS. Sprawdź jaki:
netstat -tulnp |grep 53
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ć ?
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).