Un petit script for the fun que je suis entrain d’écrire - si çà peut aider, motiver
NdMoi-même : 20221005 - Modification du script pour pouvoir vérifier plusieurs zones DNS et redémarrer, recharger le serveur DNS seulement si une zone a été mise à jour.
J’ai ajouté un 2ème script « dnssec-sign-myzones.bash
» en commentaire 18 → celui à mettre en « crontab ».
Note de Moi-même 20240307 minuit : J’ai fais ce script qui n’est plutôt pas mal je trouve → le script acme-certif-date_verification.bash
en commentaire « 45 »
root@lv1.dns:~ # cat /root/dnssec-sign-zones.bash
#!/bin/bash
#######################################################################
# Author : O.Romain.Jaillet-ramey (orj+bash+dnssec (at) lab3w.fr)
# Date Create : 20220926
# Date Modified : 20221005
# Desc : Script to check expiration and sign zone (last day) DNSSEC
# Author's note : Useless script
#######################################################################
#####-------------------------- CONFIG ----------------------------#####
date_year="$(date +%Y)"
date_month="$(date +%m)"
date_day="$(date +%d)"
date_hour="$(date +%H:%M:%S)"
date="${date_year}-${date_month}-${date_day} ${date_hour}"
timestamp=$(date -d "${date}" +%s)
month_more_1m=$((60 * 60 * 24 * 30))
#####----#####
force=0
dnssec_keys="/var/cache/bind/"
dnssec_keys_algo_8="/etc/bind/keys-algo-8/"
dnssec_keys_algo_13="/etc/bind/keys-algo-13/"
#####-------------------------- /CONFIG ---------------------------#####
#####-------------------------- FUNCTIONS -------------------------#####
usage() { # Function: Print a help message.
echo "Usage: $0 [ -d domain.tld ] [ -f /etc/bind/master/domain.tld ] [ -a 8|13] [ --force ]" 1>&2
}
exit_abnormal() { # Function: Exit with error.
usage
exit 1
}
script_desc() {
echo "#####---------------------------------------------------------"
echo "#"
echo "# DESC : Script to check expiration and sign zone (last day) DNSSEC"
echo "#"
echo "# ACTUAL DATE : ${date}"
#echo "# ACTUAL TIMESTAMP : ${timestamp}"
#echo "# ACTUAL TIMESTAMP + 1 MONTH : ${timestamp} + ${month_more_1m} = $((${timestamp} + ${month_more_1m}))\n"
expire_timestamp="$((${timestamp} + ${month_more_1m}))"
expire_date=$(date -d @${expire_timestamp} '+%Y-%m-%d %H:%M:%S')
#echo "# EXPIRE DATE : ${expire_date}"
echo "#"
echo -e "#####---------------------------------------------------------\n"
echo -e "#####---------------------------------------------------------\n"
}
zone_infos() {
resign=0
zone=${zone}
zoneFile=${zoneFile}
zoneFileSigned="${zoneFile}.signed"
date_zonefile="$(stat ${zoneFile} | egrep '^Modif.' | cut -d' ' -f2-3 | cut -d'.' -f1)"
time_zonefile=$(date -d "${date_zonefile}" +%s)
time_expire="$((${time_zonefile} + ${month_more_1m}))"
date_expire=$(date -d @${time_expire} '+%Y-%m-%d %H:%M:%S')
echo "+ DNS Zone : ${zone}"
echo ' \'
echo " +- Zone file : ${zoneFile}"
echo " +- Zone file signed : ${zoneFileSigned}"
echo " +-"
echo ' | \'
echo " | +-> Date Create : ${date_zonefile}"
echo " | +-> Date Expire : ${date_expire}"
echo " |"
days_expire_time="$((${time_expire} - ${timestamp}))"
days_expire="$((${days_expire_time} / 60 / 60 / 24))"
# days_expire=1
if [ ${days_expire} -le 1 ] || [ ${force} -eq 1 ]; then
resign=1
echo " +-> This zone updating now"
else
echo " +-> This zone OK : Expire in ${days_expire} days (no update)"
fi
}
zone_resign() {
if [ ${resign} -eq 1 ]; then
echo ' \'
echo " +-> This zone expire in ${days_expire} days"
echo ' |'
echo " +- Re checkzone into zone file....."
echo " |"
zonefile_check=$(named-checkzone $zone ${zoneFile} | egrep 'OK|failed|errors')
if [ ${zonefile_check} = 'OK' ]; then
zonefile_soa=$(named-checkzone $zone $zoneFile | egrep -ho '[0-9]{8,}')
# zonefile_soa="2022092702"
zonefile_soa_date=$(echo ${zonefile_soa:0:8})
zonefile_soa_serial="$(echo ${zonefile_soa:8})"
echo " +- Check syntax zone file - ${zonefile_check}"
echo ' | \'
echo " | +-> SOA Date : ${zonefile_soa_date}"
echo " | +-> SOA Serial : ${zonefile_soa_serial}"
echo " |"
echo " +- Modify zone file...."
echo ' \'
new_date_year_soa="$(date +%Y)"
new_date_month_soa="$(date +%m)"
new_date_day_soa="$(date +%d)"
new_serial_soa="01"
new_date_soa="${new_date_year_soa}${new_date_month_soa}${new_date_day_soa}"
echo " +- Change SOA : "
if [ ${zonefile_soa_date} -eq ${new_date_soa} ]; then
new_soa="${zonefile_soa_date}$(printf '%02d' $((${zonefile_soa_serial#0*} + 1 )))"
else
new_soa=${new_date_soa}${new_serial_soa}
fi
echo ' | \'
echo " | +-> ${zonefile_soa} -> ${new_soa}"
echo " |"
#... modify zone file with sed -i
sed -i 's/'${zonefile_soa}'/'${new_soa}'/' ${zoneFile}
echo " +-> Zone file modified - OK"
dnssec-signzone -N INCREMENT -o ${zone} -K ${dnssec_keys} -t ${zoneFile}
echo " +-> Zone file signing - OK"
chown bind:bind ${zoneFileSigned}
echo " +-> Zone file signed - Assignment of user:group \"bind\" rights on ${zoneFileSigned}"
if [ ${force} -eq 1 ]; then
/etc/init.d/bind9 restart
echo " +-> Bind server DNS reload"
exit 0
else
exit 150
fi
else
echo " +-> This zone ${zone} in ERROR - Check zone file ${zoneFile}"
fi
fi
#.. for test exit status
#exit 151
}
#####-------------------------- /FUNCTIONS ------------------------#####
#####-------------------------- CHECK -----------------------------#####
ID=`id -u`
if [ "x$ID" != "x0" ]; then
echo "Run as root!"
exit 1
fi
while getopts "d:f:a:-:" options; do
case "${options}" in
d)
# echo -n "Domain Name : "
zone=${OPTARG}
# echo ${zone}
;;
f)
# echo -n "Zone file : "
zoneFile=${OPTARG}
# echo ${zoneFile}
;;
a)
algorithm=${OPTARG}
if [ ${algorithm} -eq 8 ]; then
dnssec_keys=${dnssec_keys_algo_8}
elif [ ${algorithm} -eq 13 ]; then
dnssec_keys=${dnssec_keys_algo_13}
else
dnssec_keys=${dnssec_keys}
fi
;;
-)
case "${OPTARG}" in
force)
val="${!OPTIND}"; OPTIND=$(( $OPTIND + 1 ))
# echo "Parsing option: '--${OPTARG}', value: '${val}'" >&2;
force=1;
;;
force=*)
val=${OPTARG#*=}
opt=${OPTARG%=$val}
# echo "Parsing option: '--${opt}', value: '${val}'" >&2
force=${val}
;;
*)
if [ "$OPTERR" = 1 ] && [ "${options:0:1}" != ":" ]; then
echo "Unknown option --${OPTARG}" >&2
fi
;;
esac
;;
esac
done
shift
#####-------------------------- /CHECK ----------------------------#####
#####-------------------------- SCRIPT ----------------------------#####
if [ "${zone}" != "" ]; then
if [ "${zoneFile}" != "" ]; then
# script_desc
zone_infos
zone_resign
echo -e "\n#####---------------------------------------------------------"
else
echo "Configure zone file: -f /etc/bind/masters/domain.tld.hosts"
usage
fi
else
echo "Configure the zone name: -d domain.tld"
usage
fi
#exit 0
#####-------------------------- /SCRIPT ----------------------------#####
Qui donne ces outputs :
root@lv1.dns:~ # ./dnssec-sign-zones.bash -d zw3b.net -f /etc/bind/masters/zw3b.net.hosts
#####---------------------------------------------------------
#
# DESC : Script to check expiration and sign zone (last day) DNSSEC
#
# ACTUAL DATE : 2022-09-28 17:36:19
#
#####---------------------------------------------------------
#####---------------------------------------------------------
+ DNS Zone : zw3b.net
\
+- Zone file : /etc/bind/masters/zw3b.net.hosts
+- Zone file signed : /etc/bind/masters/zw3b.net.hosts.signed
+-
| \
| +-> Date Create : 2022-09-23 15:05:37
| +-> Date Expire : 2022-10-23 15:05:37
|
+-> This zone OK : Expire in 24 days (no update)
#####---------------------------------------------------------
17:37:08 root@lv1.dns:~ # ./dnssec-sign-zones.bash -d zw3b.net -f /etc/bind/masters/zw3b.net.hosts --force
#####---------------------------------------------------------
#
# DESC : Script to check expiration and sign zone (last day) DNSSEC
#
# ACTUAL DATE : 2022-09-28 17:37:56
#
#####---------------------------------------------------------
#####---------------------------------------------------------
+ DNS Zone : zw3b.net
\
+- Zone file : /etc/bind/masters/zw3b.net.hosts
+- Zone file signed : /etc/bind/masters/zw3b.net.hosts.signed
+-
| \
| +-> Date Create : 2022-09-23 15:05:37
| +-> Date Expire : 2022-10-23 15:05:37
|
+-> This zone updating now
\
+-> This zone expire in 24 days
|
+- Re checkzone into zone file.....
|
+- Check syntax zone file - OK
| \
| +-> SOA Date : 20220923
| +-> SOA Serial : 02
|
+- Modify zone file....
\
+- Change SOA :
| \
| +-> 2022092302 -> 2022092801
|
+-> Zone file modified - OK
+-> Zone file signing (RSA SHA256 - Algo 8)
+-> Zone file signed - Assignment of user:group "bind" rights on /etc/bind/masters/zw3b.net.hosts.signed
+-> Bind server DNS reload
#####---------------------------------------------------------
17:37:56 root@lv1.dns:~ #
NdMoi-même : 20220928 - j’ai ajouté l’argument --force
et les arguments -d
pour le "nom de la zone " et -f
pour le « fichier de la zone ». Comme çà c’est mieux
NdMoi-même : 20220927 - Infos
Et je n’ai pas mis le -i
à la commande sed
→ donc le output s’affiche dans la console au lieu de modifier le fichier zone.dns.
NdMoi-même : 20221006 - Infos
J’ai décommenté cette ligne sed
et j’ai ajouté -i
donc votre fichier de zone DNS sera modifié, le SOA Record ( Start Of Authority record), faites attention !!
Si vous voulez que le script soit opérationnel, qu’il fonctionne :
- il faut mettre «
sed -i
» à la place de « sed
» et décommenter la ligne
- et décommenter la ligne «
dnssec-signzone
»
- et décommenter la ligne «
/etc/init.d/bind9 reload|restart
» en choisissant reload
ou restart
ATTENTION : Le script est fonctionnel - j’ai décommenté les lignes (masquées) du desssus
Et mettre une tache planifiée tous les jours sur vos fichiers zone dns - vous faire un mini-script avec une boucle de toutes vos zones que vous souhaitez vérifier
J’ai mis plusieurs commandes dnssec-signzone
- Selon comment vous avez créé (dnssec-keygen
) vos clefs KSK (Key Signing Key) et ZSK (Zone Signing Key).
- Algorithme 7 (NSEC3 RSA SHA1) est obsolète en 2022.
- Algorithme 8 (RSA SHA256) est conseillé actuellement en 2022.
- Algorithme 13 (ECDSA P256 SHA256) : (Elliptic Curve Digital Signature Algorithm) n’est pas encore recommandé (ECDSA : la pièce manquante de DNSSEC).
Pensée d'hier :)
Par contre je me disais :
Que ce serait bien (aussi) de mettre quelque part :
Would you like to re-sign this zone ? read resign;
même si la zone n’expire pas le lendemain Histoire de pouvoir envoyer la commande manuellement quand on le souhaite - Est-ce que cela servirait ? J’ai presque un doute.
En plus, il faudrait que tous les jours de vérification par crontab (tache planifiée) que le script ne s’arrête pas sur cette question
Pensée d'aujourd'hui :)
Donc j’ai ajouté l’argument --force
pour envoyer la commande manuellement
Comme m’a conseillé @MicP ici c’est de lire/connaître les infos sur shift
xargs
getops
pour faire de bons scripts et savoir utiliser/travailler avec les arguments Merci.
En passant @PengouinPdt mon code (doit être) est pourri check moi çà s’il te plaît Bon soir, Merci ! Il manque les exit 0
, exit 1
… et autres, de checker le file après modif du SOA… (peut-être, entre autres).
Salutations,
Romain