DANE / DNSSEC signatures : valid or not valid?

Tags: #<Tag:0x00007f8a422c6630> #<Tag:0x00007f8a422c64c8>

Je connais « 2 » commandes qui sont :

18:09:22 root@lab3w:~ # dig +trace +noadditional DS ipv10.net @dns.google | grep DS
; <<>> DiG 9.11.5-P4-5.1+deb10u7-Debian <<>> +trace +noadditional DS ipv10.net @dns.google
net.                    86400   IN      DS      35886 8 2 7862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D 8BD973EE
net.                    86400   IN      RRSIG   DS 8 1 86400 20220823050000 20220810040000 20826 . mcuJX9FhvHLPsJIoGfdczfv3/LSyM9JyuGw3/b6xGZIh6QRYJ1xuNhv8 7NKjL+L3/efOUvQjOXGG6kHnB5ZuVSWY5fPtTdywfB4qk7jL5O2s/WTU zhYndA+HcQC+up4xMTFO7j3Sx/rsv7odSdARV/XEQkRfHQYEzcT2U1F2 O8/P51vwZCpAoPpOMhg8DwdBXLg69O7m/ONge44KJTTT2LRg5slPorC9 XOsz/LH0L/qSQk7KvU3SNvM0K5XBDD6awpoHdizXTKG8YWDMLMP+uMd5 awd8wf9CKOqORszWoU3XB/KF5jNvrcf/P02pxfOJbBPBU9risStU5zrl qQ1lNQ==
ipv10.net.              86400   IN      DS      676 7 2 BBCD3C05E864FC1786693F9BD74C21C5493FFA79DB788892EBB3F1B4 D78840EE
ipv10.net.              86400   IN      DS      53469 7 2 6FA0F4701C34878BA242E3F8253B96B503A9A32C63D580DCE300F1DA EDE68466
ipv10.net.              86400   IN      RRSIG   DS 8 2 86400 20220816060836 20220809045836 4403 net. EbMVW3G2SN7cg9XnWsZcHulchzMQdyEpq1c4leBCZDjoTM4y0ETbkqiJ AJFWAXz2YsAtCjPg9Jjp+sosJYKBBhDY6B3tSllAA0h/6Yxrd+simHu6 iYHQzqVDLJZ79t4+7RV61Tipe9Q3B8AAjWcf2GozDVtxWjAioN0s2JHH mdPePpMp2aBHYu+ZPzCY+Mog1tkyBilm9F/a9qCI4Wp4MA==

et celle-ci

18:10:40 root@lab3w:~ # dig DNSKEY ipv10.net @dns.google +multiline

; <<>> DiG 9.11.5-P4-5.1+deb10u7-Debian <<>> DNSKEY ipv10.net @dns.google +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42990
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;ipv10.net.             IN DNSKEY

;; ANSWER SECTION:
ipv10.net.              3600 IN DNSKEY 257 3 7 (
                                AwEAAd6ev3QX+36mQA5nyJ4+OoDRxSBbR8JpVVyzDtoy
                                zjZKHYgjbc8vfkhFmMJuF7ks5T2/91GqTDTyYB8/AoVH
                                joT4xHpQYAaXFBDWzh/2UNpk73SMHcx2kzLraRq/tqZJ
                                cQ8c5y4KR73bMoZ6001VBskDCLHcX+DIJjRJxDzwrVAc
                                ycDziT3Zc+RW0skUqXQZNNotrmSX0L5P5mR8md7kBPT1
                                pKlITy+sfGbC1UyeBIyu+wErrPArnNJVj9KZ9wENf1O0
                                XQqpGZVt27c3wyIT58rYa7brj6zeZ8XJn0JCkZYhUw9y
                                BxDFAM1RWMZHDTAYAV4F6TiIY2Os4jPPX0nZlEHj2AAz
                                Gn6OPmWSbq18aofiXh1dMXNHtS05sh57vl5h2v656cDX
                                Go4/xrGALmWhnV+5Nx8AEiUG0WVGD6h7k0Jbse0BHYmo
                                VdntnvHujAhoQDo/cZtmKKTr8cVTqgJpUfK7vZ44YItV
                                b0gVcI09Es0ipo0M0jtS8Vy4O0OhTd6JnYmr0ZU+4QBS
                                OM1LEzl05H58xCbzbcmNszeolYd8NhafJ289Ouq2lTPJ
                                9K6A0B/yAIUlsAmNO+/IUu+8+D3PkQk/yqxcPUgCnRx4
                                5oulnxllyjuJvdI9fveKzSqgSxI+Ka2OjYTIAopcTPaP
                                8SgJRcPx6h2QbdOJgKlCIIencBtB
                                ) ; KSK; alg = NSEC3RSASHA1 ; key id = 676
