umbau 1.3.2

This commit is contained in:
2026-09-03 10:34:01 +02:00
parent b2c72de069
commit 0728a9af27
7 changed files with 392 additions and 53 deletions

View File

@ -255,59 +255,24 @@
group: root
mode: "0755"
- name: guacd nur an localhost binden
ansible.builtin.lineinfile:
path: /etc/guacamole/guacd.conf
regexp: '^bind_host'
line: "bind_host = 127.0.0.1"
create: true
- name: guacd.conf vollstaendig ausrollen
# Ersetzt vier fruehere lineinfile-Tasks (bind_host, bind_port und zwei
# Fehlversuche fuer die Protokollierstufe). lineinfile haengt neue Zeilen
# ans Dateiende und damit in den zuletzt geoeffneten INI-Abschnitt -- bei
# guacd.conf, wo jeder Parameter in genau einen Abschnitt gehoert, fuehrt
# das verlaesslich zu einem Startabbruch von guacd. Siehe Kopfkommentar
# der Vorlage.
ansible.builtin.template:
src: guacd.conf.j2
dest: /etc/guacamole/guacd.conf
owner: root
group: root
mode: "0644"
# Vor dem Ueberschreiben eine Sicherung anlegen: die Datei koennte auf
# einem bestehenden Host von Hand angepasst worden sein.
backup: true
notify: restart guacd
- name: guacd-Port setzen
ansible.builtin.lineinfile:
path: /etc/guacamole/guacd.conf
regexp: '^bind_port'
line: "bind_port = {{ guacd_port }}"
create: true
notify: restart guacd
- name: Falsch benannte Protokollierstufe aus guacd.conf entfernen
# BUGFIX (3.9.): hier stand zuerst "log_level = ...". Diesen Parameter
# kennt guacd.conf NICHT -- er heisst "max_log_level" (guacd.conf(5):
# pid_file, max_log_level, bind_host, bind_port, server_certificate,
# server_key). guacd bricht bei einem unbekannten Schluessel den Start
# komplett ab ("Parse error at line N: Invalid parameter or section name"),
# es gibt also keine stille Fehlbedienung -- der Dienst startete gar nicht
# mehr. Diese Aufraeumzeile entfernt die falsche Zeile auf Hosts, auf denen
# die fehlerhafte Fassung bereits ausgerollt wurde.
ansible.builtin.lineinfile:
path: /etc/guacamole/guacd.conf
regexp: '^\s*log_level\s*='
state: absent
notify: restart guacd
- name: guacd-Protokollierstufe setzen
# Auf "info" (Standard) protokolliert guacd bereits, ob die
# Zertifikatspruefung wegen ignore-cert uebersprungen wurde
# ("Certificate validation bypassed") oder fehlgeschlagen ist -- die
# entscheidende Unterscheidung bei "Ziel nicht erreichbar (Code 519):
# SSL/TLS connection failed". Fuer den konkreten FreeRDP-/OpenSSL-Fehler
# guacd_log_level voruebergehend auf "debug" setzen (siehe defaults).
ansible.builtin.lineinfile:
path: /etc/guacamole/guacd.conf
regexp: '^\s*max_log_level\s*='
line: "max_log_level = {{ guacd_log_level }}"
create: true
notify: restart guacd
- name: RDP-Laufwerksumleitungs-Verzeichnisse anlegen (Filetransfer, Konzept 4.3)
ansible.builtin.file:
path: "/var/lib/jumphost/rdp-drives"
state: directory
owner: guacd
group: guacd
mode: "0750"
- name: TLS-Kompatibilitaetskonfiguration fuer guacd ausrollen (nur wenn eingeschaltet)
# Greift ausschliesslich ueber Environment=OPENSSL_CONF in der guacd-Unit
# und damit nur fuer diesen einen Prozess -- siehe Kopfkommentar der
@ -331,6 +296,91 @@
when: not (guacd_tls_legacy_compat | bool)
notify: restart guacd
# --- OpenSSL-Sicherheitsstufe fuer FreeRDP (Befund 3.9., siehe files/*.c) ---
#
# Nur aktiv, wenn guacd_tls_seclevel gesetzt ist. Standardmaessig leer.
- name: Uebersetzer fuer die Sicherheitsstufen-Zwischenschicht sicherstellen
# Auf dem Quellcode-Pfad ist gcc ueber build-essential ohnehin da; auf dem
# apt-Pfad (Ubuntu) nicht. Die Zwischenschicht bindet bewusst KEINE
# OpenSSL-Header ein, deshalb reicht gcc -- kein libssl-dev noetig.
ansible.builtin.apt:
name: gcc
state: present
when: guacd_tls_seclevel | string | length > 0
- name: Quelle der Sicherheitsstufen-Zwischenschicht ablegen
ansible.builtin.copy:
src: guacd_tls_seclevel_shim.c
dest: /usr/local/src/guacd_tls_seclevel_shim.c
owner: root
group: root
mode: "0644"
when: guacd_tls_seclevel | string | length > 0
register: _shim_quelle
- name: Verzeichnis fuer die uebersetzte Zwischenschicht anlegen
ansible.builtin.file:
path: /usr/local/lib/jumphost
state: directory
owner: root
group: root
mode: "0755"
when: guacd_tls_seclevel | string | length > 0
- name: Sicherheitsstufen-Zwischenschicht uebersetzen
ansible.builtin.command:
cmd: >-
gcc -shared -fPIC -O2 -Wall -Wextra
-o /usr/local/lib/jumphost/guacd-tls-seclevel-shim.so
/usr/local/src/guacd_tls_seclevel_shim.c -ldl
when: guacd_tls_seclevel | string | length > 0
register: _shim_build
changed_when: true
notify: restart guacd
- name: Pruefen, ob FreeRDP die OpenSSL-Sicherheitsstufe tatsaechlich selbst setzt
# Die Zwischenschicht kann nur wirken, wenn FreeRDP
# SSL_CTX_set_security_level dynamisch aufruft. Taete es das nicht, waere
# sie wirkungslos -- und das soll auffallen, statt dass jemand spaeter
# raetselt, warum die Einstellung nichts bewirkt.
ansible.builtin.shell: |
set -o pipefail
lib=$(ldconfig -p | awk '/libfreerdp[0-9]*\.so/ {print $NF; exit}')
if [ -z "$lib" ]; then echo "KEINE_LIB"; exit 0; fi
if grep -qa 'SSL_CTX_set_security_level' "$lib"; then echo "JA $lib"; else echo "NEIN $lib"; fi
args:
executable: /bin/bash
register: _freerdp_seclevel
changed_when: false
check_mode: false
when: guacd_tls_seclevel | string | length > 0
- name: Abbrechen, wenn die Zwischenschicht wirkungslos waere
ansible.builtin.fail:
msg: >-
guacd_tls_seclevel ist gesetzt, aber die gefundene FreeRDP-Bibliothek
ruft SSL_CTX_set_security_level nicht auf ({{ _freerdp_seclevel.stdout }}).
Die Zwischenschicht bliebe wirkungslos. Entweder guacd_tls_seclevel
wieder leeren, oder die Ursache erneut mit
scripts/diagnose_rdp_tls.py eingrenzen.
when:
- guacd_tls_seclevel | string | length > 0
- _freerdp_seclevel.stdout is defined
- _freerdp_seclevel.stdout is not match('^JA ')
- name: Sicherheitsstufen-Zwischenschicht wieder entfernen, wenn abgeschaltet
# Damit ein Leeren von guacd_tls_seclevel die Absenkung auch tatsaechlich
# zurueckdreht und keine verwaiste Bibliothek liegen bleibt.
ansible.builtin.file:
path: "{{ item }}"
state: absent
loop:
- /usr/local/lib/jumphost/guacd-tls-seclevel-shim.so
- /usr/local/src/guacd_tls_seclevel_shim.c
when: guacd_tls_seclevel | string | length == 0
notify: restart guacd
- name: Override-Verzeichnis fuer guacd-Unit anlegen
ansible.builtin.file:
path: /etc/systemd/system/guacd.service.d