diff --git a/ansible/roles/guacd/defaults/main.yml b/ansible/roles/guacd/defaults/main.yml new file mode 100644 index 0000000..ca95666 --- /dev/null +++ b/ansible/roles/guacd/defaults/main.yml @@ -0,0 +1,5 @@ +--- +# Version des guacamole-server-Quellcode-Tarballs (siehe tasks/main.yml). +# Passend zu guacamole-common-js@1.5 im Frontend (scripts/fetch_frontend_assets.sh) +# auf dem letzten 1.5.x-Patchlevel halten. +guacd_version: "1.5.5" diff --git a/ansible/roles/guacd/tasks/main.yml b/ansible/roles/guacd/tasks/main.yml index 5fdfb0c..c538dd7 100644 --- a/ansible/roles/guacd/tasks/main.yml +++ b/ansible/roles/guacd/tasks/main.yml @@ -1,22 +1,99 @@ --- # guacd + FreeRDP als reine Protokoll-Engine fuer RDP (Konzept 3/4.3). # Laeuft ausschliesslich lokal gebunden, kein Netzwerkzugriff von aussen. +# +# guacd gibt es fuer Debian (Bookworm und aelter) als apt-Paket bislang NICHT +# (nur Ubuntu paketiert es ueber die "universe"-Komponente). Daher wird guacd +# hier gemaess der offiziellen Apache-Guacamole-Doku +# ("Installing Guacamole natively") aus dem Quellcode-Tarball gebaut. Nur das +# RDP-Plugin wird aktiviert (FreeRDP-Dev-Header vorhanden, kein VNC/Telnet), +# passend zum reinen RDP-Einsatzzweck dieses Jumphosts. -- name: guacd und FreeRDP-Plugin installieren +- name: Build-Abhaengigkeiten fuer guacd installieren ansible.builtin.apt: name: - - guacd - - libguac-client-rdp0 + - build-essential + - libcairo2-dev + - libjpeg62-turbo-dev + - libpng-dev + - libtool-bin + - uuid-dev + - libpango1.0-dev + - libssl-dev + - freerdp2-dev + - pkg-config + - wget + - ca-certificates state: present update_cache: true -- name: Dedizierten guacd-User sicherstellen (Paket legt i.d.R. bereits einen an) +- name: Dedizierten guacd-User anlegen (frueher vom Debian/Ubuntu-Paket erledigt) ansible.builtin.user: name: guacd system: true shell: /usr/sbin/nologin create_home: false - ignore_errors: true + +- name: Vorhandene guacd-Installation (falls Quellcode-Build) pruefen + ansible.builtin.stat: + path: /usr/local/sbin/guacd + register: _guacd_bin + +- name: Installierte guacd-Version ermitteln + ansible.builtin.command: /usr/local/sbin/guacd -v + register: _guacd_version + changed_when: false + when: _guacd_bin.stat.exists + +- name: Feststellen, ob (Neu-)Build noetig ist + ansible.builtin.set_fact: + _guacd_build_needed: "{{ (not _guacd_bin.stat.exists) or (guacd_version not in (_guacd_version.stdout | default(''))) }}" + +- name: guacamole-server Quellcode-Tarball herunterladen + ansible.builtin.get_url: + url: "https://archive.apache.org/dist/guacamole/{{ guacd_version }}/source/guacamole-server-{{ guacd_version }}.tar.gz" + dest: "/usr/local/src/guacamole-server-{{ guacd_version }}.tar.gz" + checksum: "sha512:https://archive.apache.org/dist/guacamole/{{ guacd_version }}/source/guacamole-server-{{ guacd_version }}.tar.gz.sha512" + mode: "0644" + when: _guacd_build_needed + +- name: guacamole-server Tarball entpacken + ansible.builtin.unarchive: + src: "/usr/local/src/guacamole-server-{{ guacd_version }}.tar.gz" + dest: /usr/local/src + remote_src: true + creates: "/usr/local/src/guacamole-server-{{ guacd_version }}/configure" + when: _guacd_build_needed + +- name: guacamole-server konfigurieren (nur RDP-Plugin, kein VNC/Telnet/guacenc) + ansible.builtin.command: + cmd: >- + ./configure --with-systemd-dir=/etc/systemd/system + --disable-guacenc --disable-guaclog + chdir: "/usr/local/src/guacamole-server-{{ guacd_version }}" + creates: "/usr/local/src/guacamole-server-{{ guacd_version }}/Makefile" + when: _guacd_build_needed + +- name: guacamole-server kompilieren + ansible.builtin.command: + cmd: "make -j{{ ansible_processor_vcpus | default(2) }}" + chdir: "/usr/local/src/guacamole-server-{{ guacd_version }}" + when: _guacd_build_needed + changed_when: true + +- name: guacamole-server installieren (make install) + ansible.builtin.command: + cmd: make install + chdir: "/usr/local/src/guacamole-server-{{ guacd_version }}" + when: _guacd_build_needed + notify: + - reload systemd + - restart guacd + +- name: Shared-Library-Cache aktualisieren (ldconfig) + ansible.builtin.command: ldconfig + when: _guacd_build_needed + changed_when: false - name: guacd nur an localhost binden ansible.builtin.lineinfile: @@ -57,8 +134,6 @@ owner: root group: root mode: "0644" - vars: - _dummy: true notify: - reload systemd - restart guacd diff --git a/ansible/roles/guacd/templates/guacd.service.j2 b/ansible/roles/guacd/templates/guacd.service.j2 index 7678f3f..a22988d 100644 --- a/ansible/roles/guacd/templates/guacd.service.j2 +++ b/ansible/roles/guacd/templates/guacd.service.j2 @@ -1,7 +1,12 @@ -; Hardening-Override fuer die vom Debian/Ubuntu-Paket mitgelieferte -; guacd.service (Konzept 8.2). Nur lokale Kommunikation zur App (Unix-Domain -; oder localhost) sowie ausgehend RDP zu den Zielsystemen. +; Hardening-Override fuer die aus dem Quellcode gebaute guacd.service +; (Konzept 8.2, siehe roles/guacd/tasks/main.yml -- guacd wird per +; ./configure --with-systemd-dir=... selbst als Unit installiert, da es +; fuer Debian kein fertiges apt-Paket gibt). Erzwingt den unprivilegierten +; System-User "guacd" und beschraenkt guacd auf lokale Kommunikation zur +; App (Unix-Domain oder localhost) sowie ausgehend RDP zu den Zielsystemen. [Service] +User=guacd +Group=guacd NoNewPrivileges=true ProtectSystem=strict ProtectHome=true