ipv10.net.              3600 IN DNSKEY 256 3 7 (
                                AwEAAbVhj5ZXOGjIzfLZdMPvzzHkXxd3aB9i2EFN+Vo+
                                TklTQJMjWInK4U+2h1Zvhalg8o6CPK4bijR4fD8+f53D
                                x5l53vtym65bX8xV8T9rQ/7x1iNXXNtpgBT52wJPERhq
                                VfzuBzog/ydltCkdqdxdQByNqqvbHSEkiw0/8Xp8CjSK
                                ah9UA6EjxrcjGbbWQYv5UNAMKGYVJ5maHcMJVNqXrOu4
                                JVsH1wzYGxBiG5Uar3aB2ajO7N/FWQIY8i+p8mODTkqp
                                i6zqSbs9avJSGtl3n4HW98jN5zu4zBMI/t3CL2RSiuRj
                                2HGr2otAj+nugv3fioMEYHoXWMmHvAAiw5XRLmk=
                                ) ; ZSK; alg = NSEC3RSASHA1 ; key id = 53469

;; Query time: 84 msec
;; SERVER: 2001:4860:4860::8844#53(2001:4860:4860::8844)
;; WHEN: mer. août 10 18:10:48 CEST 2022
;; MSG SIZE  rcvd: 846

:slight_smile:

Bon…

19:36:00 root@dc:~ $ dig SOA zw3b.blog @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600
19:37:56 root@dc:~ $ dig SOA zw3b.fr @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600
19:38:00 root@dc:~ $ dig SOA zw3b.net @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600
19:38:06 root@dc:~ $ dig SOA zw3b.site @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600
19:38:17 root@dc:~ $ dig SOA zw3b.tv @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600
19:38:24 root@dc:~ $
19:38:25 root@dc:~ $ dig SOA lab3w.com @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600
19:38:35 root@dc:~ $ dig SOA lab3w.fr @45.90.28.0 +short
19:38:42 root@dc:~ $ dig SOA lab3w.fr @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600
19:38:48 root@dc:~ $ dig SOA lab3w.fr @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600
19:38:50 root@dc:~ $ dig SOA ipv10.net @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600
19:38:59 root@dc:~ $ dig SOA ipv01.net @45.90.28.0 +short
dns.lab3w.fr. hostmaster.lab3w.fr. 2022081002 21600 3600 604800 3600

maintenant :wink: ?

Des fois - Le plugin me signale que j’ai bien DNSSEC mais que mon champ DANE est invalide !
Et pourtant sur mes WWW des sites ZW3B je n’ai pas installé DANE (puisque j’ai confiance en mon AC (Authority de Certification SSL/TLS) Gandi.net)

DNSSEC check requête dig sur le domaine :

20:19:10 root@dc:~ $ dig DNSKEY zw3b.fr @45.90.28.0

; <<>> DiG 9.10.3-P4-Debian <<>> DNSKEY zw3b.fr @45.90.28.0
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29404
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;zw3b.fr.                       IN      DNSKEY

