umbau 1.3

This commit is contained in:
2026-09-03 08:01:27 +02:00
parent 13542163d8
commit 96d9f331b5
10 changed files with 654 additions and 44 deletions

View File

@ -24,3 +24,18 @@ guacd_freerdp_dev_package: ""
# wird. Default "main" (Standard-Branch von apache/guacamole-server auf
# GitHub -- NICHT "master").
guacd_git_ref: "main"
# Protokollierstufe von guacd (guacd.conf: trace|debug|info|warning|error).
#
# "info" ist der Standard und reicht fuer den Normalbetrieb -- auf dieser
# Stufe protokolliert guacd bereits die fuer die RDP-Fehlersuche wichtigste
# Zeile: "Certificate validation bypassed" (Zertifikatspruefung wurde wegen
# ignore-cert uebersprungen) bzw. "Certificate validation failed".
#
# Auf "debug" hochsetzen, um bei einem fehlgeschlagenen RDP-Verbindungsaufbau
# den KONKRETEN FreeRDP-/OpenSSL-Fehler zu sehen, statt nur guacds
# zusammengefasste Meldung ("SSL/TLS connection failed ...", die im Browser
# als "Ziel nicht erreichbar (Code 519)" ankommt). Danach wieder auf "info"
# zuruecksetzen: "debug"/"trace" sind gespraechig und koennen Details der
# Zielumgebung ins Journal schreiben.
guacd_log_level: "info"

View File

@ -271,6 +271,20 @@
create: true
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: '^log_level'
line: "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"

View File

@ -74,3 +74,51 @@
daemon_reload: true
enabled: true
state: started
# --- Aufraeumen der RDP-Laufwerksverzeichnisse (Befund E6, Nachtrag 3.9.) ----
#
# Die App kann ihre eigenen Sitzungsverzeichnisse unter
# {{ jumphost_data_dir }}/rdp-drives NICHT entfernen: das Verzeichnis gehoert
# guacd (0750 guacd:guacd, Rolle "guacd"), die darin von guacd selbst
# angelegten Sitzungsverzeichnisse haben Modus 0700 guacd:guacd, und der
# App-Benutzer "{{ jumphost_app_user }}" ist nicht in der Gruppe "guacd".
# Der bisherige shutil.rmtree()-Aufruf in app/rdp_proxy/ws_tunnel.py lief
# deshalb seit jeher ins Leere -- und hat den PermissionError wegen
# ignore_errors=True auch noch stillschweigend verschluckt. Aufgeraeumt wird
# daher hier, per Timer und als root.
- name: Aufraeum-Skript fuer RDP-Laufwerke ausrollen
ansible.builtin.copy:
src: "{{ playbook_dir }}/../scripts/cleanup_rdp_drives.py"
dest: "{{ jumphost_home }}/scripts/cleanup_rdp_drives.py"
owner: root
group: "{{ jumphost_app_group }}"
mode: "0755"
- name: systemd-Unit fuer das Aufraeumen der RDP-Laufwerke ausrollen
ansible.builtin.template:
src: jumphost-rdp-drives-cleanup.service.j2
dest: /etc/systemd/system/jumphost-rdp-drives-cleanup.service
owner: root
group: root
mode: "0644"
notify: reload systemd
- name: systemd-Timer fuer das Aufraeumen der RDP-Laufwerke ausrollen
ansible.builtin.template:
src: jumphost-rdp-drives-cleanup.timer.j2
dest: /etc/systemd/system/jumphost-rdp-drives-cleanup.timer
owner: root
group: root
mode: "0644"
notify: reload systemd
- name: Anstehende systemd-Handler anwenden, bevor der Timer gestartet wird
ansible.builtin.meta: flush_handlers
- name: Aufraeum-Timer aktivieren und starten
ansible.builtin.systemd:
name: jumphost-rdp-drives-cleanup.timer
daemon_reload: true
enabled: true
state: started

View File

@ -0,0 +1,36 @@
[Unit]
Description=Jumphost: beendete RDP-Laufwerksverzeichnisse aufraeumen
Documentation=file://{{ jumphost_home }}/scripts/cleanup_rdp_drives.py
After=jumphost-app.service
[Service]
Type=oneshot
# BEWUSST als root: /var/lib/jumphost/rdp-drives gehoert guacd (0750) und die
# darin von guacd angelegten Sitzungsverzeichnisse haben Modus 0700 guacd:guacd.
# Weder der App-Benutzer "{{ jumphost_app_user }}" noch guacd selbst koennen
# sie zuverlaessig wieder entfernen (guacd kennt das Sitzungsende nicht) --
# ausfuehrliche Begruendung im Kopfkommentar des Skripts.
User=root
Group=root
Environment=JUMPHOST_DATA_DIR={{ jumphost_data_dir }}
ExecStart={{ jumphost_venv }}/bin/python {{ jumphost_home }}/scripts/cleanup_rdp_drives.py
# Hardening: der Dienst braucht ausschliesslich Lesezugriff auf die
# Sitzungsdatenbank und Schreibzugriff auf rdp-drives -- sonst nichts.
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictNamespaces=true
# Kein Netzwerk noetig (reiner Datei-/SQLite-Zugriff).
PrivateNetwork=true
RestrictAddressFamilies=AF_UNIX
RestrictSUIDSGID=true
LockPersonality=true
ReadWritePaths={{ jumphost_data_dir }}/rdp-drives
ReadOnlyPaths={{ jumphost_data_dir }}
UMask=0077

View File

@ -0,0 +1,17 @@
[Unit]
Description=Jumphost: RDP-Laufwerksverzeichnisse regelmaessig aufraeumen
[Timer]
# Alle 15 Minuten. Das Skript loescht ausschliesslich Verzeichnisse, deren
# Sitzung in der Datenbank als BEENDET markiert ist -- ein kurzes Intervall
# ist deshalb ungefaehrlich (keine Altersheuristik, die eine lange, aber
# stille Sitzung mitten im Betrieb treffen koennte) und haelt die Zeitspanne
# klein, in der uebertragene Dateien nach Sitzungsende noch auf der Platte
# liegen.
OnBootSec=5min
OnUnitActiveSec=15min
AccuracySec=1min
Persistent=true
[Install]
WantedBy=timers.target