Ns.fjfi.cvut.cz

From NMS
Revision as of 14:33, 21 November 2014 by Vokacpet (Talk | contribs) (Rotování klíčů)

Jump to: navigation, search
Servery / Služby
Přístupné komukoliv
windows
srk
linux / unix
kmlinux
Omezený/individuální účet
linux / unix
bimbo · buon(KF) · km(KM) · lenochod(KJR) · linux · node(KM) · sunrise(KF) · unixlab(KFE) · vkstat(KM)
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]

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, ...)
  • specifický software a konfigurace
    • ISC bind
      • konfigurace v /etc/named.*, /etc/named
      • data uložena v /var/named
    • firewall
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

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
  • vygenerování NSEC3 seedu
rndc signing -nsec3param 1 0 10 $(printf "%04x%04x" $RANDOM $RANDOM) fjfi.cvut.cz
  • 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í konfigurac
rndc reconfig

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
  • skripty pro vygenerování prvních KSK/ZSK a udržování 3 posledních ZSK (prev, current, next)
#!/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 ${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}.key`
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}


#!/bin/bash
# Script for ZKS rotation

# 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}.key 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}