PowerDNS Authoritative Server nimeserveri kasutamine
Sissejuhatus
PowerDNS https://www.powerdns.com/ on üks populaarsetest vaba tarkvaralistest nn alternatiivsetest DNS serveritest, kuigi 'alternatiivse' kohta väidetavalt teda kasutatakse väga massiliselt DNSSEC jaoks. PowerDNS tarkvara võimaldab pidada täielist DNS infrastruktuuri, sh slave ja master pädevate nimeserverite erinevad konfiguratsioonid. PowerDNS tarkvara komplekti kuuluvad
- PowerDNS Authoritative Server - pädev nimeserver
- PowerDNS Recursor - rekursiivne nimeserver
- dnsdist - koormusjaotur
PowerDNS Authoritative Server tarkvaral on sellised tunnused
- võimalus kasutada andmete salvestamiseks erinevaid nn backend'isid (nn plain text, sql andmebaas, ldap kataloog jne)
- väga mugavalt korraldada DNSSEC tsooni pidamist
- tsoonide käsitlemine (tekitamine, sisu muutmine, eemaldamine) on võimalik üle nn API
- eksisteerivad mitmesugused veebipõhised tsoonide haldusliidesed (otse baasi ja üle API)
- ebamugav on kontrollida, kust tsooni kopeeritakse, kuhu notify saadetakse ja kust lubatakse tsooni kopeerida
Haldusliidesed jagunevad kaheks
- kirjutavad otse samasse sql baasi, mida kasutab PowerDNS ja tegelikult töötavadki ainult SQL backendide puhul - nt Poweradmin, http://www.poweradmin.org/
- suhtlevad PowerDNS'iga üle API, töötavad kõigi backendide puhul - nt nsedit, https://github.com/tuxis-ie/nsedit
Järgnevas tekstis öeldakse lühiduse mõttes PowerDNS ja mõeldakse PowerDNS Authoritative Server ehk pädevat komponenti.
Tööpõhimõte
PowerDNS tarkvara saab kasutada erinevates konfiguratsioonides
- nö suure pildi mõttes, nt PowerDNS on varjatud master ja avalikus võrgus teenindavad NSD nimeserverid (alternatiiv oleks pidada PowerDNS nimeserverit otse avalikus võrgus)
- PowerDNS enda komponentidest on välja valitud mingi komplekt, nt baas osa ja PostgreSQL backend (alternatiiv oleks BIND formaadis tekstifailid failisüsteemis)
- tsooniandmete haldamiseks kasutatakse käsurea utiliiti pdnsutil ja nsedit php rakendust
Käesolevas tekstis keskendutakse just mainitud konfiguratsioonile. Kui PowerDNS kasutab SQL backendi, siis avaliku pädeva DNS teenuse pakkumise juures tekitab see vähemalt esmapilgul kahtlusi. Võib olla on hea mõte tekitada varjatud masteriga lahendus
ans1 (NSD) ans2 (NSD) _____ _____ | | | | | | | | |_____| port 8952 |_____| port 8952 | | | | ----|---------------------|----------------------|---- | __|__ | | nimetaja (PowerDNS) | | |_____|
kus
- ans1, ans2 - avalikud pädevad nimeserverid, tehniliselt slave'id
- nimetaja - varjatud pädev nimeserver, tehniliselt master
- üle port 8952 saab nsd protsessi eemalt juhtida (alternatiiv on juhtida nö tavalisel viisil, lokaalselt)
Käesolevas tekstis pööratakse NSD tarkvara kasutamisele tähelepanu minimaalselt. NSD tekst asub aadressil Pädeva nimeserveri NSD v. 4 kasutamine operatsioonisüsteemiga Debian.
Tarkvara paigaldamine ja seadistamine
Tarkvara paigaldamiseks on üldiselt kaks võimalust
- operatsioonisüsteemi paketihaldus
- PowerDNS repositoorium - https://repo.powerdns.com/
PowerDNS tarkvara on jaotatud komponentideks
- üldosa
- tsoonidega seotud andmete salvesamiseks erinevad backendid (failisüsteem, SQL andembaas jne)
Kui asutakse kasutama SQL backendi, siis võib olla otstarbekas enne PowerDNS vastava backendi paigaldamist baas ise paigaldada ja käivitada; nt nt see baas ei pruugi olla tingimata samas arvutis. Teisipidi, mugavam on samas arvutis, kuna sel juhul baasi saab lähtestada dbconfig süsteemi abil; lisaks, kui kasutatakse DNSSEC'i, siis arvestada, et krüptomaterjal asub baasis. Käesolevas tekstis paigaldatakse tarkvara PowerDNS repositooriumist kuna seal on alati kõige värskem.
PostgreSQL andmebaasi ettevalmistamine
PowerDNS tarkvara ei ole PostgreSQL andmebaasi versiooni suhtes nõudlik, tõenäoliselt sobib igasugune v. 9.x ja nt en_US.UTF-8 kodeering
# apt-get install postgresql
Paigaldamine PowerDNS repositooriumist
PowerDNS repositoorium asub aadressil https://repo.powerdns.com/ ja kasutamine (Debian v. 9 Stretch juhtumil)
# cat /etc/apt/sources.list.d/pdns.list deb http://repo.powerdns.com/debian stretch-auth-master main
ning öelda
# curl https://repo.powerdns.com/CBC8B383-pub.asc | sudo apt-key add - # apt-get update
Tarkvara paigaldamiseks öelda (paistab, et bind backend paigaldatakse lisaks paratamatult)
# apt-get install pdns-server pdns-backend-pgsql
seejuures on valik paigaldada baas db-config süsteemi abil ja see validagi. Tulemusena tekitatakse baasi baasi kasutaja, create database, initsiliseeritakse baasi sisu ning kirjeldatakse PowerDNS backend seadistus
# cat /etc/powerdns/pdns.d/pdns.local.gpgsql.conf # PostgreSQL Configuration # # Launch gpgsql backend launch+=gpgsql # gpgsql parameters gpgsql-host=127.0.0.1 gpgsql-port= gpgsql-dbname=pdns gpgsql-user=pdns gpgsql-password=pdnsparool gpgsql-dnssec=yes
Vaikimisi käivitatakse PowerDNS protsessid ning natuke saab asuda süsteemi kasutama
# pdns_control list-zones All zonecount:0
Järgmisena tuleb PowerDNS server seadistada.
Käsitsi baasi lähtestamine
Kui db-config süsteemi mitte kasutada, sobib tekitada kasutaja ja create database andmebaas käsitsi
# su - postgres $ psql .. postgres=# create role pdns login password 'pdnsparool' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE; postgres=# create database pdns owner = pdns;
ning seejärel laadida baasi sisu, õieti struktuur
# psql -h 127.0.0.1 -U pdns pdns < /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql
Lisaks peab olema seadistusfail /etc/powerdns/pdns.d/pdns.local.gpgsql.conf sobiva sisuga, vt. eelmist punkti.
Tarkvara seadistamine
Üldosa sobiks kokkuvõttes seadistada nt nii
# egrep -v "^$|^#" /etc/powerdns/pdns.conf allow-axfr-ips=127.0.0.0/8,::1,192.168.1.210 also-notify=192.168.1.210 api=yes api-key=midagisalajast123 default-soa-mail=hostmaster.moraal.ee. default-soa-name=ans1.moraal.ee. include-dir=/etc/powerdns/pdns.d launch= master=yes only-notify=192.168.1.210 security-poll-suffix= setgid=pdns setuid=pdns slave=yes soa-expire-default=3600000 soa-minimum-ttl=3600 soa-refresh-default=86400 soa-retry-default=7200 webserver=yes webserver-address=192.168.1.248 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24
kus
- allow-axfr-ips - millistelt ip aadressidelt on lubatud axfr
- also-notify - millistele ip aadressidel töötavatele nimeserveritele saata notify
- api* - api kasutamine (vajalik veebipõhise haldusliidese nsedit jaoks)
- default-soa-* - uue tsooni sisu moodustamisel kasutatavad vaikeväärtused
- only-notify - notify saadetakse ainult näidatud ip aadressidele (mitte tsoonifailides siselduvatele NS serveritele)
- soa-* uue tsooni sisu moodustamisel kasutatavad vaikeväärtused
- webserver* - powerdns sisemise veebiserveri ip aadress jms (saab uurida protsesside statistikat)
Muudatuste kehtestamiseks lõpetada ja käivitada pdns protsessid
# systemctl stop pdns # systemctl start pdns
Tsooni sisu haldamine käsurealt
Tsooni sisu haldamine käsurealt toimub utiliidi pdnsutil abil. Uue tühja tsooni tekitamine (sisaldab SOA kirjet), seejärel tuleb vähemalt NS kirje tekitada (nb! nii tekib Native tüüpi tsoon)
# pdnsutil create-zone moraal.ee
Tulemuse küsimine
# pdnsutil show-zone moraal.ee
Tsooni Native -> Master teisendus
# pdnsutil set-kind moraal.ee master
Tsooni sisu esitamiseks
# pdnsutil list-zone moraal.ee
Sisu muutmiseks, sh muuta käsitsi SOA serial
# pdnsutil edit-zone moraal.ee
utiliidiga seriali suurendamiseks
# pdnsutil increase-serial moraal.ee
Tulemuse küsimine
# dig @127.0.0.1 moraal.ee axfr
Notify käsitsi välja saatmiseks
# pdns_control notify moraal.ee Added to queue
Kirje lisamine (lisaks tuleb increase serial öelda)
# pdnsutil add-record moraal.ee imre5 A 300 "127.0.0.5" Feb 21 10:20:54 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed New rrset: imre5.moraal.ee. IN A 300 127.0.0.5
Veebipõhine haldusliides nsedit
Veebipõhiste haldusliideste abil saab
- tekitada ja kustutada tsoone, muuta tsoonide sisu
- loodetavasti haldusliidese abil jäävad tegemata mingid süntaksivead, mida on kerge teha nn BIND-ühilduvat tsoonifaili tavalise tekstieditoriga otse muutes
- tsooni sisu halduse saab usaldada mitte-vi/joe/nano ekspertiisiga inimesele
Paistab, et veebipõhiseid haldusliideseid on omajagu, https://github.com/PowerDNS/pdns/wiki/WebFrontends. nsedit on PHP rakendus. Märkused
- Tsoonis tehtud muudatustega kaasneb automaatselt SOA seriali suurenemine
- Veebiliideses tehtud muudatused ei kajastu alati sama veebiliideses koheselt (nt SOA seriali muutumine, välja ja sisselogimise järel on näha)
- nsedit esitab muudatuste logi
- toimib ipv6 jaoks
- nn õäöü tähti sisaldavaid nimesid sisestada otseselt ei saa
- rakenduse võib paigaldada http:// peale ja seejärel muuta veebiserveri seadistusi ning kasutada edasi https:// abil
- nsedit ei pea asuma samas arvutis PowerDNS serveriga, suhtlemine toimub üle võrgu ja kasutades API liidest
Ettevalmistused
nsedit kasutamise eelduseks on selline tarkvara
# apt-get install apache2 php git php-sqlite3 php-curl
Paigaldamine ja seadistamine
Kopeerida tarkvara, tundub, et 2017 aasta alguses on praktiline võtta git repo viimane ots
# cd /var/www/html # git clone https://github.com/tuxis-ie/nsedit.git
Tekitada php skriptide jaoks kasutaja:grupp
# groupadd nsedit # useradd -g nsedit -m -d /opt/nsedit -s /bin/false nsedit
Avades brauseris http://pdns.moraal.ee/nsedit küsitakse parooli, vaikimisi sobib admin ja admin mille järel
- kontrollitakse vajalike teekide olemasolu
- moodustatakse sqlite3 andmebaas
# sqlite3 /var/www/html/etc/pdns.users.sqlite3 .. sqlite> .tables logs users zones
nsedit seadistatakse failis /var/www/html/nsedit/includes/config.inc.php
# cp includes/config.inc.php-dist includes/config.inc.php
- ühendust powerdns serveriga üle api juhib sektsioon
# cat /var/www/html/nsedit/includes/config.inc.php | grep '^$api' $apipass = 'apiparool'; # The PowerDNS API-key $apiip = '10.0.9.18'; # The IP of the PowerDNS API $apiport = '8081'; # The port of the PowerDNS API $apiproto = 'http'; # http | https $apisslverify = FALSE; # Verify SSL Certificate if using https for apiproto
- vaikeväärtuste kasutamiset haldusliideses kontrollib
$defaults['soa_edit'] = 'INCEPTION-INCREMENT'; $defaults['soa_edit_api'] = 'INCEPTION-INCREMENT'; $defaults['defaulttype'] = 'Master'; # Choose between 'Native' or 'Master' $defaults['ns'][0] = 'ns1.moraal.ee.'; # The value of the first NS-record $defaults['ns'][1] = 'ns2.moraal.ee.'; # The value of the second NS-record $defaults['ttl'] = 3600; # Default TTL for records $defaults['disabled'] = false; # Default disabled state
Kasutajaliides paistab välja selline
kus
- TODO
Kui rakendus töötab, muuta rakenduse failide omanik:grupp ära
# chown -R nsedit:nsedit /var/www/html/nsedit
Kasutamine
- Kasutajate lisamine, valida (ning märkida linnuke admin user jaoks), tulemusena on nsedit logid paremad
Users -> Add new user
- Uue tsooni lisamine, valida
Zones -> Add new zone
ning sisestada Domain lahtrisse domeeninimi, lõpetades punktiga, nt
test-1.ee.
Kõik muud valikud jätta vaikimisi
Account - admin Type - master Template - None
Kuna pdns serveri seadistusfailisis on näidatus SOA kirje väärtused ja nsedit seadisusfailis on kirjeldatud nimeserverid, siis tekib vaikimisi kastutatav tulemus.
- Uue tsooni lisamine kirjeldades korraga palju kirjeid (nt tsooni ületoomisel eelmise dns teenusepakkuja juurest)
Zones -> Import a new zone
seejuures
avanenud dialoogi pasteda tsoonifaili sisu eemaldada SOA kirje asendada NS kirjetesse õiged väärtused kõik nimed (kirje kõige vasem positsioon) peavad olema pikad ja lõppema punktiga eemaldada linnuke 'Overwrite Nameservers' juurest
- Mitme elemendilise väärtuse puhul tuleb see nii sisestada, nt MX kirje puhul
10 mx.moraal.ee.
- Eeldusel, et on olemas Content tulbas kasutatav A kirje ip aadressile vastav in-addr.arpa tsoon, saab nsedit abil tekitada automaatselt PTR kirje.
Kasulikud lisamaterjalid
DNSSEC tsooni esmane juurutamine
Tundub, et uuemal ajal saab DNSSEC juures kasatada CSK (Combined Signing Key) võtit ja seda kasutab PowerDNS vaikimisi, kuid samas CSK võtmeid registripidajad eriti ei toeta. Ja PowerDNS toetab ka nö klassikalist KSK+ZSK komplekti kasutamist.
KSK ja ZSK võtmete kasutamine
Võtmete tsooniga seostamiseks sobib öelda
# pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256 # pdnsutil add-zone-key moraal.ee zsk 1024 active rsasha256 # pdnsutil set-nsec3 moraal.ee '1 0 5 0...f' # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT # pdnsutil set-meta moraal.ee SOA-EDIT INCEPTION-INCREMENT # pdnsutil increase-serial moraal.ee # pdnsutil rectify-zone moraal.ee # pdnsutil show-zone moraal.ee
mis
- tekitab võtmed
- kui set-meta kogemata vääratab, nt lisati SOA-EDIT-SOA, siis saab meta data eemaldada, st näitamata väärtust
# pdnsutil set-meta moraal.ee SOA-EDIT-SOA
- võtab kasutusele nsec3 hash'ide arvutamiseks vajaliku materjali (0-f on 16-elemendiline juhuslik hex järgnevus, mis saadake nt nii
$ head -c 512 /dev/urandom | sha1sum | cut -b 1-16 7bc59a6dd87fa477
ja ideaalis võiks seda regulaarselt muuta), nt
$ dig +short moraal.ee nsec3param 1 0 5 E7544BB6070C3E0F
(kus 1 - sha1, 0 - opt-out, 5 - iterations, E7544BB6070C3E0F - salt)
- INCEPTION-INCREMENT rida seadistab selliselt, et kui automaaselt tsooni andmed resigneeritakse, siis suurendatakse ka seriali (muidu ei toimu notify ja andmed ei jõua avalikesse pädevatesse nimeserveritesse)
- rectify tuleb põhimõtteliselt öelda peale iga tsooni muudatust, et olla täiesti kindel tsooni toimimises; kui PowerDNS kasutatakse avalike nimeserverite varjatud masterina, pole see probleem
ning tsooni andmed paistavad
# pdnsutil show-zone moraal.ee Nov 06 23:49:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed This is a Master zone Last SOA serial number we notified: 2016103003 == 2016103003 (serial in the database) Metadata items: SOA-EDIT INCEPTION-INCREMENT SOA-EDIT-API INCEPTION-INCREMENT Zone has NSEC3 semantics, configuration: 1 0 1 ab keys: ID = 11 (ZSK), flags = 256, tag = 26589, algo = 8, bits = 1024 Active ( RSASHA256 ) ID = 10 (KSK), flags = 257, tag = 53461, algo = 8, bits = 2048 Active ( RSASHA256 ) KSK DNSKEY = moraal.ee. IN DNSKEY 257 3 8 AwEAAcn... TQcnQstT+tU= ; ( RSASHA256 ) DS = moraal.ee. IN DS 53461 8 1 6c123b39076072da... c66f62b1e3c388b86b7f ; ( SHA1 digest ) DS = moraal.ee. IN DS 53461 8 2 b85dee98efa6e3bb... 57ce193f728f6b2b1d0dd262 ; ( SHA256 digest ) DS = moraal.ee. IN DS 53461 8 3 1359b0b2b97e60b2... 844b207e84bf5c109eb2e151 ; ( GOST R 34.11-94 digest ) DS = moraal.ee. IN DS 53461 8 4 6d735926cd5cf68b... 9ca2af1f72b3b8f67900bb32a94c ; ( SHA-384 digest )
kus
- kaks võtit, ID väärtustega 10 ja 11
Seejärel tuleb registripidajale öelda DS väärtus.
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.
DNSSEC eemaldamiseks tuleb
- esmalt eemaldada registripidaja juurest DS kirje (reeglina see õnnestub, aga nt 2017 aasta kevadel .org domeenide puhul on tulemuseks dnssec viga, tavaline servfail)
- tsoonis dnssec väljalülitamiseks sobib öelda
# pdnsutil disable-dnssec moraal.ee
Tulemuse kontrollimine
Kui kõik juba töötab (ja on vist on vajalik, et kasutada on mõni dnssec-võimeline rekursiivne nimeserver), saab tulemust kontrollida nt nii
$ ldns-rrsig moraal.ee a moraal.ee RRSIG(a): Thu Oct 27 00:00:00 2016 - Thu Nov 17 00:00:00 2016
Märkused
- DNSSEC RRSIG signatuure arvutatakse iga 2 nädala tagant üle selleks, et piirata replay attack võimalusi. Põhimõtteliselt saab pahalane päringule vastuseks saata mõne varasemalt võrgus olnud vastuse (st RRSet + RRSIG komplekti) eeldusel, et ta kontrollib kasutaja võrguliiklust. Tänu RRSIG piiratud kehtivusajale (nt 2 nädalat) saab ta seda teha mitte vanemate kui 2 nädalat andmetega, lisaks ta on piiratud saatma mitte suvalisi vastuseid, vaid viimase kahe nädala jooksul kasutuses olnud vastuseid.
Kasulikud lisamaterjalid
CSK võtme kasutamine
Märkus 2016 lõpus: tundub, et see CSK on mingi tulevikutehnoloogia.
Olemasoleva tsooni jaoks DNSSEC sisselülitamiseks sobib öelda
# pdnsutil secure-zone moraal.ee # pdnsutil set-nsec3 moraal.ee '1 0 1 ab' # pdnsutil rectify-zone moraal.ee # pdnsutil set-meta moraal.ee SOA-EDIT-API INCEPTION-INCREMENT # pdnsutil increase-serial moraal.ee # pdnsutil show-zone moraal.ee
Seejärel tuleb registripidajale öelda DS väärtus.
Tulemuse saab kontrollida nt aadressil http://dnsviz.net/d/moraal.ee/dnssec/.
DNSSEC eemaldamiseks tuleb
- esmalt eemaldada registripidaja juurest DS kirje
- tsoonis dnssec väljalülitamiseks sobib öelda
# pdnsutil disable-dnssec moraal.ee
Misc
- tagasi nsec peale viimiseks
# pdnsutil unset-nsec3 moraal.ee
DNSSEC tsooni seostamine DS sissekande abil ülevalpool oleva tsooniga
DNSSEC tsooni seostamiseks ülevalpool oleva tsooniga on vaja teada selliseid andmeid
- võtme silt
- võtme tüüp
- algoritm
- avalik võti (või DS mis on avaliku võtme räsi vms)
Need kõik on avalik info ja kättesaadavad domeeni pädevast nimeserverist, aga PowerDNS haldusutiliidiga saab selle küsida otsekoheselt
# pdnsutil show-zone moraal.ee
Ühesõnaga, kui ise kasutatakse PowerDNS'i või partner saadab need andmed, siis allpool toodud dig käsuga tegelemist pole tarvis läbi teha. Tulemust sobib kontrollida nt aadressil http://dnsviz.net/.
zone.ee keskkonnas - .ee tsoonis
Logida sisse oma kasutajaga ja valida vasakult paneelist 'Teenuste ülevaade', kõnelaluse tsooni juures pressida rohelist + märki DNSSEC tulbas. Avanenud uuel eraanil vajutada üleval sinist nuppu Aktiveeri (muutub roheliseks), vajutada võtmete nimekirjas + märki ja täita lahtrid
kus
- võtme silt - (antud juhul 53461), selle saab teada päringu väjundist
$ dig @ns.auul.pri.ee moraal.ee dnskey rrsig | grep DNSKEY moraal.ee. 10800 IN RRSIG DNSKEY 8 2 10800 20161208000000 20161117000000 53461 moraal.ee. rVy+HAzSKkTRv6...
- võtme tüüp - KSK
- algoritm - 8 (RSA-SHA256)
- avalik võti, selle saab teada päringu väljundist, alates Aw kuni tU= (võib sisaldada tühikuid nagu päringu vastuses on)
$ dig @ns.auul.pri.ee moraal.ee dnskey | grep 257 moraal.ee. 3600 IN DNSKEY 257 3 8 AwEAAcnmmnnOlkRfK9NDYEI6F ... SD6 TQcnQstT+tU=
Vajutada all nuppu Kinnita, muudatus kehtestub peaaegu koheselt (ehk minutite jooksul), aga kasutajaliideses öeldakse
DNSSEC kaitse domeenil MORAAL.EE Hetkestaatus: DNSSEC on aktiveerimata Eesootavad muutused: DNSSEC aktiveeritakse
Teha brauseris refresh ja peab olema domeenide nimekirjas DNSSEC tulbas + asemel kilbi kujutis. Edasi läheb nn 15 minutit kuni muudatus zone.ee juurest eestiinternet.ee juurde jõuab ning kehtestub ee. tld (top level domain) nimeserverites. Kontrolliks maksab küsida tld nimeserverilt ds kirjet
$ dig +short @ns.tld.ee moraal.ee ds 30607 8 2 EAC8A17DD2128573F08EE76C18B4AB01734467CD4A376768F5358B0C A2B9463F
zone.ee keskkonnas - .org tsoonis
GoDaddy keskkonnas
TODO
DNSSEC võtmete asendamine
ZSK
KSK
KSK moodi võtme lisamiseks sobib öelda, selliselt võib tsooniga siduda ka enam kui kaks võtit
# pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256
Tsooniga seotud võtmed paistavad käsu väljundis
# pdnsutil show-zone moraal.ee
Tulemusena paistab dnsviz keskkonnas selline pilt
TODO
Tsooniga seotud võtme eemaldamiseks sobib öelda, kus ID on show-zone väljundist välja valitud võtme ID väärtus
# pdnsutil remove-zone-key moraal.ee ID
Kasulikud lisamaterjalid
Mitmesugused haldusprotseduurid
tsooni backend muutmine
TODO
tsooni toomine PowerDNS kontrolli alla
Tsooni migreerimiseks suvalisest AXFR-võimelisest nimeserverist sobib
- kirjeldada PowerDNS peal slave
# pdnsutil create-slave-zone moraal.ee 10.0.6.15 Feb 21 22:09:52 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed Creating slave zone 'moraal.ee', with master(s) '10.0.6.15:53'
- kopeerida andmed axfr abil üle, kopeerimist kiirendab
# pdns_control retrieve moraal.ee
- muuta PowerDNS tsooni jaoks masteriks, öeldes
SQL> UPDATE domains set type='MASTER' where type='SLAVE';
Kui allikaks on nt BIND ning tsoonifailis on kasutatud generate konstruktsiooni, siis need lahenduvad automaatselt ära
$GENERATE 1-255 $ IN CNAME $.1-255.40.184.10.in-addr.arpa.
Kasulikud lisamaterjalid
dnssec tsooni toomine PowerDNS kontrolli alla
Analoogiliselt eelmisele punktile, aga
- esmalt lülitada dnssec välja, kustutades DS kirje parent tsoonist ja oodates vähemalt DS kirje TTL aja enne järgmise punkti juurde asumist; seejärel on tsooni sisu endine st vanade võtmetega signeeritud andmestik
- tegevused eelmises punktis + uute võtmetega krüptimine
- asuda kasutama uute võtmetega krüptitud tsooni sisu, ja oodata nt 6 tundi
- juurutada parent tsoonis uus DS kirje
dnssec tsooni toomine PowerDNS kontrolli alla OpenDNSSEC keskkonnast koos vana KSK krüptomaterjaliga
Eeldusel, et OpenDNSSEC kasutab SoftHSM backendi saab KSK krüptomaterjalid eksportida ja taaskasutada. Ettevalmistuseks tuleb kõnealune tsoon muus osas tavalisel viisil kasutusele võtta. SoftHSM pealt krüptomaterjali eksportimiseks tuleb esmalt teha kindlaks kolm väärust
- SoftHSM label ja pin vaadata nt /etc/opendnssec/conf.xml failist
- kõnealuse tsooni ksk võtme id, vaadata KSK active realt tulp 'CKA_ID'
# ods-ksmutil key list -v
sobib öelda
# softhsm --export moraal.ee-ksk.pem --slot 0 --label "vaartus" --pin vaartus --id vaartus The key pair has been written to moraal.ee-ksk.pem
teisendada nn BIND kujule
# softhsm-keyconv --tobind --in ksk.pem --name moraal.ee --ksk --algorithm RSASHA256 The private key has been written to Kmoraal.ee+008+09122.private The public key has been written to Kmoraal.ee+008+09122.key
ning võtta kasutusele PowerDNS juures
# pdnsutil import-zone-key moraal.ee Kksk+008+53675.private active ksk
Edasi seadistatakse DNSSEC analoogliselt nagu seada ikka PowerDNS puhul seadistatakse. Kusjuures 'pdnsutil import-zone-key ...' tulemus on sarnane nagu oleks öeldud
# pdnsutil add-zone-key moraal.ee ksk 2048 active rsasha256
Kasulikud lisamaterjalid
pdns-control utiliidi kasutamine
PowerDNS kus on master tsoon saadab notify oma slavedele (nagu on tsoonifaili NS kirjetes kirjas)
# pdns_control notify <domain>
või näidatud ip aadressile
# pdns_control notify-host <domain> <ip-address>
TSIG kasutamine
Nimeserverite vahelise tsooniedastuse juures TSIG juurutamiseks tuleb esmalt tekitada võti
# pdnsutil generate-tsig-key from_dns_to_itm hmac-sha256 Generating new key with 64 bytes (this can take a while) Nov 26 13:10:37 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed Create new TSIG key from_dns_to_itm hmac-sha256 WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ==
kus
- TODO
ning seejärel võti ühe või enama tsooniedastusega seostada
# pdnsutil activate-tsig-key moraal.ee from_dns_to_itm master
Tulemus paistab nii
# pdnsutil show-zone moraal.ee Nov 26 14:09:44 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed This is a Master zone Last SOA serial number we notified: 2016112602 == 2016112602 (serial in the database) Zone is not actively secured Zone has following allowed TSIG key(s): from_dns_to_itm Metadata items: SOA-EDIT-API DEFAULT TSIG-ALLOW-AXFR from_dns_to_itm No keys for zone 'moraal.ee'.
kontrolliks sobib kopeerida öeldes
$ dig @192.168.1.248 moraal.ee axfr -y "hmac-sha256:from_dns_to_itm:WLuS4o6CX35+yGerdHpl2h3+PDKt76rgam9rqkRg8N+fTP6cGtC6H17rDidKl7FzEu0fukg3apxnZUxdDRDhkQ=="
kusjuures vastuses on üks preudokirje lisaks
.. from_dns_to_itm. 0 ANY TSIG hmac-sha256. 1480164029 300 32 t96WhnpNiAiL5KHXa8UzNthM6/p3ciQptF3Br2ZfhFk= 3538 NOERROR 0 ...
Väited
- Sama TSIG võtit saab kasutada mitme tsooni jaoks ja nii on mugavam nt NSD patternit kasutada
- tundub, et tsooni jaoks TSIG juurutamisega kaasneb, et tsooni kopeerimise ip piirang enam ei kehti (lubatud ip pealt pöördudes ei ole võtme esitamine vajalik)
- kui tsooni juures on tsig sisse lülitatud, siis see mõjub nii notify kui xfr jaoks
- TSIG pseudokirjete arv suureneb vastavalt tsooni mahu suurenemisele, https://tools.ietf.org/html/rfc2845 'The TSIG MUST be included on the first and last DNS envelopes. It can be optionally placed on any intermediary envelopes. It is expensive to include it on every envelopes, but it MUST be placed on at least every 100'th envelope.'
Alternatiiv on kasutada -y asemel -k suvandit ja argumendiks failinime, faili sisuga
key "from_yks_to_teine" { algorithm HMAC-SHA256; secret "YY8xvlL6yGjrt1G4xlfLBaidQOFdvixHgRXN6tXUPMitEKZUs7kl7qixJ0nSN1bbDJQxaFGkoKkBamNS7EPXbw=="; };
API kasutamine
Üle API muudatuse tegemiseks peab eelnevalt PowerDNS serveris lülitama API sisse ning sisemise webserver käivitama
# cat /etc/powerdns/pdns.conf .. api=yes api-key=apiparool webserver=yes webserver-address=192.168.1.248 webserver-allow-from=0.0.0.0/0,::/0,192.168.10.0/24 ...
ja kasutama nt sellist skripti (töökohaarvutis on seejuures abil kasutada nt jq utiliiti)
# cat pdns-api.sh curl -X PATCH --data \ '{"rrsets": [{ "name": "www.moraal.ee.", "records": [{ "content": "192.168.254.5", "disabled": false }], "ttl": 86000, "type": "A", "changetype": "REPLACE" }] }' -H 'X-API-Key: midagisalajast123' http://192.168.1.248:8081/api/v1/servers/localhost/zones/moraal.ee. | jq .
kus
- TODO
kas käivitamiseks öelda
$ sh pdns-api.sh
API'ga tutvumiseks võib olla hea mõte kuulata pealt mingi olemasoleva API-rakenduse ja serveri vahelist liiklust ja siis seda Wireshark abil uurida.
Kasulikud lisamaterjalid
- https://doc.powerdns.com/md/httpapi/README/ - tundub, et süntaks pole seal kõigis näidetes päris korrektne
PowerDNS kasutusstatistika
PowerDNS sisaldab sisemist veebiserverit, mille käest saab küsida teenuse kasutusstatistikat, TODO.
Logimine
Tundub, et vaikimisi logitakse syslog'i.
Varundamine ja taaste
TODO
Misc
Paigaldamine operatsioonisüsteemi paketihaldusest
Paigaldamiseks sobib öelda, tuleb paigalda üldosa + mingi backend, nt BIND-ühilduvate tsoonifailide käsitlemise komponent (st failisüsteem)
# apt-get install pdns-server pdns-backend-bind
Tulemusena tekib failisüsteemi
- /etc/powerdns/pdns.conf - peamine seadistusfail
MySQL backend kasutamine
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.
pdns-backend-mysql paigaldamine ja seadistamine
Eeldusel, et MySQL baas juba töötab samas arvutis, sobib paigaldamiseks sobib öelda (seejuures kasutades db-config sistemat, mis paigaldamise käigus tekitab create database baasi, kasutaja, sätib privileegid jne)
# apt-get install pdns-backend-mysql .. Determining localhost credentials from /etc/mysql/debian.cnf: succeeded. dbconfig-common: writing config to /etc/dbconfig-common/pdns-backend-mysql.conf Creating config file /etc/dbconfig-common/pdns-backend-mysql.conf with new version Creating config file /etc/powerdns/pdns.d/pdns.local.gmysql.conf with new version checking privileges on database pdns for pdns@localhost: user creation needed. granting access to database pdns for pdns@localhost: success. verifying access for pdns@localhost: success. creating database pdns: success. verifying database pdns exists: success. populating database via sql... done. dbconfig-common: flushing administrative password Processing triggers for libc-bin (2.24-3) ... Processing triggers for pdns-server (4.0.1-5) ...
Tulemusena
- tekitatakse MySQL kasutaja pdns
- tekitatakse MySQL create database pdns
BIND backend kasutamine
Tundub, et otsekoheselt failisüsteemis tsoonifaili redigeerimise teel on mõeldav töötada ainult BIND-formaadis backendiga. Muudega tuleks kasutada pdnsutil utiliiti või API liidest. Tsoonide nimekiri kirjeldatakse failis
# cat /etc/powerdns/named.conf # Debian default: supermaster created zones are written here: include "/var/lib/powerdns/supermaster.conf"; # Example for a manually configured slave zone: # zone "example.net" { file "/var/lib/powerdns/zones.slave.d/example.net.zone"; type master; masters { 192.0.2.53; }; };
Tsoon kirjeldatakse failis
# cat /var/lib/powerdns/zones.slave.d/example.net.zone $TTL 180 @ IN SOA ns1.example.net. hostmaster.example.net. ( 2014080705 ; Serial Number (date YYYYMMDD++) 86400 ; Refresh (24 hours) 1800 ; Retry (1/2 hour) 3600000 ; Expire (42 days) 21600) ; Minimum (6 hours) IN NS ns1.example.net. IN NS ns2.example.net. @ IN A 192.168.0.15 IN MX 10 mail.example.net. www IN A 192.168.0.15 mail IN A 192.168.0.2 ns1 IN A 10.1.1.171 ns2 IN A 10.1.1.172 imre IN A 10.1.1.173
Muudatuse kehtestamiseks
# pdns_control bind-reload-now example.net example.net: parsed into memory at 2016-10-26 20:43:14 +0300
PostgreSQL backend kasutamine
Teoreetliselt võib sodida tsooni sisu muutmiseks üldotstarbelise sql editoriga (nt PgAdmin) ka otse baasis, aga praktilisem on kasutada ehk pdnsutil või api't kasutava tarkvara abil, nt nsedit veebiliides.
BIND backend kasutamine
pdns-backend-bind seadistatakse failist
# egrep -v "^$|^#" /etc/powerdns/pdns.d/bind.conf launch+=bind bind-config=/etc/powerdns/named.conf bind-supermaster-config=/var/lib/powerdns/supermaster.conf bind-supermaster-destdir=/var/lib/powerdns/zones.slave.d
kus
- /etc/powerdns/named.conf - tsoonide nimekiri
- /var/lib/powerdns/supermaster.conf - lihtsal juhul tühi
- /var/lib/powerdns/zones.slave.d - BIND formaadis tsoonifailide kataloog
Tsoonide haldamisega tegeleb edasi allpool olev punkt.
Poweradmin
Märkus: tõenäoliselt ei ole Poweradmin tarvkara kasutamine hea mõte kuna rakendus sodib otse PowerDNS andmebaasis ja 2016 aasta sügisel on hakanud tekkima paremaid alternatiive, nt nsedit.
Poweradmin kasutamiseks peab PowerDNS kasutama SQL andmebaasi ja Poweradmin peab töötama vastu sama andmebaasi. Tundub, et Poweradmin töötab paremini MySQL + PHP5 keskkonnas. Kui Poweradmin PHP rakendus töötab teises arvutis kui MySQL baas, sobib baasis öelda
mysql> grant all privileges on pdns.* to 'pdns'@'%' identified by 'dbconfig sisestatud parool'; mysql> grant all privileges on pdns.* to 'pdns'@'localhost' identified by 'dbconfig sisestatud parool'; mysql> flush privileges;
# pdns_control retrieve moraal.ee Added retrieval request for 'moraal.ee.' from master 192.168.1.247
Kasulikud lisamaterjalid
Tsooni andmestikust otsing
- Kõigi forward tsoonide sisust ip aadressi kasutamise leidmine
# for i in `pdns_control list-zones | grep -v All | grep -v in-addr`; do pdnsutil list-zone $i 2>&1 ; done | grep 10.20.123.154 ftp.moraal.ee 300 IN A 10.20.123.154
2024 aasta kevade tähelepanekud
Eesmärk
- ühe operatsioonisüteemi peal kompaktselt lahenduse pidamine - Debian v. 12
- dns server - PowerDNS
- webgui haldusliides - PowerDNS-Admin (PDA)
- dnssec võimekus
- docker abil kasutatakse konteinerit (PDA)
- andmeid hoitakse PostgreSQL andmebaasis
Tööpõhimõte
Väited
- dnssec kasutab algoritmi nr 13
- NSEC3 kasutab '1 0 0 -' seadistust
- sekundaarsete nimeserveritega suhtlemine toimub catalog-zones abil
- kasutatakse KSK/ZSK ja CSK lähenemist võtmete pidamisel
Protseduuride võimekus
- NSEC, NSEC3 ja NSEC3 param väärtuste muutmine
- võtme vahetus
- krüptimise algoritmi vahetus
Platvormi ettevalmistamine
Platvorm koosneb
- Debian v. 12 operatsioonisüsteem
- Docker Community Edition
- PostgreSQL v. 12
- NginX
PostgreSQL
root@pdns:/tmp# apt-get install postgresql-common root@pdns:/tmp# mkdir /etc/postgresql-common/createcluster.d root@pdns:/tmp# echo "initdb_options = '--data-checksums'" > /etc/postgresql-common/createcluster.d/moraal.conf root@pdns:/tmp# echo "create_main_cluster = false" >> /etc/postgresql-common/createcluster.d/moraal.conf root@pdns:/tmp# apt-get install postgresql-16 root@pdns:/tmp# pg_createcluster --locale en_US.UTF-8 16 pgcluster_pdns_prod postgres=# \x Expanded display is on. postgres=# \l postgres List of databases -[ RECORD 1 ]-----+------------ Name | postgres Owner | postgres Encoding | UTF8 Locale Provider | libc Collate | en_US.UTF-8 Ctype | en_US.UTF-8 ICU Locale | ICU Rules | Access privileges |
PowerDNS kasutaja ja create database baasi tekitamiseks sobib öelda
# su - postgres $ psql sql> create role pdns login; sql> \password pdns sql> create database db_pdns owner = pdns;
PowerDNS-Admin kasutaja ja create database baasi tekitamiseks sobib öelda
# su - postgres $ psql sql> create role pda login; sql> \password pda sql> create database db_pda owner = pda;
PowerDNS paigaldamine
PowerDNS ise ja tema tööks otseselt vajalikud komponendid (nt PostgreSQL andmebaas) töötavad nö tavalisel viisil operatsioonisüsteemi protsesside-teenustena st mitte-konteineritena.
# apt-get install pdns-server pdns-backend-pgsql pdns-tools
Tulemusena käivitatakse pdns server ja tema bind backend.
TODO
PostgreSQL backend kasutamine
# psql -h 127.0.0.1 -U pdns pdns < /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql Password for user pdns: CREATE TABLE CREATE INDEX CREATE INDEX CREATE TABLE CREATE INDEX ...
Baasi ligipääs jms kirjeldatakse failis, https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#
root@pdns:~# egrep -v "^#|^$" /etc/powerdns/pdns.d/gpgsql.conf launch+=gpgsql gpgsql-dbname=db_pdns gpgsql-dnssec=yes gpgsql-host=127.0.0.1 gpgsql-password=parool gpgsql-port=5432 gpgsql-user=pdns
bind eemaldamiseks sobib kustutada fail
# rm /etc/powerdns/pdns.d/bind.conf
Tulemusena töötab pdns server, gpgsql backendiga
2024-06-16T16:44:00.877817+03:00 pdns systemd[1]: Starting pdns.service - PowerDNS Authoritative Server... 2024-06-16T16:44:00.906026+03:00 pdns pdns_server[3916]: Loading '/usr/lib/x86_64-linux-gnu/pdns/libgpgsqlbackend.so' 2024-06-16T16:44:00.906356+03:00 pdns pdns_server[3916]: This is a standalone pdns 2024-06-16T16:44:00.906408+03:00 pdns pdns_server[3916]: Listening on controlsocket in '/run/pdns/pdns.controlsocket' 2024-06-16T16:44:00.906668+03:00 pdns pdns_server[3916]: UDP server bound to 0.0.0.0:53 2024-06-16T16:44:00.906684+03:00 pdns pdns_server[3916]: UDP server bound to [::]:53 2024-06-16T16:44:00.906735+03:00 pdns pdns_server[3916]: TCP server bound to 0.0.0.0:53 2024-06-16T16:44:00.906750+03:00 pdns pdns_server[3916]: TCP server bound to [::]:53 2024-06-16T16:44:00.906866+03:00 pdns pdns_server[3916]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV 2024-06-16T16:44:00.906881+03:00 pdns pdns_server[3916]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost. 2024-06-16T16:44:00.906891+03:00 pdns pdns_server[3916]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2. 2024-06-16T16:44:00.915255+03:00 pdns pdns_server[3916]: Polled security status of version 4.9.1 at startup, no known issues reported: OK 2024-06-16T16:44:00.926644+03:00 pdns pdns_server[3916]: Creating backend connection for TCP 2024-06-16T16:44:00.935773+03:00 pdns pdns_server[3916]: About to create 3 backend threads for UDP 2024-06-16T16:44:00.935850+03:00 pdns systemd[1]: Started pdns.service - PowerDNS Authoritative Server. 2024-06-16T16:44:01.086206+03:00 pdns pdns_server[3916]: Done launching threads, ready to distribute questions
ühtegi tsooni ei ole kirjeldatud
root@pdns:/tmp# pdnsutil list-all-zones root@pdns:/tmp#
PowerDNS seadistamine
Seadistamisel tegeldakse
- api sisselülitamine (PDA jaoks)
- SOA kirje vaikeväärtused
- DNSSEC vaike krüpto
PowerDNS-Admin paigaldamine
PowerDNS-Admin tarvkara töötab docker konteinerina, aga kasutab host arvutist postgresql andmebaasi. Platvorm ettevalmistamine punktis on vajalik kasutaja ja create database tekitatud. PDA kasutamine eeldab, et PDNS juures on sisse lülitatud api liides (vaikimisi http liiklus üle port 8081).
Docker compose fail
root@pdns:~# cat docker-compose-pda.yml services: svc_pda: image: powerdnsadmin/pda-legacy:v0.4.2 container_name: cn_pda restart: always logging: driver: json-file options: max-size: 50m ports: - "9191:80" environment: - SECRET_KEY='saladus' - SQLALCHEMY_DATABASE_URI=postgresql://pda:pdaparool@192.168.10.53/pda - GUNICORN_TIMEOUT=60 - GUNICORN_WORKERS=2 - GUNICORN_LOGLEVEL=DEBUG - OFFLINE_MODE=False - CSRF_COOKIE_SECURE=False networks: - nw_pda networks: nw_pda: name: nw_pda driver: bridge
Käivitamiseks
# docker compose -f docker-compose-pda.yml up -d
Tulemusena on aadressil http://192.168.10.53:9191/ PDA webgui sisselogimise ekraan. Pressida Create Account ja esimesena tekitatud kasutaja on admin privileegidega.
TODO
NginX https:// frontend kasutamiseks sobib kasutada sellist seadistust
root@pdns:/etc/nginx/sites-enabled# cat /etc/nginx/sites-enabled/pdns server { listen 80; server_name pdns.moraal.ee; root /var/www/html; if ($request_uri !~ /.well-known) { return 301 https://pdns.moraal.ee/; } } server { listen 443 ssl http2; server_name pdns.moraal.ee; ssl_certificate /etc/ssl/localcerts/pdns.moraal.ee.pem; ssl_certificate_key /etc/ssl/localcerts/pdns.moraal.ee.key; ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; client_max_body_size 25m; ssl_stapling off; add_header Strict-Transport-Security "max-age=63072000" always; access_log /var/log/nginx/access-pdns.moraal.ee-443.log; root /var/www/html; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto https; proxy_pass http://192.168.10.53:9191; } }
Tulemusena saab pda webgui poole pöörduda aadressiga https://pdns.moraal.ee/.
PDA kasutamise privileegid
Väited
- Account - grupi taoline moodustis, praktiliselt võiks vastata domeeni omanik asutusele
- User - kasutaja taoline moodustis, vastab inimesele kes süsteemi kasutab
- User ja Account vaheliste seoste abil saab anda hulgale kasutajatele õiguse tegeleda hulga domeenidega
Kasulikud lisamaterjalid
- https://www.powerdns.com/
- http://www.poweradmin.org/
- https://github.com/PowerDNS/pdns/wiki/WebFrontends
- http://jpmens.net/2010/10/29/alternative-dns-servers-the-book-as-pdf/
- https://blog.powerdns.com/2016/02/02/powerdns-authoritative-the-new-old-way-to-manage-domains/
- https://www.cloudflare.com/dns/dnssec/how-dnssec-works/