;; ANSWER SECTION:
zw3b.fr.                1127    IN      DNSKEY  256 3 7 AwEAAZ9XHB21roHcTsOoiuo51VeJi1iFPR3o3TtnHKonN8hyFgPYCgiy ruTrmgPRb2DQvzczZGrA4Ygm1UL+qkpfj55R9Ws/M3tIVwKe5bjqwV8M U/niccfRSjPQj9eETeLO1BFN8Fz5dDEjmCjtB0KnPBn04LJhhPfSoTpD 0JT4MuqNb8zofhSoUq/Jff6RaTifIKJC1f65mDnVewG02OMvvORW5pZw AYWe8m1ixcGM6Yt55fSjX7LgsrJ0KQ8yhVT7Bk22TXLHKXgSZ+Uk7smH Dc95SxLMDQ+rvjrQPgPECzm2Qr7rq1+zhY9A+30QBQqgiaDQf4YNqsaa ZRBSuxawds8=
zw3b.fr.                1127    IN      DNSKEY  257 3 7 AwEAAcwEAtdtQp7+WV/UZk4+XZKL0czUbw8Ta46358ttNBCyiLPzWxt8 5jkkGo3ittGku/sbJW60GQmdS05mpJ8HBoVDGOCFK1MO800Qdg5ISI4a wRM08IM0nxvdZbYGpPW1NOI6K4loXJOVYXcCbeSRfVcHELbk+7u9wnsg iFnyWxKhsPaQ2YMYIRkSmJl7XTEf3AWoSCbxzDrMiEnaoL1iz07jDwhu tT5bdd936sJm17Jlq6UqbYtAMs/+3C0QYWeW43xO5v44lnEFCTlZ/OSt nNtia+yFTyFWFjErzm3Pad8ckwaCoeZkgbR43ICt6h12NM/RFk3FGkoJ K5Qb4K9MRii7LNUrfzeOCkoKxQtu89KwBEvKcW2+SB8/LUUI5E9cqw2b eQiQYUR6AdaqtCosUFC2Uc+C1xX92eGh6m8XZ0orZfDD99VDYyiD0CeE Xq/4ANO5B9qG7swS2Dc389CvaH3dfl2wfQESjDqK1+yAXxYsSeK5Yfdp M8UQWBqC7NrR3etXIo4coOPprEonIma7uNqNph2WoCtGFtqT1Rurq83F hC7d+lPSxCrKL5wxWjkLaZIWR4hnNN4Q2TSpQfSM7bUCd3WItz7dOCvN rPoWPG8BsMx4XSzkSpy8SoI6Aks5V4KXev37NOQxyIYB9Mu5uTU//fh/ 3JTVwn/wA0Xj5I6B

;; Query time: 84 msec
;; SERVER: 45.90.28.0#53(45.90.28.0)
;; WHEN: Wed Aug 10 20:19:13 CEST 2022
;; MSG SIZE  rcvd: 844

DNSSEC check requête dig sur l’entité « www » :

20:19:13 root@dc:~ $ dig A www.zw3b.fr @45.90.28.0 +dnssec

; <<>> DiG 9.10.3-P4-Debian <<>> A www.zw3b.fr @45.90.28.0 +dnssec
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60395
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; QUESTION SECTION:
;www.zw3b.fr.                   IN      A

