119 lines
5.1 KiB
YAML
119 lines
5.1 KiB
YAML
---
|
|
# 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
|