Aktionen

Ubuntu 18.04.x LTS - Guacamole HTML5 Remotedesktop Gateway installieren mit Apache Reverse Proxy

Aus znilwiki

Warning.png
Warnung: Dieser Artikel wird nicht mehr gepflegt. Zur Zeit scheint noch alles wie hier beschrieben zu funktionieren (Kommentare beachten). Es gibt nun jedoch einen neuen Artikel für Ubuntu 20.04. und der neueren Guacamole-Version ab 1.2.0



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!

Important.png
Hinweis: Wer wie ich ISPConfig für die Verwaltung einsetzt sollte vorher den Port der Management-Oberfläche vom Port 8080 auf einen anderen, z.B. 8443 verschieben. Das geht über das bearbeiten der Datei
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:
ClipCapIt-160907-132601.PNG



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


Important.png
Hinweis:Eventuell braucht es nun etwas Geduld! Bei mir hat es etwa 10 Minuten gedauert bis der Tomcat8 nach einem Restart oder dem reboot des Servers wieder ansprechbar war. Dazu gibt zum einen die Lösung apt install haveged oder die Änderungen der Startparameter von Tomcat: https://askubuntu.com/questions/650482/tomcat-8-does-not-start-immediately-after-a-reboot
Das 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/


ClipCapIt-190112-131121.PNG


Und melden uns mit dem gerade angelegten Benutzer an:

ClipCapIt-190112-131224.PNG

Ein Klick auf die Verbindungen unten startet jeweils die ausgewählte Verbindung:

ClipCapIt-190112-131720.PNG

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

Important.png

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.

Ob das mit dem Websockets möglich ist kann man unter http://websocketstest.com/ testen (vom Client der später darauf zugreifen soll


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:
ClipCapIt-160907-162035.PNG



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/
Important.png
Hinweis: Bis zur Version 0.9.5 gabe es eine extra MySQL Version - ab 0.9.6 ist diese in der JDBC-Version!




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
ClipCapIt-171102-222340.PNG


Oben Rechts ist das Menü in welchem Ihr die Settings aufrufen solltet:

ClipCapIt-190112-135300.PNG

Geht dann auf den Reiter Einstellungen:
Dort verpasst Ihr diesem erst einmal ein neues Passwort:

ClipCapIt-190112-135421.PNG

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

Important.png

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.

Sie funktioniert zwar parallel zu LDAP, die Anzeige des QR-Codes erhalten aber nur lokale Benutzer, keine LDAP Benutzer


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:

ClipCapIt-190112-170834.PNG

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:

ClipCapIt-190119-213635.PNG

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


ClipCapIt-160907-204713.PNG


Das ist schon alles. Sind wir nun Verbunden wird uns der Ordner unter dem Arbeitsplatz angezeigt:

Guacamole-Ubuntu-14.04-Apache-Reverse-Proxy-012.png


Zum Testen zieht nun einfach eine Datei in das Browserfenster:

Guacamole-Ubuntu-14.04-Apache-Reverse-Proxy-013.png

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:

Guacamole-Ubuntu-14.04-Apache-Reverse-Proxy-014.png Guacamole-Ubuntu-14.04-Apache-Reverse-Proxy-015.png


Er lädt die Datei dann runter und mit dem Klick auf den Link könnt Ihr diese lokal speichern.



Kommentare

Warning.png
Warnung: Dieser Artikel wird nicht mehr gepflegt. Zur Zeit scheint noch alles wie hier beschrieben zu funktionieren (Kommentare beachten). Es gibt nun jedoch einen neuen Artikel für Ubuntu 20.04. und der neueren Guacamole-Version ab 1.2.0


Loading comments...


Warning.png
Warnung: Dieser Artikel wird nicht mehr gepflegt. Zur Zeit scheint noch alles wie hier beschrieben zu funktionieren (Kommentare beachten). Es gibt nun jedoch einen neuen Artikel für Ubuntu 20.04. und der neueren Guacamole-Version ab 1.2.0