;; ANSWER SECTION:
www.zw3b.fr.            3106    IN      CNAME   web.zw3b.fr.
www.zw3b.fr.            3106    IN      RRSIG   CNAME 7 3 3600 20220909145626 20220810145626 16479 zw3b.fr. eJPNWZq5akdlFvImJGEkzv1nm9nlSKHcyOzc7Zbff4MPuplKcRM0ODfj sNfaDEkJKnvN0FT391c7tf61hJiqr/SDyvDPthwAVNjguxh9daxyDYrk 8Zq19GNAagzvCNyjg43tdJi+sdK9kBgSOCADIXdPJQnr+PhszTWU0ucC mQutGrOjsDYrNG84uOv1QzYeaVNof2X6YgwhW9eF2yzjHmkGRs/G5Dt5 Y3zyTmdAYYvIoZ/mKIjFT7iySg+YEc4S8mNxmlRmvf2sWMeyP9RE97ua SHpJwZGtVXfdBEy/tkXlxyYt9ccKJlKcHguHpF98/9NYSJimeB+Y6lB4 iZ8/JA==
web.zw3b.fr.            3154    IN      A       83.159.31.116
web.zw3b.fr.            3154    IN      A       158.69.126.137
web.zw3b.fr.            3154    IN      RRSIG   A 7 3 3600 20220909145626 20220810145626 16479 zw3b.fr. guyDUFqXB2HeVzOvG3OUy51qoEdruUCLwEeQQw0Z7HXr9/PUJ9pi5JzH rYXXAjELAvoqU9xArvqpVPLQZzRiooxqSVsSW7+Ik631Sis7yHb0y/4K b2PdRUpkJ031rmAWzSEMsrUJz1HAKyWva+6/Yb/2/His5YrRr6uDpZPm fWhNLDvMD8A1DN20i4oSwGqYnwO2AbITbPoLMjJ/Nw6W/QjedpvJMmAG nGGTJAB52R5owlE19G4Tefb3NNBXh7djW7H7FACWdhLY97dQHYkVfWPM 3OZPxFopnRn9frEnD9JJv7ZtC0RqwILB+Jmu8UJcPFDEtHOhpcf9v70x v99nKw==

;; Query time: 48 msec
;; SERVER: 45.90.28.0#53(45.90.28.0)
;; WHEN: Wed Aug 10 20:19:40 CEST 2022
;; MSG SIZE  rcvd: 680

DANE check requête dig sur l’entité « www » (il n’y en a pas) :

20:20:19 root@dc:~ $ dig TLSA _443._tcp.www.zw3b.fr @45.90.28.0 +short

J’ai installé DANE seulement sur mes certificats signés par mon AC LAB3W.
Pour voir si les moteurs de recherche référenceraient mieux mes sites en HTTPS.

Mon AC n’est pas dans les navigateurs web de la planète - Il faut l’installer soit-même dans les Autorité de Certification manuellement dans son navigateur/ordinateur.

Par exemple :

DANE check requête dig sur des entités (il y en a) :

19:42:44 root@dc:~ $ dig TLSA _443._tcp.howto.zw3b.fr @45.90.28.0 +short
3 0 1 1DAAC6D52BDDF73386B62C04B1657A818AEE7D8987D53914C8542DBC BC476461
19:54:12 root@dc:~ $ dig TLSA _443._tcp.www.ipv10.net @45.90.28.0 +short
3 0 1 C93EAB23EAA8A4475C057383654119A806BF854B8EEFF3D54808CA3B F3B9DA39

Bonne soirée.

Salutations,
Romain

zw3b-api-client-v7.1.2

:slight_smile:

Je viens de m’apercevoir un truc bizarre :roll_eyes: - Plugin FireFox « DNSSEC/DANE Validator (Validate DNSSEC & DANE using DoH)
Je ne suis pas en HTTPS et pourtant je vois dans la barre des tâches à droite la clef verte (DNSSEC et DANE) à la place du cadenas vert (DNSSEC) - Certes j’ai bien ma valeur TLSA sur HTTPS mais bon.

16:58:28 root@lv1.dc1:~ # dig TLSA _443._tcp.api.zw3b.fr +short
3 0 1 1DAAC6D52BDDF73386B62C04B1657A818AEE7D8987D53914C8542DBC BC476461

Je viens d’apercevoir une chose :wink:

Les signatures #DNSSEC sont valides pour 1 mois.

On peut créer une politique DNSSec personnalisée de cette façon :slight_smile:

Screenshot-2022-09-12-at-16-00-10-debian-fr.org-DNSViz

Screenshot 2022-09-12 at 16-21-14 zw3b.fr DNSViz

Il faut que je modifie mon algorithme :slight_smile:

CooL cet outil :

