PowerDNS Authoritative Server nimeserveri kasutamine

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

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

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

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

Fail:Pdns-1.gif

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

Fail:Pdns-3.gif

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

Fail:Pdns-6.gif

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

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