Difference between revisions of "Ns.fjfi.cvut.cz"

From NMS
Jump to: navigation, search
(Konfigurace)
(Rotování klíčů)
Line 98: Line 98:
 
* nový klíč se stejnými parametry a správnými hodnotami pro publikaci a aktivaci (pokud není změněno <tt>sig-validity-interval</tt>) lze vygenerovat
 
* nový klíč se stejnými parametry a správnými hodnotami pro publikaci a aktivaci (pokud není změněno <tt>sig-validity-interval</tt>) lze vygenerovat
 
  dnssec-keygen -r /dev/urandom -I 20141001 -D 20141101 -S Kfjfi.cvut.cz.+ZSK+current.key
 
  dnssec-keygen -r /dev/urandom -I 20141001 -D 20141101 -S Kfjfi.cvut.cz.+ZSK+current.key
* budeme udržovat 3 poslední ZSK klíče (prev, current, next) a při rotaci se zbavíme nejstaršího a přidáme jeden nový
+
* skripty pro vygenerování prvních KSK/ZSK a udržování 3 posledních ZSK (prev, current, next)
 +
#!/bin/bash
 
  # global configuration
 
  # global configuration
 
  KEYDIR='/etc/named/keys'
 
  KEYDIR='/etc/named/keys'
  ZSK_VALID=3    # ZSK valid for 3 months
+
  ZSK_VALID=3    # ZSK is valid for 3 months
  KSK_VALID=120  # KSK valid for 10 years
+
  KSK_VALID=120  # KSK is valid for 10 years
  ZONE=fjfi.cvut.cz
+
   
 +
 +
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
 
  # create directories for our keys
  #mkdir -p ${KEYDIR}
+
  mkdir -p ${KEYDIR_ZONE}
  #mkdir -p ${KEYDIR}-all
+
  mkdir -p ${KEYDIR_BACKUP}
 +
#chown named:named ${KEYDIR_ZONE}
 +
#chown named:named ${KEYDIR_BACKUP}
 
   
 
   
  # create next ZSK (zone signing key)
+
 +
  # create first ZSK (zone signing key)
 
  INADATE=`date --date="${ZSK_VALID} months" +%Y%m%d`
 
  INADATE=`date --date="${ZSK_VALID} months" +%Y%m%d`
 
  DELDATE=`date --date="$((${ZSK_VALID}+1)) months" +%Y%m%d`
 
  DELDATE=`date --date="$((${ZSK_VALID}+1)) months" +%Y%m%d`
 
   
 
   
  ZSK=`dnssec-keygen -r /dev/urandom -K ${KEYDIR}-all -I ${INADATE} -D ${DELDATE} -S ${KEYDIR}/K${ZONE}.+ZSK+current.key`
+
  ZSK=`dnssec-keygen -r /dev/urandom -K ${KEYDIR_BACKUP} -I ${INADATE} -D ${DELDATE} -3 -a RSASHA512 -b 1024 ${ZONE}`
  chown named:named ${KEYDIR}-all/${ZSK}.*
+
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}
 
   
 
   
# rotate old files
 
if [ -f ${KEYDIR}/K${ZONE}.+ZSK+next.private ]; then
 
  mv ${KEYDIR}/K${ZONE}.+ZSK+current.key ${KEYDIR}/K${ZONE}.+ZSK+retired.key
 
  mv ${KEYDIR}/K${ZONE}.+ZSK+current.private ${KEYDIR}/K${ZONE}.+ZSK+retired.private
 
 
   
 
   
  mv ${KEYDIR}/K${ZONE}.+ZSK+next.key ${KEYDIR}/K${ZONE}.+ZSK+current.key
+
# create next ZSK (zone signing key), because script for key rotation relay on existing current+next key
  mv ${KEYDIR}/K${ZONE}.+ZSK+next.private ${KEYDIR}/K${ZONE}.+ZSK+current.private
+
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}
 +
 +
 +
# 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}
 +
 
 +
 
 +
#!/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
 
  fi
 
   
 
   
  cp ${KEYDIR}-all/${ZSK}.key ${KEYDIR}/K${ZONE}.+ZSK+next.key
+
  SCRIPT_NAME=$0
  cp ${KEYDIR}-all/${ZSK}.private ${KEYDIR}/K${ZONE}.+ZSK+next.private
+
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}.*
 
   
 
   
  # create next KSK (key signing key)
+
  # rotate old files and copy new files
  # same procedure except you have to add new DS record in parent zone
+
cp -a ${KEYDIR_BACKUP}/${ZSK}.key ${KEYDIR_ZONE}
* pro KSK klíč je navíc potřeba nahrát DS záznam do nadřazené domény před datem publikace nového klíče
+
  cp -a ${KEYDIR_BACKUP}/${ZSK}.private ${KEYDIR_ZONE}
 +
echo "ZSK_CURR='${ZSK_NEXT}'" >> ${KEYDIR_STATUS}
 +
echo "ZSK_NEXT='${ZSK}'" >> ${KEYDIR_STATUS}

Revision as of 14:23, 21 November 2014

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


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


#!/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}
echo "ZSK_CURR='${ZSK_NEXT}'" >> ${KEYDIR_STATUS}
echo "ZSK_NEXT='${ZSK}'" >> ${KEYDIR_STATUS}