DNSViz est un outil permettant de visualiser l’état d’une zone DNS. Il a été conçu comme une ressource pour comprendre et dépanner le déploiement des extensions de sécurité DNS (DNSSEC). Il fournit une analyse visuelle de la chaîne d’authentification DNSSEC pour un nom de domaine et son chemin de résolution dans l’espace de noms DNS, et il liste les erreurs de configuration détectées par l’outil. Vos commentaires sont appréciés.

:slight_smile:

Bonjour,
j’ai modifié mon Algorithme de DNSSEC (en version 8) - RSA/SHA256.

Screenshot 2022-09-26 at 12-30-13 zw3b.net DNSViz

Par contre, je ne sais pas comment trouvé la valeur du record DNS NSEC3PARAM (NSEC3 Parameters).

Suis-je obligé de mettre le record NSEC3PARAM si je signe en RSA/SHA256 (algo 8) ?

  • non, n’est-ce pas - il peuvent coexister ?

WikipediA : Domain Name System Security Extensions

RFC 5702: Use of SHA-2 Algorithms with RSA in DNSKEY and RRSIG Resource…
RFC 5155: DNS Security (DNSSEC) Hashed Authenticated Denial of Existence

  1. J’ai lu qu’en re-signant la zone régulièrement çà permettait de changer de « salt » dnssec-signzone -3 <salt> pour pas qu’un pirate puisse arriver à ses fins avant le renouvellement du hash.
  2. J’ai lu aussi que NSEC(3PARAM) permet de valider les réponses négatives.

A DNSSEC validator that implements RSA/SHA-2 MUST be able to validate negative answers in the form of both NSEC and NSEC3 with hash algorithm 1, as defined in RFC5155.

Merci à vous.


En plus,

Donc, il faut aussi que je re-signe toutes mes zones tous les 29 jours - J’hésite entre la date des fichiers.zone ou la date du record SOA :slight_smile: Et vous :yum: !?

Romain

Un petit script for the fun :slight_smile: que je suis entrain d’écrire - si çà peut aider, motiver :wink:

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 ».

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

#####-------------------------- 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 :smiley:

NdMoi-même : 20220927 - Infos :slight_smile:

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 :slight_smile:
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 :

  1. il faut mettre « sed -i » à la place de « sed » et décommenter la ligne
  2. et décommenter la ligne « dnssec-signzone »
  3. et décommenter la ligne « /etc/init.d/bind9 reload|restart » en choisissant reload ou restart :wink:

ATTENTION : Le script est fonctionnel - j’ai décommenté les lignes (masquées) du desssus :wink:

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 :slight_smile:

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 :wink: 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 :blush:

Pensée d'aujourd'hui :)

Donc j’ai ajouté l’argument --force pour envoyer la commande manuellement :slight_smile:

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 :slight_smile: Merci.


En passant @PengouinPdt mon code (doit être) est pourri :slight_smile: check moi çà s’il te plaît :star_struck: :relaxed: :joy: 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

:wink:

Sinon je voulais ajouter… je viens de m’apercevoir… que sur le site DNSViz | A DNS visualization tool il me ressorte que l’inception est de quelques secondes de plus que la date de « création / modification » de mon fichier zone.

Du latin inceptio (« commencement »), dérivé de incipere (« commencer »). Nom commun Modifier. Singulier, Pluriel. inception

J’aurais dis/pensé « avalé » pour la définition de « inception » :wink:

J’aime bien celle de Le Larousse « inception » qui consiste à implanter une idée dans les rêves d’un homme.

Bon :

20:58:57 root@lv1.dns:~ # stat /etc/bind/masters/zw3b.net.hosts
  Fichier : /etc/bind/masters/zw3b.net.hosts
   Taille : 14501       Blocs : 32         Blocs d'E/S : 4096   fichier
Périphérique : 803h/2051d       Inœud : 57805127    Liens : 1
Accès : (0644/-rw-r--r--)  UID : (  106/    bind)   GID : (  109/    bind)
 Accès : 2022-09-26 16:09:22.929856183 +0200
