--- # Drei TLS-Modi (Konzept 7.2a), gesteuert ueber tls_mode. Ergebnis ist in # allen Faellen identisch: /etc/jumphost/tls/server.{crt,key} bzw. bei # external_reverse_proxy zusaetzlich das interne Re-Encryption-Zertifikat # fuer nginx unter demselben Pfad (nginx_proxy-Rolle nutzt diese Dateien). - name: TLS-Verzeichnis anlegen ansible.builtin.file: path: /etc/jumphost/tls state: directory owner: root group: "{{ jumphost_app_group if not enable_nginx_proxy else 'root' }}" mode: "0750" - name: "Modus internal_pki / external_reverse_proxy: Zertifikat per ACME gegen interne CA beziehen" block: - name: openssl sicherstellen (fuer selbstsigniertes Uebergangs-Zertifikat) ansible.builtin.apt: name: openssl state: present - name: step-ca ACME-Client (step-cli) installieren ansible.builtin.apt: name: step-cli state: present ignore_errors: true # Paket ist nicht in allen Distros verfuegbar, siehe Fallback unten - name: Hinweis auf manuellen/alternativen Cert-Bezug ansible.builtin.debug: msg: > Falls step-cli nicht verfuegbar ist: Zertifikat/Key manuell aus der Unternehmens-PKI beziehen und ALS ansible-vault-verschluesselte Dateien unter files/tls/{{ inventory_hostname }}.crt / .key ablegen; diese Rolle kopiert sie dann per copy-Task (siehe unten, auskommentiert). # TODO: Echten ACME-Request gegen die interne CA (step-ca) hier ergaenzen, # sobald deren URL/Root-Fingerprint/Provisioner bekannt sind (Konzept # 7.2a). Bis dahin wird als Uebergangsloesung ein selbstsigniertes # Zertifikat erzeugt, damit nginx ueberhaupt starten kann -- Browser # zeigen dafuer eine Vertrauenswarnung, das ist KEIN Ersatz fuer eine # echte interne PKI und muss vor Produktivbetrieb ersetzt werden. - name: Selbstsigniertes UEBERGANGS-Zertifikat erzeugen (bis echte interne PKI angebunden ist) ansible.builtin.command: cmd: >- openssl req -x509 -newkey rsa:4096 -nodes -keyout /etc/jumphost/tls/server.key -out /etc/jumphost/tls/server.crt -days 825 -subj "/CN={{ acme_domain | default(inventory_hostname) }}" -addext "subjectAltName=DNS:{{ acme_domain | default(inventory_hostname) }}" creates: /etc/jumphost/tls/server.crt when: not (tls_mode == 'external_reverse_proxy' and (internal_hop_plaintext_accepted | default(false))) - name: Warnung wegen selbstsigniertem Uebergangs-Zertifikat ausgeben ansible.builtin.debug: msg: > ACHTUNG: Es wird ein SELBSTSIGNIERTES Uebergangszertifikat unter /etc/jumphost/tls/server.crt verwendet (kein Vertrauensanker im Client). Browser zeigen eine Zertifikatswarnung. Vor Produktivbetrieb durch ein echtes Zertifikat aus der Unternehmens-PKI ersetzen (s. Hinweis oben / Konzept 7.2a). when: not (tls_mode == 'external_reverse_proxy' and (internal_hop_plaintext_accepted | default(false))) when: tls_mode in ['internal_pki', 'external_reverse_proxy'] # Alternative zu ACME: vorab per Unternehmens-PKI ausgestellte Dateien einspielen. # - name: Vorab ausgestelltes internes Zertifikat einspielen # ansible.builtin.copy: # src: "files/tls/{{ inventory_hostname }}.crt" # dest: /etc/jumphost/tls/server.crt # when: tls_mode in ['internal_pki', 'external_reverse_proxy'] - name: "Modus acme_public: Certbot fuer oeffentliches Let's-Encrypt-Zertifikat" block: - name: certbot installieren ansible.builtin.apt: name: certbot state: present - name: Zertifikat beziehen (nginx-Plugin, HTTP-01) ansible.builtin.command: cmd: > certbot certonly --nginx --non-interactive --agree-tos -m {{ acme_email }} -d {{ acme_domain }} creates: "/etc/letsencrypt/live/{{ acme_domain }}/fullchain.pem" when: enable_nginx_proxy - name: Symlinks fuer einheitlichen Pfad anlegen ansible.builtin.file: src: "/etc/letsencrypt/live/{{ acme_domain }}/{{ item.src }}" dest: "/etc/jumphost/tls/{{ item.dest }}" state: link loop: - { src: fullchain.pem, dest: server.crt } - { src: privkey.pem, dest: server.key } - name: Certbot-Renew-Timer aktivieren ansible.builtin.service: name: certbot.timer state: started enabled: true when: tls_mode == 'acme_public' - name: Warnung bei Klartext-internem Hop protokollieren (bewusste Ausnahme, Konzept 7.2a) ansible.builtin.debug: msg: > ACHTUNG: internal_hop_plaintext_accepted=true gesetzt -- die Strecke zwischen externem Reverse Proxy und diesem Jumphost laeuft unverschluesselt. Dies ist NICHT die Standardempfehlung und erfordert eine dokumentierte Risikoakzeptanz (siehe Konzept 7.2a). when: tls_mode == 'external_reverse_proxy' and internal_hop_plaintext_accepted | default(false) - name: Zertifikatsdateien-Rechte absichern ansible.builtin.file: path: /etc/jumphost/tls owner: root group: "{{ jumphost_app_group if not enable_nginx_proxy else 'root' }}" mode: "0750" recurse: true