Difference between revisions of "Ns.fjfi.cvut.cz"
From NMS
(→Poznámky) |
(→Otestování konfigurace) |
||
Line 87: | Line 87: | ||
dnssec-dsfromkey -a SHA-256 Kexample.net.+008+50707.key | dnssec-dsfromkey -a SHA-256 Kexample.net.+008+50707.key | ||
* otestování DNSSEC | * otestování DNSSEC | ||
− | **[http://dnsviz.net/d/ | + | **[http://dnsviz.net/d/fjfi.cvut.cz/dnssec/ DNSViz] |
− | **[http://dnssec-debugger.verisignlabs.com/ | + | **[http://dnssec-debugger.verisignlabs.com/fjfi.cvut.cz VeriSign] |
+ | |||
==== Rotování klíčů ==== | ==== Rotování klíčů ==== | ||
Revision as of 14:14, 5 December 2014
Servery / Služby |
Přístupné komukoliv |
Omezený/individuální účet |
Služby |
backup · DHCP · DNS · doména FJFI · eduroam · fileserver · IdM · forum · gitlab · lists · moodle · indico · mailgw · K4 · mailserver · NMS · openvpn · skolniftp · ssh · videokonference · VoIP · video · VPN · wififjfi · wiki · www |
Učebny |
e-sklipek · KFE unixlab · KFE pclab · PD1 · KM 105 · KM 115 |
Ostatní |
Network · Blokované porty |
[edit] · [view] |
Contents
Základní informace
- Správce
- Petr Vokáč
- HW
- T1119 miniITX 1U Intel Atom 525 (dualcore), X7SPE-HF-D525 (PCI-E8,2GLAN,2SFF,front IO/C)
- OS
- CentOS7
- Využití
- nameserver pro doménu fjfi.cvut.cz
- Konto
- -
Instalace a konfigurace
- standardní (minimální) instalace operačního systému
- standardní puppet konfigurace pro server (certifikáty, logging, monitoring, kerberos, ...)
- konfigurace mailu - přeposílání mailů pro root účet pomocí /etc/aliases
- specifický software a konfigurace
- ISC bind
- konfigurace v /etc/named.*, /etc/named
- data uložena v /var/named
- firewall
- ISC bind
firewall-cmd --permanent --add-service=dns firewall-cmd --pernament --add-rich-rule='rule family="ipv4" source address="mgmt.srv.ip.addr" port port="rndc" protocol="tcp" accept' firewall-cmd --pernament --add-rich-rule='rule family="ipv6" source address="mgmt.srv.ip.addr" port port="rndc" protocol="tcp" accept' # další specifická IP+porty pro monitoring, zálohování, ... firewall-cmd --reload
Konfigurace
- změny mohou provádět vybraní správci
- informace ke konfiguraci ISC Bind
- podpora GSS-TSIG DDNS update z Windows Serverů
- v plánu je upgrade hw a clusterové řešení (postavené na RH cluster suite + drbd)
- v plánu je support pro DNSSEC (po podepsání nadřazené domény)
- v plánu jsou různá view pro vnitřní a externí sítě
Automatické změny
- smtp.fjfi.cvut.cz -> směřuje na mailgw1.fjfi.cvut.cz resp. mailgw2.fjfi.cvut.cz dle dostupnosti
- ldap[1-3].fjfi.cvut.cz, krb[1-3].fjfi.cvut.cz, wc[1-3].fjfi.cvut.cz -> směřuje na dostupné doménové kontrolery
- *.dhcp.fjfi.cvut.cz, *.7.32.147.in-addr.arpa, *.11.32.147.in-addr.arpa -> aktualizováno DHCP serverem při přidělení adresy síťovému zařízení
- *.radvd.fjfi.cvut.cz -> aktualizováno na základě informací o registrovaném zařízení, týká se zařízení u nichž je uvedena IPv6 adresa "dynamic". Podle informací o umístění zařízení (Břehová, Trojanova, Trója, Mobilní) se generují různé záznamy pro všechny podsítě, kde se může zařízení vyskytovat. DNS jména pak mohou vypadat následujícím způsobem def-tjn-123-untrusted.radvd.fjfi.cvut.cz.
DNSSEC
Prvotní inicializace a konfigurace
- konfigurace pro ISC Bind 9.9
- obsáhlá prezentace o použití DNSSEC
- ISC FAQ ohledně inline-signing
- vygenerování klíčů pro podpis DNS zony
cd /etc/named/keys dnssec-keygen -r /dev/urandom -3 -a RSASHA512 -b 1024 fjfi.cvut.cz dnssec-keygen -r /dev/urandom -3 -a RSASHA512 -b 2048 -f KSK fjfi.cvut.cz chown named:named Kfjfi.cvut.cz.+*+*.key chown named:named Kfjfi.cvut.cz.+*+*.private
- upravení konfigurace pro automatické podepisování zóny
zone "fjfi.cvut.cz" { // ... # look for dnssec keys here key-directory "/etc/named/keys"; # publish and activate dnssec keys auto-dnssec maintain; # use inline signing (bind 9.9) inline-signing yes; # change signature validity interval //sig-validity-interval 60 30; };
- reloadnutí konfigurace
rndc reconfig
- vygenerování NSEC3 seedu - způsobí přegenerování NSEC záznamů na NSEC3
rndc signing -nsec3param 1 0 10 $(printf "%04x%04x" $RANDOM $RANDOM) fjfi.cvut.cz
- při používání dynamických updatů (a z minulosti existujících *.jnl souborů) přestal DDNS fungovat, opraveno zavoláním
rndc sync -clean
Otestování konfigurace
- aplikace upravené konfigurace a par užitečných příkazů pro zjištění aktuálního stavu
rndc reconfig # vylistování aktuálně načtených klíčů rndc signing -list fjfi.cvut.cz # kontrola podpisů v zóně dig +dnssec +noall +answer @127.0.0.1 -t SOA fjfi.cvut.cz dig @127.0.0.1 AXFR fjfi.cvut.cz # čitelné vypsání zkompilované zóny named-compilezone -f raw -F text -o - fjfi.cvut.cz data/fjfi.cvut.cz.zone.signed named-checkzone -D -f raw -o - fjfi.cvut.cz data/fjfi.cvut.cz.zone.signed # získání DSKEY dig @127.0.0.1 dnskey fjfi.cvut.cz | dnssec-dsfromkey -f - fjfi.cvut.cz dnssec-dsfromkey -a SHA-1 Kexample.net.+008+50707.key dnssec-dsfromkey -a SHA-256 Kexample.net.+008+50707.key
Rotování klíčů
- základní informace jsou v RFC 4641 a konkrétní informace k ISC Bind
- standardní velikost klíčů je 1024 bitů pro ZSK a 2048 bitů pro KSK (velikost by měla odpovídat důležitosti domény resp. její postavení v hierarchii domén)
- doporučená doba rotace ZSK klíčů je 90 dní a pro KSK klíče 2 roky (viz. pravidla pro .cz doménu)
- pokud nedojde ke kompromitaci KSK nebo nejakému zásadnímu problému s použitým šifrováním tak rotování KSK není v principu potřeba (podepisují se jím pouze nové ZSK, tj. celá řada útoků vyžadující velký vzorek zašifrovaných dat není prakticky proveditelná)
- výše vygenerované klíče nemají omezenou platnost a lze ji změnit pomocí
dnssec-settime -I 20141001 -D 20141101 Kfjfi.cvut.cz.+007+first.key
- pro ZSK je asi nejvhodnější použít Pre-Publish Key Rollover
- vždy budou publikovány dva ZSK klíče z nichž právě jeden bude aktivní
- nový klíč se stejnými parametry a správnými hodnotami pro publikaci a aktivaci (pokud není změněno sig-validity-interval) lze vygenerovat
dnssec-keygen -r /dev/urandom -I 20141001 -D 20141101 -S Kfjfi.cvut.cz.+ZSK+current.key
- skript pro vygenerování prvních KSK/ZSK (vygenerovaná data lze použít v následujícím skriptu pro rotování 3 posledních ZSK)
#!/bin/bash # create first KSK/ZSK # global configuration KEYDIR='/etc/named/keys' ZSK_VALID=3 # ZSK is valid for 3 months KSK_VALID=120 # KSK is valid for 10 years if [ $# -lt 1 ]; then echo "usage: $0 zone" echo "example: $0 fjfi.cvut.cz" exit 1 fi SCRIPT_NAME=$0 ZONE=$1 KEYDIR_ZONE="${KEYDIR}/${ZONE}" KEYDIR_BACKUP="${KEYDIR}/BACKUP/${ZONE}" KEYDIR_STATUS="${KEYDIR}/${ZONE}.status" # don't overwrite existing configuration if [ -d ${KEYDIR_ZONE} -o -d ${KEYDIR_BACKUP} -o -f ${KEYDIR_STATUS} ]; then echo "Configuration for ${ZONE} already exists, exitting..." exit 1 fi # create directories for our keys mkdir -p ${KEYDIR_ZONE} mkdir -p ${KEYDIR_BACKUP} #chown named:named ${KEYDIR_ZONE} #chown named:named ${KEYDIR_BACKUP} # create first KSK (key signing key) INADATE=`date --date="${KSK_VALID} months" +%Y%m%d` DELDATE=`date --date="$((${KSK_VALID}+1)) months" +%Y%m%d` KSK=`dnssec-keygen -r /dev/urandom -K ${KEYDIR_BACKUP} -I ${INADATE} -D ${DELDATE} -3 -a RSASHA512 -b 2048 -f KSK ${ZONE}` chown named:named ${KEYDIR_BACKUP}/${KSK}.* cp -a ${KEYDIR_BACKUP}/${KSK}.key ${KEYDIR_ZONE} cp -a ${KEYDIR_BACKUP}/${KSK}.private ${KEYDIR_ZONE} echo "KSK_CURR='${KSK}'" >> ${KEYDIR_STATUS} # create first ZSK (zone signing key) INADATE=`date --date="${ZSK_VALID} months" +%Y%m%d` DELDATE=`date --date="$((${ZSK_VALID}+1)) months" +%Y%m%d` ZSK=`dnssec-keygen -r /dev/urandom -K ${KEYDIR_BACKUP} -I ${INADATE} -D ${DELDATE} -3 -a RSASHA512 -b 1024 -L 18000 ${ZONE}` chown named:named ${KEYDIR_BACKUP}/${ZSK}.* cp -a ${KEYDIR_BACKUP}/${ZSK}.key ${KEYDIR_ZONE} cp -a ${KEYDIR_BACKUP}/${ZSK}.private ${KEYDIR_ZONE} echo "ZSK_CURR='${ZSK}'" >> ${KEYDIR_STATUS} # create next ZSK (zone signing key), because script for key rotation relay on existing current+next key INADATE=`date --date="$((2*${ZSK_VALID})) months" +%Y%m%d` DELDATE=`date --date="$((2*${ZSK_VALID}+1)) months" +%Y%m%d` ZSK=`dnssec-keygen -r /dev/urandom -K ${KEYDIR_BACKUP} -I ${INADATE} -D ${DELDATE} -S ${KEYDIR_ZONE}/${ZSK} -L 18000` chown named:named ${KEYDIR_BACKUP}/${ZSK}.* cp -a ${KEYDIR_BACKUP}/${ZSK}.key ${KEYDIR_ZONE} cp -a ${KEYDIR_BACKUP}/${ZSK}.private ${KEYDIR_ZONE} echo "ZSK_NEXT='${ZSK}'" >> ${KEYDIR_STATUS} # show command that can be used to create NSEC3 seed SEED=`printf '%04x%04x' $RANDOM $RANDOM` echo "# if you want to use NSEC3 instead of NSEC, execute following command" echo "rndc signing -nsec3param 1 0 10 ${SEED} ${ZONE}"
- skript pro rotování 3 posledních ZSK (prev, current, next) spouštěný pravidelně přes cron
#!/bin/bash # Script for ZSK rotation # this should be called daily from cron # global configuration KEYDIR='/etc/named/keys' ZSK_VALID=3 # ZSK is valid for 3 months KSK_VALID=120 # KSK is valid for 10 years # use command line arguments if [ $# -lt 1 ]; then echo "usage: $0 zone" echo "example: $0 fjfi.cvut.cz" exit 1 fi SCRIPT_NAME=$0 ZONE=$1 KEYDIR_ZONE="${KEYDIR}/${ZONE}" KEYDIR_BACKUP="${KEYDIR}/BACKUP/${ZONE}" KEYDIR_STATUS="${KEYDIR}/${ZONE}.status" # check files required before running this key rolling script if [ ! -f ${KEYDIR_STATUS} ]; then MSG="ZONE[${ZONE}] zone status file ${KEYDIR_STATUS} doesn't exist, use KEYS-FIRST to create keys and initial status file" logger -t ${SCRIPT_NAME} -p user.error "${MSG}" echo "${MSG}" exit 1 fi . ${KEYDIR_STATUS} if [ -z ${ZSK_CURR} ]; then MSG="ZONE[${ZONE}] ZSK current key not defined in ${KEYDIR_STATUS}" logger -t ${SCRIPT_NAME} -p user.error "${MSG}" echo "${MSG}" exit 1 fi if [ -z ${ZSK_NEXT} ]; then MSG="ZONE[${ZONE}] ZSK next key not defined in ${KEYDIR_STATUS}" logger -t ${SCRIPT_NAME} -p user.error "${MSG}" echo "${MSG}" exit 1 fi if [ ! -f "${KEYDIR_ZONE}/${ZSK_CURR}.key" -o ! -f "${KEYDIR_ZONE}/${ZSK_CURR}.private" ]; then MSG="ZONE[${ZONE}] ZSK current key file ${KEYDIR_ZONE}/${ZSK_CURR}.{key,private} doesn't exists" logger -t ${SCRIPT_NAME} -p user.error "${MSG}" echo "${MSG}" exit 1 fi if [ ! -f "${KEYDIR_ZONE}/${ZSK_NEXT}.key" -o ! -f "${KEYDIR_ZONE}/${ZSK_NEXT}.private" ]; then MSG="ZONE[${ZONE}] ZSK current key file ${KEYDIR_ZONE}/${ZSK_NEXT}.{key,private} doesn't exists" logger -t ${SCRIPT_NAME} -p user.error "${MSG}" echo "${MSG}" exit 1 fi # for safety check local time with NTP servers, # because key validity depends on correct time setting TIMESYNC=`ntpdate -q -s -p 2 tik.cesnet.cz tak.cesnet.cz | sed -e 's/.*offset //' -e 's/\..*//' | sort -n | tail -1` #if [ $? -ne 0 -o "x${TIMESYNC}" == "x" -o "${TIMESYNC}" -gt 0 ]; then if [ $? -ne 0 -o "${TIMESYNC}" -gt 0 ]; then MSG="ZONE[${ZONE}] ZSK can't be checked, because local time is not synchronized ${TIMESYNC}" logger -t ${SCRIPT_NAME} -p user.error "${MSG}" echo "${MSG}" exit 1 fi # check validity of current keys LASTDATE=`grep -E '^Inactive: [0-9]*$' ${KEYDIR_ZONE}/${ZSK_CURR}.private | sed 's/.*: //'` if [ -z ${LASTDATE} ]; then logger -t ${SCRIPT_NAME} -p user.info "ZONE[${ZONE}] ZSK never expires" exit 0 fi if [ `date +%Y%m%d%H%M%S` -lt ${LASTDATE} ]; then logger -t ${SCRIPT_NAME} -p user.info "ZONE[${ZONE}] ZSK inactivate date ${LASTDATE} is in future" exit 0 fi # create next ZSK (zone signing key) logger -t ${SCRIPT_NAME} -p user.info "ZONE[${ZONE}] ZSK current key is inactive from ${LASTDATE}, rotating keys" INADATE=`date --date="$((2*${ZSK_VALID})) months" +%Y%m%d` DELDATE=`date --date="$((2*${ZSK_VALID}+1)) months" +%Y%m%d` ZSK=`dnssec-keygen -r /dev/urandom -K ${KEYDIR_BACKUP} -I ${INADATE} -D ${DELDATE} -S ${KEYDIR_ZONE}/${ZSK_CURR} -L 18000 2> /dev/null` if [ $? -ne 0 ]; then MSG="ZONE[${ZONE}] ZSK not created, please investigate!" logger -t ${SCRIPT_NAME} -p user.error "${MSG}" echo "${MSG}" exit 1 fi chown named:named ${KEYDIR_BACKUP}/${ZSK}.* # rotate old files and copy new files cp -a ${KEYDIR_BACKUP}/${ZSK}.key ${KEYDIR_ZONE} cp -a ${KEYDIR_BACKUP}/${ZSK}.private ${KEYDIR_ZONE} [ -f "${KEYDIR_ZONE}/${ZSK_PREV}.key" ] && rm -rf "${KEYDIR_ZONE}/${ZSK_PREV}.key" [ -f "${KEYDIR_ZONE}/${ZSK_PREV}.private" ] && rm -rf "${KEYDIR_ZONE}/${ZSK_PREV}.private" echo "ZSK_PREV='${ZSK_CURR}'" >> ${KEYDIR_STATUS} echo "ZSK_CURR='${ZSK_NEXT}'" >> ${KEYDIR_STATUS} echo "ZSK_NEXT='${ZSK}'" >> ${KEYDIR_STATUS}
Poznámky
- SOA minimum TTL by měl být relativně krátký
- význam této položky byl v historii různý
- nyní je používána jako délka cachování negativních odpovědí (RFC 2308)
- pokud něco uděláme špatně (zapomeneme publikovat nějaký důležitý záznam pro DNSSEC), tak je vhodné aby negativní cache expirovala relativně brzy
- doporučený čas je v desítkách minut až jednotek hodin
- sig-validity-interval
- je standardně nastaven na 30 24 dní (vygenerovaný podpis je platný po 30 dní a bude přegenerován 6 dní před exprirací)
- podle mě je vhodné aby interval mezi expirací a automatickým přepodepisováním pokryl dobu expirace zóny uvedené v SOA + dobu maximálního TTL uvedeného pro některý záznam v dané zóně
- naše potřeby (expirace zóny 2 týdny + expirace záznamů 1 den) lze použít např. hodnoty 30 14 (nebo třeba 60 44)
- změny vlastností klíčů
- není problém prodloužit platnost klíče pomocí dnssec-settime, pokud je aktuální datum uvnitř intervalu (published, deleted) - např. pokud se blíží doba expirace KSK a ještě nejsme připraveni na jeho rotování
- změna délky ZSK klíče je bezproblémová
- změna algoritmu ZSK (KSK) je komplikováná a v takovém případě je nutné si tuhle proceduru předem odzkoušet!!! Navíc se při různých klíčích bind 9.9.4 v jistý okamžik zbláznil, neustále načítal znovu klíče z disku, negeneroval nové podpisy v postižené zóně a přitom vytěžoval CPU na 100% (pomohlo až expirování starých klíčů pomocí dnssec-settime -D now keyname)
- využití DNSSEC
- SSHFP (RFC 4255) - publikování SSH fingerprintu přes DNS - po zapnutí volby VerifyHostKeyDNS yes se nové SSH klíče automaticky ověří proti SSHFP záznamu v DNS
- DANE (RFC 6698) standard a publikovani TLSA zaznamu, viz. např. konfigurace postfixu