Modif. : 2022-09-23 15:05:37.729243212 +0200
Changt : 2022-09-23 15:27:14.451537196 +0200
  Créé : -
20:58:59 root@lv1.dns:~ #

C’est peut-être dû aux milli.nacro secondes après le point dans les dates de la commande linux stat :

Modif. : 2022-09-23 15:05:37.72924321 2 +0200 - ceux là : 729243212 doit être égal à 4 secondes :blush:

12h05 41sec à la place de 12h05 37sec GMT+0 - CF : zw3b.net | DNSViz (en mettant sa souris sur une des flèche des dernières entitités. - +2-3+0 :confused: bon on est en heure d’été pour moi :roll_eyes:

Buena noché :slight_smile:


Oui, tiens à part en PHP avec usleep je ne connais pas de commande linux pour envoyer/travailler (sur) des microsecondes à la place de secondes avec sleep.

Je t’Aime :sparkling_heart: PHP :blush:

Bonne nuitée :slight_smile: BiZ

En python par exemple :

import time
time.sleep(seconds/1000000.0)
1 J'aime

Bonjour

Tu peux aussi demander à la commande sleep de faire une pause d’une microseconde :

sleep 0.000001    # Pause de 1 microseconde

Tu peux aussi donner en paramètre à la commande sleep
une valeur en virgule flottante spécifiée en notation scientifique :

sleep 123456e-9   # Pause de 123 microsecondes et 456 nanosecondes

Voir la page du manuel de la commande sleep

man sleep

dans laquelle tu trouveras l’extrait suivant :

qui te propose d’aller lire la page web suivante : https://www.gnu.org/software/coreutils/sleep
ou/et d’entrer la ligne de commande suivante :

info '(coreutils) sleep invocation'

Mais pour pouvoir utiliser la commande info il faudra que le paquetage info ait été installé.

1 J'aime

J’ai modifié mon script - commentaire 8 :slight_smile:

Super script - J’en suis fière :rofl: J’ai appris pleins de choses !

J’ai ajouté l’argument --force et les arguments -d pour le "nom de la zone " et -f pour le « fichier de la zone ». Et j’ai mis les variables du script en minuscules pour ne pas les confondre avec les variables d’environnement (qui sont en majuscule), comme me l’a conseillé @MicP :slight_smile:

Comme çà c’est mieux !

Merci encore pour votre aide, la communauté Debian-Fr.org :sparkling_heart:

Salutations,
Romain

Tu peux aussi faire très simplement des additions/soustractions avec la commande date :

michel@deb114x:~$ date                             # date actuelle
mer. 28 sept. 2022 19:17:41 CEST
michel@deb114x:~$ 
michel@deb114x:~$ date -d "+1 month"               # date actuelle + un mois
ven. 28 oct. 2022 19:17:51 CEST
michel@deb114x:~$ 
michel@deb114x:~$ date -d "+1 month - 1 day"       # date actuelle + un mois moins un jour
jeu. 27 oct. 2022 19:18:32 CEST
michel@deb114x:~$ 
michel@deb114x:~$ date -d "+1 month" +"%Y-%M-%d"   # date actuelle + un mois formatée selon mon besoin
2022-19-28
michel@deb114x:~$ 

Ah oui bien sûr … comme « chez moi » en PHP :slight_smile:

Heuresement :smiley:

Bonne soirée à vous mesdames, mesdemoiselles, messieurs.

Merci !

:wink:

j’aime bien celle-ci :slight_smile:

20:16:29 root@lv1.dns:~ # date -d '2022-02-28'
lundi 28 février 2022, 00:00:00 (UTC+0100)
20:16:30 root@lv1.dns:~ # date -d '2022-02-28 +1 month'
lundi 28 mars 2022, 00:00:00 (UTC+0200)

Style date('I', $mktime) en PHP :slight_smile: → winter or summer :slight_smile: truc à la c** :wink:

:slight_smile:

La commande info donne vraiment beaucoup plus d’informations que la commande man sur les possibilités de la commande date et on y trouve beaucoup d’exemples.

Ok… :slight_smile: super cooL ! merci :slight_smile:

J’ai fais un « tar.gz » de mon script : dnssec-sign-zones comme on me l’a conseillé sur https://www.developpez.net en ajoutant le code - (à la place de mettre un lien vers le « commentaire 8 » de cette discussion :wink:
:slight_smile:

Bonne journée.

NdMoi-même pour récupérer le fichier :slight_smile:

wget http://www.zw3b.site/pub/dnssec-sign-zones.tar.gz

NdMoi-même pour décompresser le fichier :slight_smile:

# tar xzvfp dnssec-sign-zones.tar.gz
dnssec-sign-zones.bash
dnssec-sign-myzones.bash
dnssec-sign-zones.txt

Salutations,
Romain

Bonjour,

Comme beaucoup d’entre nous, j’ai plusieurs fichiers de zones à vérifier - j’ai ajouté/créé un autre script « qui vérifie plusieurs zones DNSSEC » et qui au cas où une des zone DNS est modifiée et seulement dans ce cas qui redémarrait, rechargerait le serveur DNS.

Sans trop connaître les sortie de commandes (j’ai opté pour un numéro « retour status » 150).

J’ai trouvé cette page : Linux bash exit status and how to set exit status in bash → paragraphe « List of common exit codes for GNU/Linux » qui explique comment faire et les valeurs de sortie bash.

Le code (c’est celui-ci à mettre en « crontab »):

# cat /root/dnssec-sign-myzones.bash

#!/bin/bash
#######################################################################
# Author : O.Romain.Jaillet-ramey (orj+bash+dnssec (at) lab3w.fr)
# Date Create : 20221005
# Date Modified : 20221005
# Desc : Checks several DNSSEC zones and restarts the DNS server
#######################################################################

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

#month_more_1m=$((60 * 60 * 24 * 30))

#####-------------------------- CONFIG ----------------------------#####


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

}

