ADMIN
2021
08
2021-08-01T12:00:00
Hochverfügbarkeit und Monitoring
PRAXIS
056
Security-Tipp
Sicherheit
Zertifikaten
Let's-Encrypt-Zertifikate mit dynamischen DNS-Updates
Auf dem neuesten Stand
von Dr. Matthias Wübbeling
Veröffentlicht in Ausgabe 08/2021 - PRAXIS
Die Nutzung von Let's-Encrypt-Zertifikaten ist längst gang und gäbe. Im Handumdrehen erstellt der "Certbot" dabei regelmäßig neue Zertifikate für den Web- oder Mailserver. Dabei überprüft Let's Encrypt die Domain mittels HTTP, also mit hinterlegten Dateien auf dem Webserver selbst. Komfortabler und mit der Möglichkeit, auch Wildcard-Zertifikate auszustellen, geht es allerdings mit den passenden DNS-Einträgen.

Ein großer Nachteil – und ein Grund, warum immer noch viele Firmen auf kostenpflichtige Zertifikate zurückgreifen – ist das Fehlen von Wildcard-Zertifikaten bei HTTP-basierter Überprüfung. Schon einige Jahre unterstützt Let's Encrypt [1] aber nun schon die Überprüfung mittels DNS und damit auch die häufig gewünschte Flexibilität. Die tatsächliche Umsetzung gestaltet sich jedoch mitunter schwierig, abhängig vom DNS-Anbieter beziehungsweise der eingesetzten Technik. Ein manueller Eingriff zum Setzen der DNS-Einträge alle 60 Tage ist mitunter sehr unpraktisch und widerspricht dem Komfort sich automatisch aktualisierender Zertifikate.
Um DNS für die Überprüfung einer Domain nutzen zu können, setzt Let's Encrypt auf TXT-Einträge im DNS. Für die Domain "it-administrator.de" wird dieser Eintrag unter der Domain "_acme-challenge.it-administrator.de" konfiguriert und dort ein Token zur Überprüfung hinterlegt. Nach der Überprüfung ist der Token wertlos und kann wieder aus dem DNS entfernt werden. Diese Prozedur ist bei jeder Aktualisierung, also etwa alle 60 Tage, erneut fällig.
Certbot ermöglicht Ihnen hierbei die dynamische Aktualisierung Ihres selbst gehosteten DNS-Servers mittels DNS-Update und stellt weitere Plug-ins für gängige, hauptsächlich amerikanische DNS-Provider zur Verfügung.
Ein großer Nachteil – und ein Grund, warum immer noch viele Firmen auf kostenpflichtige Zertifikate zurückgreifen – ist das Fehlen von Wildcard-Zertifikaten bei HTTP-basierter Überprüfung. Schon einige Jahre unterstützt Let's Encrypt [1] aber nun schon die Überprüfung mittels DNS und damit auch die häufig gewünschte Flexibilität. Die tatsächliche Umsetzung gestaltet sich jedoch mitunter schwierig, abhängig vom DNS-Anbieter beziehungsweise der eingesetzten Technik. Ein manueller Eingriff zum Setzen der DNS-Einträge alle 60 Tage ist mitunter sehr unpraktisch und widerspricht dem Komfort sich automatisch aktualisierender Zertifikate.
Um DNS für die Überprüfung einer Domain nutzen zu können, setzt Let's Encrypt auf TXT-Einträge im DNS. Für die Domain "it-administrator.de" wird dieser Eintrag unter der Domain "_acme-challenge.it-administrator.de" konfiguriert und dort ein Token zur Überprüfung hinterlegt. Nach der Überprüfung ist der Token wertlos und kann wieder aus dem DNS entfernt werden. Diese Prozedur ist bei jeder Aktualisierung, also etwa alle 60 Tage, erneut fällig.
Certbot ermöglicht Ihnen hierbei die dynamische Aktualisierung Ihres selbst gehosteten DNS-Servers mittels DNS-Update und stellt weitere Plug-ins für gängige, hauptsächlich amerikanische DNS-Provider zur Verfügung.
Geheimnis erstellen
Die Möglichkeit dynamischer Updates von DNS-Zonen wurde 1997 im RFC 2136 [2] beschrieben. Dafür benötigen Client und Server einen gemeinsamen Schlüssel zur Überprüfung der gesendeten Informationen, bevor diese in der Zonendatei landen.
Um Ihren DNS-Server – in diesem Artikel gehen wir davon aus, dass Sie einen BIND-Server betreiben – für die Updates von Certbot vorzubereiten, erstellen Sie zunächst ein entsprechendes Geheimnis. Dieses Geheimnis, auch als "Transaction Signatur" (TSIG) bezeichnet, können Sie auf unterschiedlichen Wegen erzeugen. In diesem Fall verwenden wir die für DNSSec bereitgestellten Werkzeuge wie in folgendem Kommando:
dnssec-keygen -TKEY -a ED25519 -n HOST itadmin
Die Ausgabe sieht dabei nicht intuitiv aus. Tatsächlich können Sie dieser aber den Namen der Datei entnehmen, in der das Schlüsselmaterial abgelegt wurde. Nun können Sie den Schlüssel aus der Datei "Kitadmin.+015+63762.key" auslesen, es ist die längste der angezeigten Zeichenketten. Diesen Schlüssel fügen Sie der BIND-Konfiguration in "/etc/named.conf" hinzu:
key "itadmin" {
algorithm ed25519;
secret "hMrn1yZF9LKdi...7O4=";
};
Anschließend müssen Sie in der Zonendatei der entsprechenden Domain den Eintrag übernehmen. Damit konfigurieren Sie die Updatemöglichkeit und begrenzen diese auf den TXT-Eintrag der angegebenen Subdomain:
zone "it-administrator.de"
{
update-policy { grant itadmin name \_acme-challenge.it-administrator.de. txt; };
};
Jetzt erstellen Sie noch eine Datei für Certbot, die alle notwendigen Informationen für das dynamische Update enthält. Diese können Sie etwa unter "/etc/ letsencrypt/rfc2136-auth.ini" ablegen und den folgenden Inhalt an Ihre Umgebung anpassen:
dns_rfc2136_server = 213.133.106.251
dns_rfc2136_port = 53
dns_rfc2136_name = itadmin
dns_rfc2136_secret = hMrn1yZF9LKdi...7O4=
dns_rfc2136_algorithm = ed25519
Um nun Ihr Let's-Encrypt-Zertifikat auszustellen, müssen Sie sicherstellen, dass das entsprechende Plug-in auf Ihrem System installiert ist. Unter Ubuntu finden Sie dieses etwa im Paketrepository mit dem Namen "certbot-dns-rfc2136". Notfalls können Sie auch auf den Docker-Container von Let's Encrypt zurückgreifen. Für die Ausstellung mit dem Docker-Container rufen Sie folgendes Kommando auf oder Sie übernehmen die Argumente entsprechend, wenn Sie kein Docker verwenden möchten:
docker run -it --rm -v /etc/letsencrypt:/etc/letsencrypt certbot/dns-rfc2136 certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/letsencrypt/rfc2136-auth.ini --server https://acme-v02.api.letsencrypt.org/directory -d it-administrator.de -d *.it-administrator.de
Achten Sie darauf, dass Sie sowohl die Wildcard-Domain als auch die Domain selbst bei Ihrem Aufruf angeben. Ansonsten werden nur die Subdomains im Zertifikat hinterlegt, die darüber liegende Domain jedoch nicht.
Anschließend können Sie Ihr ausgestelltes Zertifikat wie gewohnt in Ihren Webserver einbinden und automatisch erneuern lassen. Bei der Nutzung von Docker können Sie jedoch nicht ohne weiteres die Pre- und Post-Hooks von Certbot verwenden, die Ihnen etwa Ihren Webserver neu starten. Das müssen Sie in Ihrem Cronjob also einfach im Nachgang separat erledigen lassen.
DNS-Provider-Updates
Die Entwickler von Let's Encrypt bieten einige Plug-ins für DNS-Provider an. Darunter finden Sie etwa OVH, Cloudflare, Google, Amazon oder Digital-Ocean. Sie können aber auch einen anderen Provider verwenden, der Ihnen eine entsprechende API zur Verfügung stellt. Als Beispiel an dieser Stelle dient uns Schlund Technologies.
Der Registrar und DNS-Provider stellt seinen Kunden eine API für DNS-Updates zur Verfügung. Als Kunde müssen Sie dafür eine separate Nutzungsvereinbarung abschließen. Anschließend erhalten Sie Zugang zur Dokumentation und weiteren Ressourcen für Entwickler sowie separate Zugangsdaten zur XML-API.
Bei der Entwicklung eines Certbot-Plug-ins können Sie auf die weitreichende Dokumentation von Let's Encrypt zurückgreifen [3]. Für Schlund Technologies hat Ihnen Philipp Müller alias "couchtyp" die Arbeit bereits abgenommen [4]. Er bietet in dem Repository auch ein Dockerfile an, mit dem Sie einfach einen eigenen Container erstellen können. Dafür führen Sie folgendes Kommando aus:
docker build --pull -t certbot/dns-schlundtech .
Wenn Sie die Credentials unter "/etc/lets-encrypt/schlundtech.ini" hinterlegen, gelingt Ihnen die Zertifikaterstellung mit folgendem Kommando:
docker run -it --rm -v /etc/letsencrypt:/etc/letsencrypt certbot/ dns-schlundtech certonly --server https://acme-v02.api.letsencrypt.org/directory -a dns-schlundtech --dns-schlundtech-credentials /etc/letsencrypt/ schlundtech.ini -d it-administrator.de -d *.it-administrator.de
Auch hier bleibt bei der Nutzung mit Docker allerdings die Problematik mit den Post-Hooks bestehen.
# credentials.ini
dns_schlundtech_user = 123456
dns_schlundtech_password = it-administrator
dns_schlundtech_context = 10
Fazit
Die Nutzung von Let's Encrypt zur Absicherung von Internet-Kommunikation ist längst Standard. Der Security-Tipp hat gezeigt, wie Sie die komfortable Überprüfung der Domain mittels DNS vornehmen. Dabei konnten wir für einen selbstgehosteten BIND-DNS-Server und für einen DNS-Provider mit eigener API dank dynamischer DNS-Updates auch Wildcard-Zertifikate ausstellen.
(dr)