Guacamole-Proxy

In dieser Anleitung werden die nötigen Schritte aufgezeigt, um eine Instanz eines Apache Guacamole aufzusetzen. Dieser ermöglicht mit einem Plugin den Remote-Zugriff auf Client-PC´s eines bwLehrpool Systems innerhalb einer Institution.

Als Basis OS in diese Anleitung wird ein Ubuntu 18.04.04 LTS genutzt.

Weitere Quellen sind die Installationsanleitung mit Guacamole 1.0.0 sowie das Guacamole Manual

Guacamole installation

  • Alles als root ausgeführt
    `sudo -i`
  • Installieren der Requirements

    apt install make \
                apache2 \
                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
    • Tomcat lauscht jetzt auf port 8080
      `http://servername-oder-ip:8080`
  • Guacamole 1.1.0 nach /usr/src herunterladen

    cd /usr/src  
    wget https://artfiles.org/apache.org/guacamole/1.1.0/binary/guacamole-1.1.0.war 
    wget https://artfiles.org/apache.org/guacamole/1.1.0/source/guacamole-server-1.1.0.tar.gz
  • Sources entpacken

    tar xvzf guacamole-server-1.1.0.tar.gz
  • Configure für make

    cd /usr/src/guacamole-server-1.1.0
    ./configure --with-systemd-dir=/etc/systemd/system  
    • Config ausgabe:

      #------------------------------------------------
      guacamole-server version 1.1.0
      #------------------------------------------------
       
      Library status:
       
      freerdp2 ............ no
      pango ............... yes
      libavcodec .......... yes
      libavutil ........... yes
      libssh2 ............. yes
      libssl .............. yes
      libswscale .......... yes
      libtelnet ........... yes
      libVNCServer ........ yes
      libvorbis ........... yes
      libpulse ............ yes
      libwebsockets ....... no
      libwebp ............. yes
      wsock32 ............. no
       
      Protocol support:
       
        Kubernetes .... no
        RDP ........... no
        SSH ........... yes
        Telnet ........ yes
        VNC ........... yes
       
      Services / tools:
       
        guacd ...... yes
        guacenc .... yes
        guaclog .... yes
       
      FreeRDP plugins: no
      Init scripts: no
      Systemd units: /etc/systemd/system
       
      Type "make" to compile guacamole-server.
    • kompilieren und installieren

      make
      make install
  • Guacamole Server Service

    # update links and caches to shared libs
    ldconfig
    # after that the service is able to start
    systemctl start guacd.service
    systemctl stop guacd.service

GUACAMOLE_HOME anlegen und setzen

# GUACAMOLE_HOME dir anlegen
mkdir /etc/guacamole
 
# insert: GUACAMOLE_HOME="/etc/guacamole"
vim /etc/environment

Guacamole mit Konfigurationsbeispiel testen

Dieser Schritt ist für den produktiven Einsatz des Guacamole Client nicht notwendig, er dient lediglich dazu, die Funktionsweise mit einem einfachen User-Konfigurationsbeispiel (user-mapping.xml) zu testen.

  • guacamole.properties

    # insert: basic-user-mapping: /etc/guacamole/user-mapping.xml
    vim /etc/guacamole/guacamole.properties
  • user-mapping.xml

    # user-mappings.xml
    vim /etc/guacamole/user-mapping.xml
     
    # danach server neustarten
    systemctl restart tomcat8
    # und webseite besuchen
    # Anmeldung mit den angegebenen Daten möglich.  
    <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 Client installieren und starten

# kopiere den guacamole client an seinen bestimmungs ort 
cp /usr/src/guacamole-1.1.0.war /var/lib/tomcat8/webapps/guacamole.war
 
# verlinke die konfigurationsdateien 
ln -s /etc/guacamole /usr/share/tomcat8/.guacamole
 
# Tomcat Service neustarten
systemctl restart tomcat8.service
 
# start Guacamole Client
systemctl start guacd.service
 
# Guacamole autostart aktivieren
systemctl enable guacd.service

Guacamole Logs auswerten

  • Für Server
    tail -f -n 200 /var/log/syslog | grep guacd
  • Für Client-Plugin
    tail -n 200 -f /var/log/tomcat8/catalina.out

Apache Reverse Proxy

Auf Homepage anfallende Anfragen auf die Adresse des Guacamole-Proxy umleiten.

# Datei unter /etc/apache2/sites-available anlegen:
touch /etc/apache2/sites-available/guacamole-proxy.hs-offenburg.de.conf
 
# selbst signierte Zertifikate erstellen
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 guacamole-proxy.hs-offenburg.de.conf
 
# Apache neu starten:
systemctl restart apache2.service

.conf anpassen

Reverse Proxy Konfiguration für Apache anlegen und entsprechende Module aktivieren.

# Apache Module aktivieren
a2enmod rewrite
a2enmod proxy_http
a2enmod ssl
a2enmod proxy_wstunnel
 
# nachfolgender inhalt in .conf datei einfügen
nano /etc/apache2/sites-available/guacamole-proxy.hs-offenburg.conf

IP und URL ersetzten:

<VirtualHost IP:80>
        ServerName URL
        # ServerAdmin webmaster@znil.net
 
        RewriteEngine On
        RewriteCond %{HTTPS} !=on
        RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>
 
 