# for restart or not restart DNS serveur
status=()

restart_server_dns=0

#------------------------------------------------------------------

script_desc

#------------------------------------------------------------------

#------------------------------------------------------------------
# Zone DNS SEC -> algorithm 8 = RSA SHA 256
#
# dnssec-keygen -a RSASHA256 -b 1024 -n ZONE zw3b.net
# dnssec-keygen -a RSASHA256 -f KSK -b 2048 -n ZONE zw3b.net
#
#------------------------------------------------------------------

domains_list="zw3b.fr zw3b.tv zw3b.net zw3b.site zw3b.blog lab3w.com lab3w.fr"
for domain in ${domains_list}
do
        /root/dnssec-sign-zones.bash -d ${domain} -f /etc/bind/masters/${domain}.hosts -a 8

        status+=( "$(printf "%d\n" $?)" )
done


#------------------------------------------------------------------
# Zone DNS SEC -> algorithm 13 = ECDSA P256 SHA256
#
# dnssec-keygen -a ECDSAP256SHA256 -n ZONE ipv10.net
# dnssec-keygen -a ECDSAP256SHA256 -f KSK -n ZONE ipv10.net
#
#------------------------------------------------------------------

domains_list="ipv10.net ipv01.net"
for domain in ${domains_list}
do
        /root/dnssec-sign-zones.bash -d ${domain} -f /etc/bind/masters/${domain}.hosts -a 13

        status+=( "$(printf "%d\n" $?)" )
done


#------------------------------------------------------------------
# Verify status return for restart or not restart DNS server
#------------------------------------------------------------------

for code in "${status[@]}"; do

        #echo "Code : ${code}"

        if [ ${code} -eq 150 ]; then
                restart_server_dns=1
        fi
done

#exit

#------------------------------------------------------------------


echo "#####---------------------------------------------------------"

if [ ${restart_server_dns} -eq 1 ]; then

        /etc/init.d/bind9 restart
        echo "+-> Bind server DNS reloading|restarting"

