Ci-dessous, les différences entre deux révisions de la page.
Both sides previous revision Révision précédente Prochaine révision | Révision précédente Prochaine révision Both sides next revision | ||
si:acme-dns [2018/12/25 17:03] pitchum |
si:acme-dns [2018/12/25 17:28] pitchum [Certificat Wildcard avec dehydrated] |
||
---|---|---|---|
Ligne 24: | Ligne 24: | ||
===== Configurer Bind pour les mises à jour dynamiques ===== | ===== Configurer Bind pour les mises à jour dynamiques ===== | ||
+ | Techniquement il est possible de configurer directement la zone parinux.org pour accepter les changements dynamiques, avec la commande //nsupdate// par exemple. Mais quand on active cette option alors Bind réorganise complètement le fichier zone à sa façon illisible. Et ça c'est pénible pour les adminsys. Et puis en plus ce fichier zone ne doit plus être éditer manuellement comme l'indique la page //man nsupdate// : | ||
+ | |||
+ | > Zones that are under dynamic control via nsupdate or a DHCP server should not be edited by hand. Manual edits could conflict with dynamic updates and cause data to be lost. | ||
+ | |||
+ | Donc le plus simple c'est créer une délégation DNS uniquement pour //_acme-challenge.parinux.org//. C'est ce qui est suggéré dans la [[https://github.com/lukas2511/dehydrated/wiki/example-dns-01-nsupdate-script|doc de dehydrated]]. | ||
+ | |||
+ | Donc pour cela dans le fichier de zone de //parinux.org// ajouter l'enregistrement suivant (et penser à modifier le serial dans le foulée) : | ||
+ | |||
+ | <code> | ||
+ | _acme-challenge NS ns1.parinux.org. | ||
+ | </code> | ||
+ | |||
+ | Créer une clef secrète qui ne sera partagée qu'entre le serveur Bind et les machines ayant besoin de publier des enregistrements DNS dynamiquement. | ||
+ | |||
+ | <code> | ||
+ | cd /tmp | ||
+ | dnssec-keygen -r /dev/urandom -a hmac-sha512 -b 128 -n HOST rndc-acme | ||
+ | </code> | ||
+ | |||
+ | La clef secrète se trouve dans un fichier nommé ///tmp/Krndc-acme.xxxx// et ressemble à quelque chose comme ça : //cZh3zV8Uf7aIOxjv8ZA8iA==//. | ||
+ | Ensuite, créer un fichier ///etc/bind/rndc-acme.key// : | ||
+ | |||
+ | <file /etc/bind.rndc-acme.key> | ||
+ | key "rndc-acme" { | ||
+ | algorithm hmac-sha512; | ||
+ | secret "cZh3zV8Uf7aIOxjv8ZA8iA=="; | ||
+ | }; | ||
+ | </file> | ||
+ | |||
+ | Dans le fichier ///etc/bind/named.conf.local// déclarer cette nouvelle zone et inclure le fichier de la clef secrète : | ||
+ | |||
+ | <code> | ||
+ | include "/etc/bind/rndc-acme.key"; | ||
+ | zone "_acme-challenge.parinux.org" { | ||
+ | file "/var/cache/bind/_acme-challenge.parinux.org.zone"; | ||
+ | type master; | ||
+ | masterfile-format text; | ||
+ | allow-update { key "rndc-acme"; }; | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | Il faut maintenant peupler un minimum cette zone dynamique (un SOA et un NS). Créer le fichier ///var/cache/bind/_acme-challenge.parinux.org.zone// comme ceci : | ||
+ | |||
+ | <code> | ||
+ | _acme-challenge.parinux.org. IN SOA troll4.parinux.org. admin.parinux.org. ( | ||
+ | 2018112200 | ||
+ | 86400 | ||
+ | 300 | ||
+ | 1814400 | ||
+ | 86400 | ||
+ | ) | ||
+ | NS troll4.parinux.org. | ||
+ | </code> | ||
+ | |||
+ | Permettre à Bind de modifier ce fichier : | ||
+ | |||
+ | <code> | ||
+ | sudo chown bind: /var/cache/bind/_acme-challenge.parinux.org.zone | ||
+ | </code> | ||
+ | |||
+ | Puis ''%%sudo systemctl restart bind9%%''. | ||
+ | |||
+ | Maintenant on peut tester la publication dynamique. On peut déjà vérifier qu'on peut manuellement ajouter/modifier/supprimer l'enregistrement DNS depuis troll4 elle-même (par la suite il faudra pouvoir faire le même chose depuis un autre machine ayant la clef secrète). | ||
+ | |||
+ | <code> | ||
+ | sudo nsupdate -k /etc/bind/rndc.key <<EOF | ||
+ | server 127.0.0.1 | ||
+ | delete _acme-challenge.parinux.org | ||
+ | update add _acme-challenge.parinux.org 8000 IN TXT "coucou tout va bieng ?" | ||
+ | send | ||
+ | EOF | ||
+ | </code> | ||
+ | Puis | ||
+ | |||
+ | <code> | ||
+ | dig +short _acme-challenge.parinux.org | ||
+ | </code> | ||
+ | Voilà. Ça, c'est fait. | ||
+ | |||
+ | ===== Certificat Wildcard avec dehydrated ===== | ||
+ | |||
+ | Sur la machine ayant besoin d'un certificat Wildcard (ici la machine xmpp-1 hébergeant ejabberd) créer le fichier ///etc/parinux/rndc-acme.key// contenant la même clef secrète que sur le serveur Bind : | ||
+ | |||
+ | <file etc/parinux/rndc-acme.key> | ||
+ | key "rndc-acme" { | ||
+ | algorithm hmac-sha512; | ||
+ | secret "cZh3zV8Uf7aIOxjv8ZA8iA=="; | ||
+ | }; | ||
+ | </file> | ||
+ | |||
+ | <code>sudo apt install dehydrated dnsutils ntp</code> | ||
+ | |||
+ | Temporairement, le temps de tester la configuration on va utiliser le serveur ACME de staging. | ||
+ | |||
+ | <code>echo 'CA="https://acme-staging.api.letsencrypt.org/directory"' | sudo tee /etc/dehydrated/conf.d/staging.sh</code> | ||
+ | |||
+ | On configure dehydrated pour faire de la validation DNS-01 dans le fichier ///etc/dehydrated/conf.d/auth-dns.conf// : | ||
+ | |||
+ | <file> | ||
+ | CHALLENGETYPE="dns-01" | ||
+ | HOOK=/etc/dehydrated/hook-custom.sh | ||
+ | </file> | ||
+ | |||
+ | On créé le script hook ///etc/dehydrated/hook-custom.sh// : | ||
+ | |||
+ | <file> | ||
+ | #!/usr/bin/env bash | ||
+ | |||
+ | set -e | ||
+ | set -u | ||
+ | set -o pipefail | ||
+ | |||
+ | NSUPDATE="nsupdate -k /etc/parinux/rndc-acme.key" | ||
+ | DNSSERVER="192.168.2.55" # l'IP de troll4, le serveur DNS master | ||
+ | TTL=300 | ||
+ | |||
+ | case "$1" in | ||
+ | "deploy_challenge") | ||
+ | printf "server %s\nupdate add _acme-challenge.%s. %d in TXT \"%s\"\nsend\n" "${DNSSERVER}" "${2}" "${TTL}" "${4}" | $NSUPDATE | ||
+ | ;; | ||
+ | "clean_challenge") | ||
+ | printf "server %s\nupdate delete _acme-challenge.%s. %d in TXT \"%s\"\nsend\n" "${DNSSERVER}" "${2}" "${TTL}" "${4}" | $NSUPDATE | ||
+ | ;; | ||
+ | "deploy_cert") | ||
+ | # optional: | ||
+ | # /path/to/deploy_cert.sh "$@" | ||
+ | ;; | ||
+ | "unchanged_cert") | ||
+ | # do nothing for now | ||
+ | ;; | ||
+ | "startup_hook") | ||
+ | # do nothing for now | ||
+ | ;; | ||
+ | "exit_hook") | ||
+ | # do nothing for now | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | exit 0 | ||
+ | </file> | ||