<VirtualHost IP:443>
        ServerName URL
        # ServerAdmin webmaster@znil.net
 
        SSLEngine on
        SSLProtocol All -SSLv2 -SSLv3
        SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
        SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
        # Was ist ChainFile? SSLCertificateChainFile /var/www/clients/client0/web14/ssl/remote.znil.net.bundle
 
        ProxyPass / http://IP:8080/guacamole/ flushpackets=on
        ProxyPassReverse / http://IP:8080/guacamole/
        ProxyPassReverseCookiePath /guacamole /
        <Location /websocket-tunnel>
                Order allow,deny
                Allow from all
                ProxyPass ws://IP:8080/guacamole/websocket-tunnel
                ProxyPassReverse ws://IP:8080/guacamole/websocket-tunnel
        </Location>
        SetEnvIf Request_URI "^/tunnel" dontlog
        CustomLog  /var/log/apache2/guac.log common env=!dontlog
</VirtualHost>
# nach Neustart des Apache
systemctl reload apache2.service
#via Browser zugreifen

LDAP-Plugin installieren

Authentifizieren via LDAP ermöglichen.

cd /usr/src/
wget https://artfiles.org/apache.org/guacamole/1.1.0/binary/guacamole-auth-ldap-1.1.0.tar.gz
tar xvzf guacamole-auth-ldap-1.1.0.tar.gz
 
# extensions Verzeichnis anlegen
mkdir /etc/guacamole/extensions/
cp /usr/src/guacamole-auth-ldap-1.1.0/guacamole-auth-ldap-1.1.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: Keine Whitespace vor Lineendings!

# 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:

LDAP Cert installieren

# 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 tomcat8.service

SSLExeption Outbound done in log (TODO?)

In `/var/log/tomcat8/catalina.out`

Anscheinend wird das CA_PROXY_TREE.cer ignoriert? Es macht keinen Unterschied ob ein Zertifikat angegeben ist oder nicht, jedoch ist hin und wieder die nachfolgende Exception aufgetreten.

SslFilter.java

09:18:17.522 [NioProcessor-2] WARN  o.a.d.l.c.api.LdapNetworkConnection - Outbound done
javax.net.ssl.SSLException: Outbound done
        at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:513) ~[na:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650) ~[na:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:49) ~[na:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1128) ~[na:na]
        at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:122) ~[na:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650) ~[na:na]
        at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:643) ~[na:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:539) ~[na:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$1200(AbstractPollingIoProcessor.java:68) ~[na:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.process(AbstractPollingIoProcessor.java:1222) ~[na:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.process(AbstractPollingIoProcessor.java:1211) ~[na:na]
        at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:683) ~[na:na]
        at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
        at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

BWLP Plugin installieren

# platziere das bwlp-plugin im guacamole extensions Verzeichnis
mv bwlp-guac-0.0.1-SNAPSHOT.jar /etc/guacamole/extensions/
 
# verbinde das plugin mit dem Sat, ändere hierzu die <SAT-IP>
slx-client-list-url: https://<SAT-IP>/slx-admin/api.php?do=remoteaccess

Guacamole Container Lösung

Der Guacamole Server und Client sind auch als Docker Images verfügbar.

  1. Als erstes muss der Guacamole Server (guacd) gestartet werden

    docker run --name guacd -d 
     --restart unless-stopped \
     guacamole/guacd
  2. Auf dem Host ein GUACAMOLE_HOME Verzeichnisstruktur entsprechend der folgenden Struktur anlegen. Die Zeile `slx-client-list-url: https://<SAT-IP>/slx-admin/api.php?do=remoteaccess mit der entsprechenden SAT-IP in guacamole.properties` einfügen.

    |guacamole/
    |-- guacamole.properties
    |-- extension/
    |    |-- bwlp-guac-<VERSION>.jar
  3. Danach ist ein Container des Guacamole Clients zu starten, hierbei muss für den Betrieb und die 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.

    docker run --name guacamole \
     --link guacd:guacd \
     -e LDAP_HOSTNAME=<LDAP-HOSTNAME> \
     -e LDAP_PORT=<PORT> [389|363]\
     -e LDAP_ENCRYPTION_METHOD= ["none"|"ssl"|"starttls"] \
     -e LDAP_USER_BASE_DN=<ou="",o=""> \
     -e LDAP_SEARCH_BIND_DN=<ou="",o=""> \
     -e LDAP_USERNAME_ATTRIBUTE= <DEFAULT=uid> \
     -d \
     --restart unless-stopped \
     -p 10080:8080 \
     -v /guacamole:/guacamole \
     -e GUACAMOLE_HOME=/guacamole \
     guacamole/guacamole:1.1.0
  4. Falls eine Zertifikat zum LDAP-Server erforderlich ist, muss dieses noch innerhalb des Containers manuell gesetzt werden. (TODO wie automatisch beim Containerstart berücksichtigen?)

    docker exec -it guacamole /bin/bash
    cp -p CERT.crt /usr/local/share/ca-certificates/
    update-ca-certificates
Drucken/exportieren
QR-Code
QR-Code allgemein:guacamole_installation (erstellt für aktuelle Seite)