Ubuntu 18.04.x LTS - Guacamole HTML5 Remotedesktop Gateway installieren mit Apache Reverse Proxy
Aus znilwiki
Changelog:
- 12.01.2019: Erste Version des Artikel mit Gucamole Version 1.0.0
- 19.01.2019: LDAP Konfiguration hinzugefügt
- 14.05.2019: Fehlerbehebung bei Datenbankanbindung (leerer Login-Screen) hinzugefügt
- 09.12.2019: Anleitung verifiziert mit Guacamole Version 1.0.0 (immer noch die aktuelle Version zu diesem Zeitpunkt)
- 19.11.2020: Hinweis auf neuere Version des Artikels hinzugefügt (und das dieser nicht mehr gepflegt wird)
Nach diversen Versuchen über einen Webrowser per RDP auf eine Windows VM zu zugreifen habe ich im Internet Guacamole gefunden.
http://guac-dev.org/
Es handelt sich dabei um ein HTML5 Gateway über das man per RDP, VNC und SSH auf andere Systeme zugreifen kann.
In dieser Anleitung installiere ich Guacamole auf einen bestehenden Webserver in einer Subdomain.
Das ist bereits die 3. Version dieses Artikel (nach Ubuntu 14.04 und 16.04).
Ausgangslage
Ich habe hier einen ESXi Server auf dem eine VM mit dem Namen WEBSERVER02 mit Apache2 als Webserver läuft (IP: 10.100.12.10).
Nach der Installation kann man von extern über eine Subdomain remote.znil.org auf die Guacamole-Webseite per https:// zugreifen.
Guacamole ist auch in den Paketquellen von Ubuntu 18.04. enthalten - jedoch in der alten Version 0.9.9, nicht in der aktuellen 1.0.0 (dazwischen gibt es 5 weitere Versionen).
Also doch selbst Hand anlegen!
nano /etc/apache2/sites-available/ispconfig.vhost
mit anschließendem Neustart des Apache
Vorwort
In dieser Anleitung wird der Server Schritt-für-Schritt installiert - zuerst auf Port 8080 mit lokaler XML-Datei für die Benutzer, dann der Umbau auf MySQL, Port 80/443, dann LDAP usw.
Bitte, bitte macht das auch so - einen Schritt nach dem anderen. So wird es bei der Fehlersuche einfacher - und ihr habe zuerst mal ein Erfolgserlebnis.
Was Ihr nicht braucht lasst Ihr weg - LDAP, 2FA usw.
Ich arbeite als root
Alle nachfolgenden Befehle müssen als Benutzer root ausgeführt werden!
Wenn ihr nicht sowieso schon root seit empfehle ich ein
sudo -i
damit Ihr eine dauerhafte root-Sitzung habt.
Voraussetzungen installieren
apt install make libssh2-1-dev libtelnet-dev libpango1.0-dev libossp-uuid-dev libcairo2-dev libpng-dev freerdp-x11 libssh2-1 libvncserver-dev libfreerdp-dev libvorbis-dev libssl1.0.0 gcc libssh-dev libpulse-dev tomcat8 tomcat8-admin tomcat8-docs ghostscript libwebp-dev libavcodec-dev libavutil-dev libswscale-dev
Danach sollte der Tomcat bereits auf Port 8080 lauschen - wenn ihr also
http://servername-oder-ip:8080
aufruft kommt die Standardseite von Tomcat:
Guacamole herunterladen und kompilieren
Release Version
Bei der Erstellung im Januar 2019 dieses Artikels war die Version
Guacamole 1.0.0
aktuell - ggf. müsst ihr die Namen und Pfade anpassen wenn Ihr eine neuere Version nehmt.
cd /usr/src wget http://mirror.ibcp.fr/pub/apache/guacamole/1.0.0/source/guacamole-server-1.0.0.tar.gz wget http://mirror.ibcp.fr/pub/apache/guacamole/1.0.0/binary/guacamole-1.0.0.war
Damit haben wir den Quellcode des Servers und die .war Datei des Clients heruntergeladen.
Dann den Quellcode noch entpacken:
tar xvzf guacamole-server-1.0.0.tar.gz
Kompilieren
cd /usr/src/guacamole-server-1.0.0 ./configure --with-systemd-dir=/etc/systemd/system
Nach viel Text (die ganzen Checks) müsste am Ende eine Meldung wie folgt kommen:
------------------------------------------------
guacamole-server version 1.0.0
------------------------------------------------
Library status:
freerdp ............. yes
pango ............... yes
libavcodec .......... yes
libavutil ........... yes
libssh2 ............. yes
libssl .............. yes
libswscale .......... yes
libtelnet ........... yes
libVNCServer ........ yes
libvorbis ........... yes
libpulse ............ yes
libwebp ............. yes
wsock32 ............. no
Protocol support:
RDP ....... yes
SSH ....... yes
Telnet .... yes
VNC ....... yes
Services / tools:
guacd ...... yes
guacenc .... yes
guaclog .... yes
Init scripts: no
Systemd units: /etc/systemd/system
Type "make" to compile guacamole-server.
Wenn da irgendwo NICHT yes steht da fehlt ein Paket aus den Voraussetzungen! Bei der Überarbeitung dieses Artikels wurden da welche hinzugefügt!
Wenn da über yes steht -> Prima! Also kompilieren und installieren wir:
make make install
Test Server
Er hat uns nun ein Systemd-Start-Script hinterlegt mit welchen wir den Dienst probeweise einmal starten:
systemctl start guacd.service
Der Start schlägt aber fehl, das können wir prüfen mit:
systemctl status guacd.service
Ausgabe:
● guacd.service - Guacamole Server Loaded: loaded (/etc/systemd/system/guacd.service; disabled; vendor preset: enabled) Active: failed (Result: exit-code) since Sat 2019-01-12 12:17:44 CET; 6s ago Docs: man:guacd(8) Process: 24015 ExecStart=/usr/local/sbin/guacd -f (code=exited, status=127) Main PID: 24015 (code=exited, status=127)
Deshalb geben wir einfach ein
ldconfig systemctl start guacd.service
ein und nun geht es:
systemctl status guacd.service
Ausgabe:
● guacd.service - Guacamole Server Loaded: loaded (/etc/systemd/system/guacd.service; disabled; vendor preset: enabled) Active: active (running) since Sat 2019-01-12 12:18:33 CET; 4s ago Docs: man:guacd(8) Main PID: 24057 (guacd) Tasks: 1 (limit: 2320) CGroup: /system.slice/guacd.service └─24057 /usr/local/sbin/guacd -f Jan 12 12:18:33 webserver02.znil.local systemd[1]: Started Guacamole Server. Jan 12 12:18:33 webserver02.znil.local guacd[24057]: Guacamole proxy daemon (guacd) version 1.0.0 started Jan 12 12:18:33 webserver02.znil.local guacd[24057]: guacd[24057]: INFO: Guacamole proxy daemon (guacd) version 1.0.0 started Jan 12 12:18:33 webserver02.znil.local guacd[24057]: Listening on host 127.0.0.1, port 4822 Jan 12 12:18:33 webserver02.znil.local guacd[24057]: guacd[24057]: INFO: Listening on host 127.0.0.1, port 4822
Wir beenden den Server aber gleich wieder:
systemctl stop guacd.service
da wir erst einmal die Konfigurationsdateien anlegen müssen.
Guacamole Server konfigurieren
Wir legen das Verzeichnis für die Konfigurationsdateien an das Guacamole erwartet:
mkdir /etc/guacamole
und erstellen die Server-Konfigurationsdatei:
guacamole.properties
Nun erstellen wir die Datei:
nano /etc/guacamole/guacamole.properties
Inhalt ist nur diese eine Zeile:
basic-user-mapping: /etc/guacamole/user-mapping.xml
user-mapping.xml
Wir haben ja gerade zuvor die Datei angegeben in welcher die
- Benutzernamen
- Kennwörter
- verfügbare RDP / VNC / Telnet und SSH Verbindungen
konfiguriert werden. Also müssen wir die auch anlegen:
nano /etc/guacamole/user-mapping.xml
Inhalt der Datei - müsst Ihr an eure Bedürfnisse anpassen. Im Zweifelsfall löscht überflüssige Parameter. Wenn z.B. Benutzername und Password nicht angegeben werden fragt er danach.
<user-mapping>
<!-- Pro Benutzer gibt es einen Abschnitt für Benutzername, Passwort -->
<!-- und den verfügbaren Verbindungen für diesen Benutzer -->
<!-- Benutzer Administrator-->
<authorize username="admin" password="geheimesPasswort">
<!-- Verbindung 1 für Benuter admin -->
<!-- RDP - Remotedesktop-Verbindung -->
<!-- Parameter siehe https://guacamole.apache.org/doc/gug/configuring-guacamole.html#rdp -->
<connection name="Windows Server 2016 Test VM">
<protocol>rdp</protocol>
<param name="hostname">10.100.12.91</param> <!-- FQDN oder IP des Zielhost -->
<param name="port">3389</param> <!-- Port, Standard ist 3389 -->
<param name="username">Testbenutzer</param> <!-- Anmeldename / Benutzername -->
<param name="password">password123</param> <!-- Password für den Benutzer -->
<param name="domain">TEST-VM</param> <!-- Domäne des Benutzer, ggf. Hostname des Ziels -->
<param name="disable-audio">true</param> <!-- Audio-Übertragung deaktivieren -->
<param name="server-layout">de-de-qwertz</param> <!-- mit deutscher Tastatur verbinden -->
<param name="security">any</param> <!-- sonst nimmt er nur RDP und W2012R2, W2016 oder W10 funktionieren nicht-->
<param name="ignore-cert">true</param> <!-- alle Zertifikate akzeptieren -->
</connection>
<!-- Verbindung 2 für Benuter admin -->
<!-- SSH - Verbindung -->
<!-- Parameter siehe https://guacamole.apache.org/doc/gug/configuring-guacamole.html#ssh -->
<connection name="SSH Webserver">
<protocol>ssh</protocol>
<param name="hostname">192.168.42.10</param> <!-- FQDN oder IP des Zielhost -->
<param name="port">22</param> <!-- Port, Standard ist 22 -->
<param name="username">user23</param> <!-- Anmeldename / Benutzername -->
<param name="password">password123</param> <!-- Password für den Benutzer -->
</connection>
</authorize>
</user-mapping>
GUACAMOLE_HOME setzen
Die neue Version sucht in dieser Umgebungsvariablen nach dem Pfad der Konfigurationsdateien:
nano /etc/environment
und die folgende Zeile anhängen:
GUACAMOLE_HOME="/etc/guacamole"
Ein reboot an dieser Stelle schadet nicht!
Automatischen Start des Servers einrichten
Wir nehmen den Dienst in den automatischen Start auf:
systemctl enable guacd.service
Das für systemctl notwendige Startskript hat er uns ja schon beim installierten (make install) angelegt.
Fehler Dateiaustausch und Audio beheben
Guacamole kann in einer SSH oder RDP Sitzung auch Audiosignale weitereichen oder den Drucker nutzen.
Noch interessanter finde ich den Up- oder Download von Dateien aus der Sitzung, insbesondere bei RDP.
So wie wir bis jetzt installiert haben funktioniert das aber nicht da das genutzte FreeRDP 3 Plugins von Guacamole nicht finden kann.
Den Fehler beheben wir mit den nächsten Zeilen:
ln -s /usr/local/lib/freerdp/guacdr-client.so /usr/lib/x86_64-linux-gnu/freerdp/ ln -s /usr/local/lib/freerdp/guacsnd-client.so /usr/lib/x86_64-linux-gnu/freerdp/ ln -s /usr/local/lib/freerdp/guacsvc-client.so /usr/lib/x86_64-linux-gnu/freerdp/
Guacamole Client installieren
Den Client haben wir vorhin schon mit herunter geladen und müsste nun unter
/usr/src/guacamole-1.0.0.war
bereit liegen.
Kopieren wir diese an Ihren Bestimmungsort:
cp /usr/src/guacamole-1.0.0.war /var/lib/tomcat8/webapps/guacamole.war
Der Client sucht guacamole.properties
und andere Konfigurationsdateien - allerdings an einem anderen Ort als wir diese abgelegt haben.
Deshalb legen wir einen symbolischen Link dahin an:
ln -s /etc/guacamole /usr/share/tomcat8/.guacamole
Nun müssen wir den Tomcat neu starten:
systemctl restart tomcat8.service
apt install haveged
oder die Änderungen der Startparameter von Tomcat: https://askubuntu.com/questions/650482/tomcat-8-does-not-start-immediately-after-a-rebootDas mit dem Skript hat bei mir einwandfrei funktioniert. haveged wollte ich nicht installieren da es auch apparmor mit installiert.
Der erste Test
Wir starten den Dienst wieder:
systemctl start guacd.service
Wir können nun auf die Webseite des Clients zugreifen:
http://FQDN-oder-IP:8080/guacamole/
Und melden uns mit dem gerade angelegten Benutzer an:
Ein Klick auf die Verbindungen unten startet jeweils die ausgewählte Verbindung:
Mit den Zurück Button des Browser geht es wieder ins das Menü - die Verbindung bleibt dann aber erhalten. Besser ist die Sitzung richtig zu beenden, bei RDP also abmelden.
Falls der Logon-Screen nur leer ist - also keine Anmeldemaske erscheint führt als root folgendes aus:
mysql SET GLOBAL time_zone = '+1:00'; quit systemctl restart tomcat8.service
Der Fehler steht im Log:
cat /var/log/tomcat8/catalina.out | grep java.sql.SQLException
Ausgabe:
### Error querying database. Cause: java.sql.SQLException: The server time zone value 'CEST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
Das ist ein bekannter Fehler im SQL-Treiber.
Logdateien auswerten
Für den GUACD-Prozessen
Wenn mal etwas nicht wie geplant funktioniert bei einer Verbindung so können wir hierzu in das syslog schauen.
tail -f /var/log/syslog
Falls euerr Server mehr zu tun hat und das Syslog entsprechend ständig zu tun hat empfiehlt es sich die Ausgabe auf die Guacamole-Meldungen zu filtern:
tail -f -n 200 /var/log/syslog | grep guacd
Beispielausgabe beim Aufbau einer RDP-Verbindung:
May 8 10:16:54 web01 guacd[20582]: Protocol "rdp" selected May 8 10:16:54 web01 guacd[20582]: Connection ID is "$b5f8f9d9-1ab8-49bc-a5ea-970015a30a21" May 8 10:16:54 web01 guacd[20582]: Security mode: ANY May 8 10:16:54 web01 guacd[20582]: Loading keymap "base" May 8 10:16:54 web01 guacd[20582]: Loading keymap "de-de-qwertz" May 8 10:16:54 web01 guacd[20582]: Starting client May 8 10:16:54 web01 guacd[20582]: guacdr connected. May 8 10:16:54 web01 guacd[20582]: guacsnd connected. May 8 10:16:54 web01 guacd[20582]: Connected to RDPDR 1.12 as client 0x0007 May 8 10:16:54 web01 guacd[20582]: Ignoring server capability set type=0x0001, length=44 May 8 10:16:54 web01 guacd[20582]: Ignoring server capability set type=0x0002, length=8 May 8 10:16:54 web01 guacd[20582]: Ignoring server capability set type=0x0003, length=8 May 8 10:16:54 web01 guacd[20582]: Ignoring server capability set type=0x0004, length=8 May 8 10:16:54 web01 guacd[20582]: Ignoring server capability set type=0x0005, length=8 May 8 10:16:54 web01 guacd[20582]: Sending capabilities... May 8 10:16:54 web01 guacd[20582]: Capabilities sent. May 8 10:16:54 web01 guacd[20582]: Client ID confirmed May 8 10:16:58 web01 guacd[20582]: User logged on May 8 10:16:58 web01 guacd[20582]: Sending printer May 8 10:16:58 web01 guacd[20582]: Registered device 0 (Guacamole Printer) May 8 10:16:58 web01 guacd[20582]: Sending filesystem May 8 10:16:58 web01 guacd[20582]: Registered device 1 (Guacamole Filesystem) May 8 10:16:58 web01 guacd[20582]: All supported devices sent. May 8 10:16:58 web01 guacd[20582]: Device 0 (Guacamole Printer) connected successfully May 8 10:16:58 web01 guacd[20582]: Device 1 (Guacamole Filesystem) connected successfully May 8 10:17:00 web01 guacd[20582]: Accepted format: 16-bit PCM with 2 channels at 44100 Hz
Im Syslog findet Ihr Information zu den Aufbau der Verbindungen (RDP, SSH, VNC und Telnet), nicht aber zu den Anmeldungen auf dem Webinterface.
Für das Client-Plugin
Alles was mit dem Webinterface zu tun hat findet Ihr woanders:
tail -n 200 -f /var/log/tomcat8/catalina.out
Apache Reverse Proxy
So, nun wollen wir das ganze über eine Subdomain und mit SSL Verschlüsselung über https von extern erreichen.
In Apache lege ich einen neuen .vHost an und verpasse diesem ein SSL Zertifikat.
Wie das geht?
Entsprechende Datei unter /etc/apache2/sites-available anlegen:
touch /etc/apache2/sites-available/remote.znil.net.vhost
Mit dem nachfolgenden Inhalt füllen (nächster Abschnitt, erst machen!).
Ein SSL-Zertifkat könnt Ihr z.B. nach folgender Anleitung erstellen: https://thomas-leister.de/apache-webserver-ssl-verschlusselung-einrichten/
Seite aktivieren:
a2ensite remote.znil.net.vhost
und den Apache neu starten:
systemctl restart apache2.service
Ich benutze für das ganze ISPConfig und bearbeite die .vhost dann nur noch manuell.
Apache .vhost anpassen
Hinweis: Leider macht die ein oder andere Firmenfirewall ärger bei der Verbindung zu Guacamole. Insbesondere solche die den Datenverkehr trotz SSL zerlegen und überwachen. Es kann helfen wenn man den proxy_wstunnel und dessen Konfiguration, also den Abschnitt <Location /websocket-tunnel>
weglässt, dann wird nur "normales" http verwendet.
Auf eurem Apache müssen die Module für den Proxy und das Rewrite aktiv sein, falls das noch nicht der Fall ist:
a2enmod rewrite a2enmod proxy_http a2enmod ssl a2enmod proxy_wstunnel
Da ich das ganze unter einer Subdomain betreibe habe ich für diese eine eigene .vhost Datei
nano /etc/apache2/sites-available/remote.znil.net.vhost
Wenn ihr das ohne macht bzw. das ganze in einem virtuellen Verzeichnis haben wollt müsst ihr ggf. die Standard .vhost von Apache anpassen.
Den Inhalt der .vhost ändere ich wie folgt:
<VirtualHost 10.100.12.10:80> ServerName remote.znil.net ServerAdmin webmaster@znil.net RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] </VirtualHost> <VirtualHost 10.100.12.10:443> ServerName remote.znil.net ServerAdmin webmaster@znil.net SSLEngine on SSLProtocol All -SSLv2 -SSLv3 SSLCertificateFile /var/www/clients/client0/web14/ssl/remote.znil.net.crt SSLCertificateKeyFile /var/www/clients/client0/web14/ssl/remote.znil.net.key SSLCertificateChainFile /var/www/clients/client0/web14/ssl/remote.znil.net.bundle ProxyPass / http://10.100.12.10:8080/guacamole/ flushpackets=on ProxyPassReverse / http://10.100.12.10:8080/guacamole/ ProxyPassReverseCookiePath /guacamole / <Location /websocket-tunnel> Order allow,deny Allow from all ProxyPass ws://10.100.12.10:8080/guacamole/websocket-tunnel ProxyPassReverse ws://10.100.12.10:8080/guacamole/websocket-tunnel </Location> SetEnvIf Request_URI "^/tunnel" dontlog CustomLog /var/log/apache2/guac.log common env=!dontlog </VirtualHost>
Ihr müsstet folgendes anpassen:
- IP-Adresse eures Apache Servers
- Name eurer Subdomain
- Pfad zu den SSL-Dateien
- IP-Adresse zum Guacamole-Server
Nach einem Neustart des Apache
systemctl reload apache2.service
könnt Ihr nun über eben diese darauf zugreifen:
https://remote.znil.net
Bedienung von Guacamole
Wenn Ihr in einer Sitzung seit (egal ob RDP, SSH, VCN oder Telnet) drückt einmal die Tastenkombination
- STRG - ALT - SHIFT
Dann erscheint ein Menü mit weiteren Punkten und z.B. einer Zwischenablage oder der Möglichkeit die Verbindung auch einfach nur zu trennen:
Umbau auf MySQL Datenbank
Immer wenn wir einen neuen Host hinzufügen wollen oder einen Benutzer oder sogar beides müssen wir jedesmal die
nano /etc/guacamole/user-mapping.xml
bearbeiten - und dann mit
systemctl restart tomcat8.service
alles neu starten - wobei aktive Verbindungen unterbrochen werden usw. ... und gerade bin ich an einem & in der XML Datei fast verzweifelt ....
Wenn wir Gucamole mit MySQL verbinden können wir die Konfiguration dynamisch ohne Neustart ändern - und das ganze auch noch in der Weboberfläche machen.
Also her damit!
MySQL installieren
Falls es noch nicht auf eurem Server ist muss MySQL erst einmal installiert werden:
apt-get install mysql-server mysql-client
MySQL Extension herunterladen und entpacken
Also, wir haben hier die Version
1.0.0
installiert - also brauchen wir auch die Extension in der passenden Version dazu:
https://guacamole.apache.org/releases/1.0.0/
Also wechseln wir wieder in src' Verzeichnis und laden es direkt herunter:
cd /usr/src/ wget http://mirror.ibcp.fr/pub/apache/guacamole/1.0.0/binary/guacamole-auth-jdbc-1.0.0.tar.gz tar xvzf guacamole-auth-jdbc-1.0.0.tar.gz cd guacamole-auth-jdbc-1.0.0/mysql/
Lib-Dateien kopieren
Die Datei guacamole-auth-jdbc-mysql-1.0.0.jar
aus dem Unterverzeichnis
/usr/src/guacamole-auth-jdbc-1.0.0/mysql/
müssen in das Erweiterungsverzeichnis kopieren.
Standard ist
GUACAMOLE_HOME/extensions
Hier also
/etc/guacamole/extensions
also dorthin damit:
mkdir /etc/guacamole/extensions cp /usr/src/guacamole-auth-jdbc-1.0.0/mysql/guacamole-auth-jdbc-mysql-1.0.0.jar /etc/guacamole/extensions/
MySQL Connector herunterladen und kopieren
Guacamole braucht unbedingt eine
mysql-connector-java-x.x.xx-bin.jar
die wir leider erst einmal haben müssen. In der offziellen Anleitung wird der Hinweis auf die MySQL Homepage gegeben: https://dev.mysql.com/downloads/connector/j/
cd /usr/src/ wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.13.tar.gz tar xvzf mysql-connector-java-8.0.13.tar.gz mkdir /etc/guacamole/lib cp /usr/src/mysql-connector-java-8.0.13/mysql-connector-java-8.0.13.jar /etc/guacamole/lib/
MySQL Datenbank und Benutzer anlegen
Nun brauchen wir noch eine Datenbank mit passenden Benutzer dazu:
mysql -u root -p -e "create database guacamole" mysql -u root -p -e "grant all on guacamole.* to guacamole@localhost identified by 'guacamole'"
Es gibt nun also die Datenbank guacamole auf die der Benutzer guacamole mit dem Passwort guacamole Zugriff hat.
Keine Angst - der kann nur local auf die Datenbank zugreifen, ein Zugriff aus dem Internet ist nicht möglich.
Schema in MySQL importieren
Die liegen unter
/usr/src/guacamole-auth-jdbc-1.0.0/mysql/schema
und müssen nur importiert werden - am besten gleich unter unserem neu anlegten Benutzer:
mysql -uguacamole -pguacamole guacamole < /usr/src/guacamole-auth-jdbc-1.0.0/mysql/schema/001-create-schema.sql mysql -uguacamole -pguacamole guacamole < /usr/src/guacamole-auth-jdbc-1.0.0/mysql/schema/002-create-admin-user.sql
guacamole.properties an MySQL anpassen
Nun müssen wir noch die Konfigurationsdatei ändern.
nano /etc/guacamole/guacamole.properties
und den Inhalt wie folgt ändern (alles andere löschen):
# MySQL properties
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole
mysql-username: guacamole
mysql-password: guacamole
Nun noch den Tomcat neu starten:
systemctl restart tomcat8.service
An der Webseite Anmelden
Wir melden uns nun an der Guacamole Webseite folgenden Daten an:
Benutzername: guacadmin Passwort: guacadmin
Oben Rechts ist das Menü in welchem Ihr die Settings aufrufen solltet:
Geht dann auf den Reiter Einstellungen:
Dort verpasst Ihr diesem erst einmal ein neues Passwort:
Ich empfehle einen neuen Administrations-Benutzer anzulegen und den guacadmin zu löschen oder zu deaktivieren.
LDAP / Active Directory Authentifizierung
In früheren Version von Guacamole musste man das Schema des Active Directory / LDAP erweitern und die Verbindungsdaten zu den Servern wurden bei den Benutzern in Eigenschaften gespeichert.
War mir zu umständlich. In den neueren Versionen kann man LDAP auch nur für die Authentifizierung nehmen und die Verbindungsdaten weiterhin in der MySQL Datenbank speichern - viel besser.
Die lokalen Benutzer funktionieren parallel zu den LDAP-Benutzern.
Plugin LDAP installieren
Der erste Schritt ist also das Ihr wie zuvor beschrieben den Umbau auf die MySQL-Datenbank vornehmen. Wenn Ihr das gemacht habt und es funktioniert könnt Ihr in diesem nächsten Schritt auf LDAP erweitern.
Dazu müssen wir eine weitere Guacamole-Extension herunterladen und installieren.
Also wechseln wir wieder in src' Verzeichnis und laden es direkt herunter:
cd /usr/src/ wget http://mirror.ibcp.fr/pub/apache/guacamole/1.0.0/binary/guacamole-auth-ldap-1.0.0.tar.gz tar xvzf guacamole-auth-ldap-1.0.0.tar.gz cp /usr/src/guacamole-auth-ldap-1.0.0/guacamole-auth-ldap-1.0.0.jar /etc/guacamole/extensions/
Jetzt müssen wir den Zugriff auf das Active Directory / LDAP konfigurieren:
nano /etc/guacamole/guacamole.properties
und fügt die folgenden Zeilen hinzu, die Daten für die SQL-Datenbank NICHT löschen!:
#LDAP Einstellungen für Active Directory
#IP-Adresse oder DNS-Name eines Domänencontrollers
ldap-hostname: 10.100.12.50
#Port Nummer von LDAP, 389=unverschlüsselt
ldap-port: 389
#Verschlüsslungsmethode für LDAP-Verbindung
ldap-encryption-method: none
#DN des Benutzer der für die Abfrage genutzt werden
ldap-search-bind-dn: CN=ldapSearch,OU=Funktionsbenutzer,DC=znil,DC=local
#Passwort des Benutzers der für die Abfrage genutzt werden soll
ldap-search-bind-password: eingeheimesPasswort
#Startpunkt für die Suche im Active Directory
ldap-user-base-dn: DC=znil,DC=local
#Mit welcher Eigenschaft soll der Benutzername verglichen werden?
ldap-username-attribute: samAccountName
#Verknüpfungen bei der LDAP-Abfrage nicht folgen (mit true funktioniert es gegen ein AD nicht)
ldap-follow-referrals: false
# Timeout für die Abfrage, für z.B. duo.com erhöhen
ldap-operation-timeout: 30
Als Benutzer der für die Verbindung zum AD reicht ein normaler Benutzer ohne besondere Rechte. Ihr sollten dafür extra einen anlegen.
Den DN des Benutzer bekommt ihr wie folgt raus:
- Eingabeaufforderung (DOS-Box) auf einem Domänencontroller öffen
dsquery user -name Benutzername
Wenn Ihr die Datei speichert und den Tomcat wieder neu startet:
systemctl restart tomcat8.service
solltet Ihr euch mit jedem beliebigen Domänen-Benutzer am Guacamole anmelden können (habt aber noch keine Verbindungen).
Zugriff auf OU beschränken
Wollte Ihr das nur Benutzer unterhalb einer bestimmten OU sich anmelden können so ändert die folgenden Zeile:
ldap-user-base-dn: DC=znil,DC=local
auf den DN der OU unterhalb der die Benutzer abgelegt sind.
Zugriff auf Mitglieder einer AD-Gruppe beschränken
Wenn Ihr die folgenden Zeilen ergänzt können nur noch Mitglieder dieser Gruppe sich am Guacamole anmelden:
#Bei Bedarf: Nur Mitglieder einer bestimmten Gruppe dürfen sich anmelden ldap-user-search-filter: (&(objectClass=*)(memberOf=CN=duocomradius,OU=4.Funktionsgruppen,DC=znil,DC=local))
Den Wert hinter memberOf=
müsst Ihr mit dem DN eurer Gruppe ersetzen.
Den könnt Ihr genauso wie die DN des Benutzers abfragen:
dsquery group -name Gruppenname
Den AD-Benutzer / LDAP-Benutzern Verbindungen zuweisen
Die Benutzer aus dem Active Directory können sich zwar nun alle am Guacamole anmelden - haben aber noch keine Verbindungen.
Diese können wir wie folgt zuweisen:
- Ihr erstellt einen neuen lokalen Benutzer in der Guacamole-Administrationkonsole
- Dieser muss den gleichen Benutzernamen / Anmeldennamen wie im AD haben
- Das Passwort ist egal - lang und zufällig
- Dem Benutzer könnt Ihr die Verbindungen ganz unten zuweisen ODER ihn zum Mitglied in den lokalen Gruppen machen denen Ihr die Verbindungen zuweist.
Bei der Anmeldung prüft Guacamole zuerst ob es einen LDAP-Benutzer findet und ob das Passwort für diesen funktioniert.
Gibt es den Namen auch in der lokalen MySQL-Datenbank so nimmt er die Einstellungen dazu.
2FA Google Authenticator Unterstützung TOTP
Hinweis:Diese Modul funktioniert nur in Verbindung mit der Benutzung einer Datenbank für die Benutzerauthentifizierung, nicht mit anderen Methoden wie der .xml Datei oder LDAP.
Dazu müssen wir eine weitere Guacamole-Extension herunterladen und installieren.
Also wechseln wir wieder in src' Verzeichnis und laden es direkt herunter:
cd /usr/src/ wget http://mirror.ibcp.fr/pub/apache/guacamole/1.0.0/binary/guacamole-auth-totp-1.0.0.tar.gz tar xvzf guacamole-auth-totp-1.0.0.tar.gz cp /usr/src/guacamole-auth-totp-1.0.0/guacamole-auth-totp-1.0.0.jar /etc/guacamole/extensions/
Das war es schon - nun den Tomcat einmal neu starten:
systemctl restart tomcat8.service
Wenn Ihr euch nun neu an der Guacmole-Webseite anmeldet erscheint der QR-Code zum abscannen:
Eure App wird das dann als "Apache Guacamole" erkennen.
Wer da einen eigenen Namen hinterlegen will, z.B. "Musterfirma" macht einen Eintrag in die
nano /etc/guacamole/guacamole.properties
und folgendes Ergänzen (zusätzlich zur Datenbank-Konfiguration!):
## TOTP-Einstellungen #Bezeichnung des Codes in der App totp-issuer: remote.znil.org #Anzahl der Zahlen totp-digits: 6 #Neuer Code alle xx Sekunden totp-period: 30 # Hash Algorithmus - "sha1", "sha256" oder "sha512" totp-mode: sha1
In der App erscheint bei obigen Einstellungen der Eintrag als
remote.znil.org - Benutzername
Siehe auch die offizielle Anleitung zu dem Thema: https://guacamole.apache.org/doc/gug/totp-auth.html
Duo 2-Faktor Authentifizierung
Dafür gibt es wieder ein eigenes Plugin. Dieses arbeitet mit allen Methoden (XML, MySQL, LDAP) zusammen.
wget http://mirror.ibcp.fr/pub/apache/guacamole/1.0.0/binary/guacamole-auth-duo-1.0.0.tar.gz tar xvzf guacamole-auth-duo-1.0.0.tar.gz cp /usr/src/guacamole-auth-duo-1.0.0/guacamole-auth-duo-1.0.0.jar /etc/guacamole/extensions/
Dann Installiert Ihr pwgen
apt install pwgen
und erzeugt einen neuen Schlüssel den Ihr euch wegkopiert:
pwgen 40 1 nooy1eij5uaxe4die1ohWah2iey9vaiy8seiK5Tu
Auf Duo.com fügt Ihr die Application "Web SDK" hinzu:
dann
nano /etc/guacamole/guacamole.properties
und den folgenden Abschnitt hinzufügen:
##Duo Security
duo-integration-key: XXXXXXXXXXXXXXXXXXXX
duo-secret-key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
duo-api-hostname: api-xxxxxxxxx.duosecurity.com
duo-application-key: nooy1eij5uaxe4die1ohWah2iey9vaiy8seiK5Tu
Beim letzten Eintrag fügt Ihr den zuvor erfolgten Schlüssel ein. Es geht nur darum das jeden Anwendung die auf Duo zugreift einen eindeutigen Schlüssel braucht.
Dateiaustausch in Remotedesktop Sitzungen
Eine richtig tolles Feature ist der Dateiaustausch bei RDP-Sitzungen.
Obwohl das ganze in einem eingeschränktem Webbrowser läuft bekommt man so sehr leicht eine Datei hoch- oder runtergeladen.
Vorbereitung
Wir benötigen mindestens einen Ordner auf unserem Linux-Host für den Dateiaustausch:
mkdir /home/tausch chmod 777 /home/tausch
Der Benutzer unter dem der Dienst guacd
läuft muss volle Zugriffsrechte auf diesen Ordner haben.
Wenn Ihr nichts geändert habt läuft der Dienst als Benutzer root - und habt auch als dieser den Ordner angelegt.
Konfiguration der Verbindung
In einer RDP-Verbindung wählen wir nun folgende Optionen
Enable drive .............: X Drive path ...............: /home/tausch Automatically create drive: X
Das ist schon alles. Sind wir nun Verbunden wird uns der Ordner unter dem Arbeitsplatz angezeigt:
Zum Testen zieht nun einfach eine Datei in das Browserfenster:
Die Dateien erscheinen dann innerhalb des Ordners - ggf. einmal F5 drücken.
Wollt Ihr eine Datei herunterladen so schiebt diese einfach in den Order Download:
Er lädt die Datei dann runter und mit dem Klick auf den Link könnt Ihr diese lokal speichern.
Kommentare