# Aufsetzen eines Apache Guacamole Proxy
Um remote auf bwLehrpool-Clients zugreifen zu können ([Remotenutzung von bwLehrpool](https://www.bwlehrpool.de/doku.php/allgemein/remotenutzung_von_bwlehrpool)), benötigen Sie einen [Apache Guacamole](https://guacamole.apache.org)-Server.
In dieser Anleitung wird **Ubuntu 20.04.2 LTS** als Basis-OS genutzt und **Guacamole in der Version 1.3.0** verwendet.
Sie können Guacamole entweder direkt aus den Sources bauen und installieren oder alternativ in Docker-Containern bereitstellen. Zusätzlich wird ein Webserver benötigt (im Beispiel wird Apache verwendet).
## Installation von Guacamole
- Installation benötigter Abhängigkeiten
````bash
apt install apache2 freerdp2-dev gcc libavcodec-dev libavformat-dev libavutil-dev libcairo2-dev libjpeg-turbo8-dev libossp-uuid-dev libpango1.0-dev libpng-dev libpulse-dev libssh2-1-dev libssl-dev libswscale-dev libtool-bin libvncserver-dev libvorbis-dev libwebp-dev libwebsockets-dev make tomcat9
````
(Anmerkung: Das derzeit aktuelle Debian 11 „Bullseye“ beinhaltet kein libjpeg-turbo8-dev, jedoch libjpeg62-turbo-dev.)
- Guacamole 1.3.0 herunterladen
````bash
mkdir /usr/src && cd /usr/src
wget https://dlcdn.apache.org/guacamole/1.3.0/binary/guacamole-1.3.0.war
wget https://dlcdn.apache.org/guacamole/1.3.0/binary/guacamole-auth-ldap-1.3.0.tar.gz
wget https://dlcdn.apache.org/guacamole/1.3.0/source/guacamole-server-1.3.0.tar.gz
````
- Sources entpacken
````
tar xzf guacamole-server-1.3.0.tar.gz
````
- Configure aufrufen
````
cd /usr/src/guacamole-server-1.3.0
./configure --with-systemd-dir=/etc/systemd/system
````
- Die Ausgabe sollte bei korrekter Installation der Abhängigkeiten in etwa so aussehen:
````bash
#------------------------------------------------
guacamole-server version 1.3.0
#------------------------------------------------
Library status:
freerdp2 ............ yes
pango ............... yes
libavcodec .......... yes
libavformat.......... yes
libavutil ........... yes
libssh2 ............. yes
libssl .............. yes
libswscale .......... yes
libtelnet ........... no
libVNCServer ........ yes
libvorbis ........... yes
libpulse ............ yes
libwebsockets ....... yes
libwebp ............. yes
wsock32 ............. no
Protocol support:
Kubernetes .... yes
RDP ........... yes
SSH ........... yes
Telnet ........ no
VNC ........... yes
Services / tools:
guacd ...... yes
guacenc .... yes
guaclog .... yes
FreeRDP plugins: /usr/lib/x86_64-linux-gnu/freerdp2
Init scripts: no
Systemd units: /etc/systemd/system
Type "make" to compile guacamole-server.
````
- Kompilieren und Installieren
````
make
make install
ldconfig
````
- Guacamole Server Service
````bash
systemctl enable guacd
systemctl start guacd
````
- GUACAMOLE_HOME anlegen und setzen
````bash
# GUACAMOLE_HOME dir anlegen
mkdir /etc/guacamole
echo 'GUACAMOLE_HOME="/etc/guacamole"' >> /etc/environment
````
### Guacamole-Client installieren und starten
````bash
cp /usr/src/guacamole-1.3.0.war /var/lib/tomcat9/webapps/guacamole.war
# Verlinke die Konfigurationsdateien
ln -s /etc/guacamole /usr/share/tomcat9/.guacamole
# Service neustarten
systemctl restart tomcat9.service
systemctl restart guacd.service
````
### LDAP-Plugin installieren
Authentifizieren via LDAP ermöglichen.
````bash
cd /usr/src/
tar xvzf guacamole-auth-ldap-1.3.0.tar.gz
# extensions Verzeichnis anlegen
mkdir /etc/guacamole/extensions
cp /usr/src/guacamole-auth-ldap-1.3.0/guacamole-auth-ldap-1.3.0.jar /etc/guacamole/extensions/
````
#### Update guacamole.properties für LDAP
Die Konfigurationsdatei guacamole.properties unter ``/etc/guacamole/`` muss entsprechend für LDAP erweitert werden.
**Hinweis:** Kein Whitespace vor Lineendings!
````bash
vi /etc/guacamole/guacamole.properties
````
````properties
# LDAP Einstellungen für Active Directory
# IP-Adresse oder DNS-Name eines Domänencontrollers
ldap-hostname:
# Port Nummer von LDAP
ldap-port:
# Verschlüsslungsmethode für LDAP-Verbindung
ldap-encryption-method:
# DN des Benutzer der für die Abfrage genutzt werden
ldap-user-base-dn:
# Set searchbase to search for users in subtree
ldap-search-bind-dn:
# rename attribute name to cn (default: uid)
ldap-username-attribute:
````
[Guacamole LDAP - weitere Informationen](https://guacamole.apache.org/doc/gug/ldap-auth.html)
#### LDAP Cert installieren
Falls Ihr LDAP Server verschlüsselt kommuniziert, müssen Sie evtl. ein entsprechendes Zertifikat importieren.
````bash
# Copy your CA to dir /usr/local/share/ca-certificates/
cp CERT.crt /usr/local/share/ca-certificates/
# Update CA Store:
update-ca-certificates
# Tomcat neustarten
systemctl restart tomcat9
````
### BWLP-Plugin installieren
In diesem Schritt verknüpfen Sie Guacamole mit Ihrem Satellitenserver. Sie müssen dazu das aktuelle bwlp-guac-plugin herunterladen.
**Achten Sie darauf, dass immer nur ein bwlp-Plugin verwendet wird! Löschen Sie ältere Pluginversionen, da es ansonsten zu Fehlverhalten kommen kann.**
````bash
# Das aktuelle bwlp-plugin muss im Guacamole extensions Verzeichnis abgelegt werden
cd /etc/guacamole/extensions/
rm -i bwlp-guac*.jar
wget https://files.bwlp.ks.uni-freiburg.de/satellit/guacamole/bwlp-guac-1.3.1-SNAPSHOT.jar
# Um das Plugin mit dem bwLehrpool-Satellitenserver zu verbinden, folgende Zeile in '/etc/guacamole/guacamole.properties' einfügen:
slx-client-list-url: https:///slx-admin/api.php?do=remoteaccess
````
Bitte fahren Sie zum Abschluß der Installation mit dem Punkt [„Apache Reverse Proxy einrichten“](#apache_reverse_proxy_einrichten) fort.
## Alternative: Container Setup
Guacamole-Server und -Client sind auch als [Container Images](https://guacamole.apache.org/doc/gug/guacamole-docker.html) verfügbar. Nachfolgend wird die Einrichtung mit der Docker Engine durchgeführt. Als Webserver für das Routing und die Zertifikatsverwaltung dient eine lokale Installation des Apache-Webserver.
### Setup bwLehrpool-Remote
Nachdem der Docker-Host vorbereitet ist, kann das Setup für die Anwendungs-Container durchgeführt werden.
1. Starten des Guacamole-Server (guacd).
````bash
docker run --log-driver local --name guacd -d \
--restart unless-stopped \
guacamole/guacd
````
2. Entsprechend der folgenden Struktur die Verzeichnisse für das GUACAMOLE_HOME anlegen. In `guacamole.properties` die Zeile `slx-client-list-url: https:///slx-admin/api.php?do=remoteaccess` mit der SAT-IP einfügen.
````
|/guacamole
|-- guacamole.properties
|-- extensions/
| |-- bwlp-guac-.jar
| |-- guacamole-auth-ldap-1.3.0.jar
````
3. Danach ist ein Container des Guacamole-Clients zu starten, hierbei muss für Betrieb und Authentifizierung eine Datenbank oder LDAP konfiguriert werden. Die LDAP-Konfiguration ist entsprechend der lokalen LDAP-Instanz individuell festzulegen. Um das bwLehrpool-Plugin in der Container-Lösung verfügbar zu machen, das erstellte Verzeichnis in den Container mounten und als GUACAMOLE_HOME deklarieren.
````bash
docker run --log-driver local --name guacamole \
--link guacd:guacd \
-e LDAP_HOSTNAME= \
-e LDAP_PORT= [389|363]\
-e LDAP_ENCRYPTION_METHOD= ["none"|"ssl"|"starttls"] \
-e LDAP_USER_BASE_DN= \
-e LDAP_SEARCH_BIND_DN= \
-e LDAP_USERNAME_ATTRIBUTE= \
-d \
--restart unless-stopped \
-p 8080:8080 \
-v /guacamole:/guacamole \
-e GUACAMOLE_HOME=/guacamole \
guacamole/guacamole:1.3.0
````
4. Falls ein Zertifikat für den LDAP-Server erforderlich ist, muss dieses noch innerhalb des Containers gesetzt werden.
````bash
docker cp CERT.crt guacamole:/usr/local/share/ca-certificates/
docker exec -it guacamole update-ca-certificates
````
## Docker-Compose
Weiterhin ist es auch möglich, sämtliche Services die für den Remotezugang erforderlich sind, als Docker-Compose zu starten bzw. zu verwalten. Die erfoderliche Struktur und nötigen Konfigurationen sind in dem Archive [bwlp-remote.tgz](https://www.bwlehrpool.de/wiki/lib/exe/fetch.php/client/bwl_remote/bwlp-remote.tgz) zusammengefasst.
### Voraussetzung
- [Docker](https://docs.docker.com/engine/install/)
- [Docket-Compose](https://docs.docker.com/compose/install/)
### Vorbereitung
Laden Sie das Archive [bwlp-remote.tgz](https://www.bwlehrpool.de/wiki/lib/exe/fetch.php/client/bwl_remote/bwlp-remote.tgz) auf ihren Server herunter und entpacken Sie es. Danach müssen grundlegende Eigenschaften in Form von Umgebungsvariablen gesetzt werden. Nutzten Sie hierzu die bereitgestellte Konfigurationstemplate `bwlp-remote/.env.tmpl` und erstellen Sie eine eigene Konfigurationsdatei `.env`. Nachfolgend werden die unterschiedlichen Konfigurationsschritte aufgelistet.
#### Apache
Für Übetragung zwischen Anwender und Guacamole-Client wird ein Apache Webserver eingesetzt. Damit die Übertragung gesicht ist müssen Sie das Serverzertifikat und Schlüssel bereitstellen, legen Sie diese in `bwlp-remote/apache/cert` ab. Nachfolgend müssen folgende Variablen in `bwlp-remote/.env` gesetzt werden.
- `BWLP_REMOTE_HOSTNAME`: Setzten Sie hier den FQDN des Servers.
- `BWLP_REMOTE_SERVERADMIN`: (Optional) setzten Sie einen Serveradmin.
- `BWLP_REMOTE_SSL_CERT`: Dateinamen des Serverzertifikats
- `BWLP_REMOTE_SSL_KEY`: Dateinamen des Serverschlüssels
**LetsEncrypt**
Sollten für die Bereitstellung von Serverzertifikaten auf [[https://certbot.eff.org/|CertBot]] von Let's Encrypt zurückgegriffen werden, müssen diese entsprechend in den Container durchgereicht und referenziert werden. Passen Sie hierzu wie folgend die Variablen entsprechend an
```shell
BWLP_REMOTE_SSL_DIR_HOST="/etc/letsencrypt"
BWLP_REMOTE_SSL_DIR_CONTAINER="/etc/letsenrypt"
BWLP_REMOTE_SSL_DIR=${BWLP_REMOTE_SSL_DIR_CONTAINER}/live/${BWLP_REMOTE_HOSTNAME}
BWLP_REMOTE_SSL_CERT=fullchain.pem
BWLP_REMOTE_SSL_KEY=privkey.pem
```
#### Guacamole
Als nächstes werden Einstellungen betreffs des Guacamole Clients vorgenommen.
- `BWLP_LOCAL_BRANDING`: Als URL angegebenes Logo des Instituts.
- `BWLP_SAT_HOST`: IP-Adresse oder FQDN des bwLehrpool Satelliten
- `BWLP_GUAC_LDAP_CERT`: Dateinamen des LDAP-Server-Zertifikats, Datei muss unter `bwlp-remot/guac-sat/cert` abgelegt sein.
##### LDAP
Für eine Authentisierung mittels LDAP sind als letztes noch die entsprechenden Umgebungsvariablen zu setzten. Wie bereits in der Anleitung zu Docker beschrieben, müssen diese entsprechend den Vorgaben Ihrer Campus-IT gesetzt werden. Ist zudem ein Serverzertifikat für die Kommunikation zum LDAP-Server erforderlich, muss dieses in `bwlp-remot/guac-sat/cert` abgelegt sein und der Dateiname durch die Variable `BWLP_GUAC_LDAP_CERT` festgelegt werden.
### Service Verwaltung
Sind alle Arbeiten an der Konfigurationsdateie abgeschlossen, gilt es die Services, als komplett Einheit zu verwalten. Nachfolgend sind die wenigen Aufrufe aufgelistet, um die Servises zu starten, zu stoppen und die Logs zu betrachten.
*Hinweis* Alle Aufrufe finden dabei im Ordner `bwlp-remote` statt.
- Starten der Services
```shell
docker-compose up -d --build
```
- Stoppen der Services bzw Löschen aller Container und Artefakte.
```shell
docker-compose down
```
- Anzeigen der Logs
```shell
docker-compose logs --follow
## Apache Reverse Proxy einrichten
Reverse Proxy-Konfiguration für Apache anlegen und entsprechende Module aktivieren.
````bash
# Apache Module aktivieren
a2enmod rewrite
a2enmod proxy_http
a2enmod ssl
a2enmod proxy_wstunnel
````
Nachfolgender Inhalt in .conf datei einfügen
````bash
vi /etc/apache2/sites-available/bwlehrpool-remote.hs-xyz.de.conf
````
**IP (10.9.8.7)** und **FQDN (bwlehrpool-remote.hs-xyz.de)** sind Platzhalter und müssen entsprechend angepasst werden:
````bash
ServerName bwlehrpool-remote.hs-xyz.de
ServerAdmin webmaster@test.de
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
ServerName bwlehrpool-remote.hs-xyz.de
ServerAdmin webmaster@test.de
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
RewriteEngine on
RewriteRule "^/guacamole" "/" [R]
ProxyPass / http://10.9.8.7:8080/guacamole/ flushpackets=on
ProxyPassReverse / http://10.9.8.7:8080/guacamole/
ProxyPassReverseCookiePath /guacamole /
Order allow,deny
Allow from all
ProxyPass ws://10.9.8.7:8080/guacamole/websocket-tunnel
ProxyPassReverse ws://10.9.8.7:8080/guacamole/websocket-tunnel
SetEnvIf Request_URI "^/tunnel" dontlog
CustomLog /var/log/apache2/guac.log common env=!dontlog
````
````bash
# Selbst signiertes Zertifikat erstellen (besser Let's Encrypt oder korrektes Hochschulzertifikat verwenden)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
# Seite aktivieren:
a2ensite bwlehrpool-remote.hs-xyz.de.conf
# Webserver neustarten
systemctl restart apache2
````
## Problembehebung
Wenn nach dem Login an der Guacamole-Anmeldemaske keine Raumgruppen oder Clients angezeigt werden, kann evtl. die Liste vom Satellitenserver nicht abgerufen werden.
Prüfen Sie die *guacamole.properties* auf den Wert der *slx-client-list-url*. Diese muss dem Schema https:///slx-admin/api.php?do=remoteaccess
entsprechen. Achten Sie auch auf HTTP bzw. HTTPS. Im Webinterface des Satellitenservers, können Sie die HTTPS-Verschlüsselung im Menüpunkt "Web-Schnittstelle" aktivieren.
Sie können zur Kontrolle die Metadaten des Satelliten direkt auf dem Guacamole-Server manuell abrufen. Führen Sie auf dem Guacamole-Proxy folgen Befehl aus:
curl -k -L -v http:///slx-admin/api.php?do=remoteaccess
Dabei sollte eine json-Struktur herauskommen, die die Liste von Clients und Gruppen
enthält. Wenn dies fehlschlägt sollte allerdings auch im Log
(/var/log/tomcat9/catalina.out) entsprechendes auftauchen.
### Guacamole-Logs auswerten
- Für Server
````
journalctl -u guacd
````
- Für Client-Plugin
````
tail -n 200 -f /var/log/tomcat9/catalina..log
````