else
        echo "+-> Bind server DNS do not restarting (no zone update)"
fi

echo "#####---------------------------------------------------------"

exit 0

J’ai modifié le script ("dnssec-sign-zones.bash" en commentaire 8) en ajoutant plusieurs répertoires de clefs selon les algorithmes de création DNSSEC et une getopts « -a 8|13 » pour envoyer le bon algorithme/répertoire de clefs.

Testez le retour du script en exécutant la commande /root/dnssec-sign-myzones.bash en changeant les noms de domaine par les vôtres.

Via la « crontab » pour vérifier tous les jours à minuit :

# +---------------- minute (0 - 59)
# |  +------------- hour (0 - 23)
# |  |  +---------- day of month (1 - 31)
# |  |  |  +------- month (1 - 12)
# |  |  |  |  +---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed
 
# sans envoie d'un mail à l'admin
0 0 * * * /root/dnssec-sign-myzones.bash 1>>/var/log/syslog 2>/dev/null 2>&1
# Avec envoie de mail à l'admin
#0 0 * * * /root/dnssec-sign-myzones.bash | mail -s "[TON_SERVER][DNSSEC]Check Zones" "admin_1@domain.tld, admin_2@domain.tld" 1>>/var/log/syslog 2>/dev/null 2>&1

:wink:

Bonne journée à vous.

PS : Je modifie le « tar.gz » :slight_smile:

Salutations,
Romain

bonjour

Tu pourrais remplacer :

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

#month_more_1m=$((60 * 60 * 24 * 30))

#####-------------------------- CONFIG ----------------------------#####


script_desc() {

        echo "#####---------------------------------------------------------"
        echo "#"
        echo "# DESC : Script to check expiration and sign zone (last day) DNSSEC"
        echo "#"
        echo "# ACTUAL DATE : ${date}"

par :

#####-------------------------- CONFIG ----------------------------#####


script_desc() {

        echo "#####---------------------------------------------------------"
        echo "#"
        echo "# DESC : Script to check expiration and sign zone (last day) DNSSEC"
        echo "#"
        echo "# ACTUAL DATE : $(date "+%Y-%m-%d %T")"

La dernière ligne du script :

exit 0

… n’est pas nécessaire , car si toutes les commandes qui précédaient cette dernière ligne ont pu s’exécuter jusque là sans provoquer d’erreur, c’est que le code d’erreur qui résultera de l’exécution du script sera déjà zéro.

3 J'aime

et pour

tu peux aussi directement utiliser date +%F.

Au final, au lieu de tout ça:

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

Tu peux utiliser date=$(date '+%F %T'):

sputnik@debian:~$ date '+%F %T'
2022-10-05 17:33:47
1 J'aime

Oui, je n’arrivais plus à le retrouver ce F…ameux %F . :slight_smile:

Donc :

        echo "# ACTUAL DATE : $(date '+%F %T')"

Par contre, ce n’est pas une très bonne idée de créer une variable dont le nom est aussi le nom d’une commande.

1 J'aime

@MicP @Sputnik93 oui merci… man ; info date :rofl:

C’était pour avoir une variable « static » de la date pour si le script s’exécuterait en 1, 10min que les dates ne change pas et pour récupérer les valeurs en début de script et les avoir tout au long du script (dans le script « dnssec-sign-zones.bash »)

Et en plus, bon, ok, dans ce script « dnssec-sign-myzones.bash » oui c’est vrai j’aurais dû faire çà ok messieurs :smiley:

oui c’est vrai :smiley:

PS : vous avez remarqués, bon élève que je suis, j’ai mis mes variables en minuscule et je nomme mes scripts BASH (Bourne-Again shell) en « .bash » maintenant :wink:

Oui ok :smiley: - Et mon exit 150 dans le script « dnssec-sign-zones.bash » c’est moche non ? C’était çà la question :smiley: :slight_smile:

Bonne journée :wink:

Salutations,
Romain