inofix.acme-setup
Acme Setup
==========
Dies ist eine Ansible-Rolle zur Einrichtung und Vorbereitung alles Nötigen, um später Zertifikate mit Let's Encrypt zu signieren, d.h. das Einrichten des Benutzers, relevanter Verzeichnisse und Skripte sowie das Setzen der richtigen Berechtigungen.
Diese Rolle soll auf jedem Host ausgeführt werden, der Zertifikate für sich selbst benötigt oder für einen anderen Host signiert.
Siehe inofix.acme-request für die Erstellung des privaten Schlüssels und der Zertifikatsanforderungen sowie die Installation einer aus der Ferne erstellten Anfrage auf einem "signierenden" oder "Zertifikat-Proxy"-Host.
Die Rolle inofix.acme-tiny-install installiert das acme-tiny-Skript auf "signierenden" Hosts.
Die Rollen inofix.acme-tiny-sign / inofix.acme-tiny-cron kümmern sich um die tatsächliche (bzw. periodische) Unterzeichnung auf den "signierenden" Hosts.
Jeder Host, der Zertifikate mit dem Let's Encrypt-Dienst signiert, benötigt einen Webserver, der auf Port 80 lauscht und /.well-known/acme-challenge auf das Verzeichnis auflöst, das für das Signierungswerkzeug zugänglich ist – siehe inofix.acme-sign für ein Beispiel.
Hosts, die auf andere Hosts angewiesen sind, um die Unterzeichnung für sie durchzuführen (z.B. weil sie keinen Webdienst installiert haben), können die fertig signierten Zertifikate von ihrem Proxy-Host mit inofix.acme-proxy abrufen und übertragen.
Siehe "Überblick / Konzept" weiter unten für Details.
Die Entwicklung dieser Rolle wurde als zwischenloesung.acme-tiny-setup gestartet.
Warum verwenden wir nicht eine der vorhandenen Rollen?
- Aus dem ersten Grund lesen Sie den Abschnitt "Versprechen" weiter unten. Wir benötigen etwas Zuverlässiges.
- Diese Rolle wird von maestro verwendet und muss der dort verwendeten Logik folgen. (Natürlich kann die Rolle auch ohne maestro verwendet werden..)
Status
preSTABLE (Feature-Freeze/RC)
Versprechen
Sicher, diese Rolle kann sich in der Zukunft ändern, aber wir werden nur Funktionen erweitern, um die Abwärtskompatibilität nicht zu brechen.
Wenn radikale Änderungen notwendig werden, wird eine neue Rolle erstellt, wahrscheinlich mit einem Versionssuffix...
Installation
# ansible-galaxy install inofix.acme-setup
Anforderungen
- Ansible >2.0
- Python2/3 auf dem Zielhost
- Generisches UNIX mit FHS
- Sudo
- Systemd (standardmäßig)
Überblick / Konzept
Da dies die zentrale Rolle ist und die einzige Rolle, die auf jedem beteiligten Host benötigt wird, wird in diesem README ein Überblick gegeben.
Rollen-Perspektive
- inofix.acme-setup
- auf jedem Host ausführen
- Umgebung einrichten
- Benutzer 'acme' erstellen
- Schlüssel usw. erstellen
- /etc/ssl/acme
- Skripte
- verbundene Dienste
- /var/log/acme
- Protokolle
- /var/lib/acme
- Heimatverzeichnis für Benutzer, die Zertifikate signieren und kopieren
- /etc/ssl/acme
- inofix.acme-request
- auf Hosts ausführen, die ein Zertifikat verwenden oder signieren
- auf Hosts, die ein Zertifikat verwenden
- privaten Schlüssel erstellen
- Zertifikatsanforderung (CSR) erstellen
- auf Proxy-Hosts
- CSR von "offline" Hosts installieren
- inofix.acme-tiny-install
- auf Hosts ausführen, die mit Let's Encrypt Zertifikate signieren
- acme-tiny.py-Skript installieren
- inofix.acme-tiny-sign
- auf Hosts ausführen, die mit Let's Encrypt Zertifikate signieren
- benötigt nur die CSR: der private Schlüssel wird nicht einmal gelesen (oder ist für Proxy nicht vorhanden)
- acme-tiny.py verwenden, um Let's Encrypt aufzufordern, ein Zertifikat für die CSR zu signieren
- auf Hosts ausführen, die mit Let's Encrypt Zertifikate signieren
- inofix.acme-tiny-cron
- auf Hosts ausführen, die mit Let's Encrypt Zertifikate signieren
- benötigt nur die CSR: der private Schlüssel wird nicht einmal gelesen (oder ist für Proxy nicht vorhanden)
- einen Cron-Job einrichten, um den Signierungsteil automatisch auszuführen (wie in inofix.acme-tiny-sign)
- auf Hosts ausführen, die mit Let's Encrypt Zertifikate signieren
- inofix.acme-proxy
- auf Hosts ausführen, die ein Zertifikat verwenden, aber nicht selbst signieren (z.B. Mail/Jabber usw.)
- das Zertifikat von einem Remote-Host (der die Signierung durchgeführt hat) kopieren
- inofix.acme-service-..
- auf allen Hosts ausführen, die ein Zertifikat verwenden (d.h. einen zertifizierten Dienst ausführen...)
- registrieren, dass ein Dienst neu gestartet werden muss, wenn sich ein Zertifikat geändert hat
Host-Perspektive
- Ein Host, der nur als Signierungs-Host fungiert und selbst keine Dienste hat, die die Zertifikate nutzen, muss diese Rollen ausführen:
- inofix.acme-setup (diese Rolle)
- inofix.acme-tiny-install
- inofix.acme-tiny-sign
- inofix.acme-tiny-cron (um die Signierung einmal im Monat automatisch zu wiederholen)
- Ein Host, der nur die Zertifikate nutzt, aber selbst nicht direkt bei Let's Encrypt um die Signierung bittet, muss diese Rollen ausführen:
- inofix.acme-setup (diese Rolle)
- inofix.acme-request
- inofix.acme-proxy (um die Zertifikate automatisch von einem Remote-Host zu erhalten)
- inofix.acme-service-<service> (um den Dienst neu zu starten, wenn sich das Zertifikat geändert hat)
- Ein Host, der sowohl ein Tool zur Signierungsanfrage als auch einen bestimmten Dienst ausführt, benötigt diese Rollen:
- inofix.acme-setup (diese Rolle)
- inofix.acme-tiny-install
- inofix.acme-request
- inofix.acme-tiny-sign
- inofix.acme-tiny-cron (um die Signierung einmal im Monat automatisch zu wiederholen)
- inofix.acme-service-<service> (um den Dienst neu zu starten, wenn sich das Zertifikat geändert hat)
Rollenvariablen
- app__acme__user - optional, Standard='acme'
- app__acme__group - optional, Standard='acme'
- app__acme__home - optional, Standard='/var/lib/acme'
- app__acme__config_dir - optional, Standard='/etc/ssl/acme'
- app__acme__openssl_config - optional, Standard='/etc/ssl/openssl.cnf'
- app__acme__challenge_dir - optional, Standard='/var/www/acme-challenges'
- app__acme__scripts_dir - optional, Standard='/etc/ssl/acme/scripts'
- app__acme__service_dir - optional, Standard='/etc/ssl/acme/service.d'
- app__acme__bin_dir - optional, Standard='/usr/local/bin'
- app__acme__account_key - optional, Standard='account.key'
- app__acme__key_length - optional, Standard=4096
- app__acme__ssh_keytype - optional, Standard='rsa'
- app__acme__log_dir - optional, Standard='/var/log/acme'
- app__acme__letsencrypt_certs - optional, Standard=[ {url='https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem', file='intermediate.crt'}, {url='https://letsencrypt.org/certs/isrgrootx1.pem', file='ca.crt'} ]
- app__acme__cron_minute - optional, Standard='11'
- app__acme__cron_hour - optional, Standard='5'
- app__acme__cron_day - optional, Standard='*'
- app__acme__cron_month - optional, Standard='*'
- app__acme__cron_year - optional, Standard='*'
- fqdn - optional, Standard={{ ansible_fqdn | d(inventory_hostname ) }}
- workdir - optional, Standard=/tmp (lokales Verzeichnis, verwendet für den Austausch von SSH-Publikums-Schlüsseln)
Abhängigkeiten
Beispiel-Playbook
- hosts: servers
roles:
- inofix.acme-setup
Siehe https://raw.githubusercontent.com/inofix/common-playbooks/master/setup-lets-encrypt.yml für ein vollständiges Playbook mit allen relevanten Rollen.
Lizenz
GPLv3
Autoreninformation
- Michael Lustenberger bei inofix.ch
Prepare the system for using Let's Encrypt
ansible-galaxy install inofix.acme-setup