Guacamole: Eine HTML5 Remote-Access Applikation

Guacamole by guac-dev.org

Changelog

  • 20. April 2015 – Version 0.9.6

Ein zu lange nicht mehr erwähnter Kandidat in der HTML5-Welt hat Version 0.9.4 0.9.6 erreicht und verzückt mit einem „completely new interface“.
Guacamole machte in den letzten Monaten gewohnt große Schritte.

Guacamole ist eine HTML5 Remote-Access Applikation, die als zentrale Verwaltungskonsole entfernter Computer verwendet werden kann.
Unterstützt werden derzeit die Protokolle VNC, RDP, SSH wie auch Telnet.

Guacamole Login
Guacamole Login

Guacamole RDP Sitzung
Guacamole RDP Sitzung
Guacamole Serverliste
Guacamole Serverliste

Mit Version 0.9.6 ist die Verwendung von WebSockets nun auch fester Bestandteil, was besonders bei grafisch aufwendigen Verbindungen bemerkbar wird.

Die Pakete aus den Repositories kommen mit den Versionssprüngen oft nicht nach.
Nur mit Geduld und etwas Aufwand lassen sich auch hauseigene Pakete aus Debian und Ubuntu letztendlich vernünftig nutzen.

Die Installation aus den Quellen ist zum Glück nicht allzu kompliziert, weshalb ich sie hier kurz beschreiben möchte.

Aufbau und Anforderung

Getestet habe ich die Installation auf einem Debian Jessie amd64-System. Mit Ubuntu wird es sich gleich/ähnlich halten, Debian Wheezy möchte ich nicht ausschließen, kann aber wegen älterer Bibliotheken nicht dafür garantieren. Möchte jemand berichten?

Die Web Application ist vom Entickler distributionsübergreifend im Binärformat verfügbar, ebenso verhält es sich mit Tomcat in Version 7, der aus den Paketquellen installiert werden kann.

Insgesamt besteht Guacamole aus drei Komponenten:
Guacamole Server (Standard: 127.0.0.1:4722/tcp)
Tomcat Server (Standard: 0.0.0.0:8080/tcp)
Guacamole Client / Web Application

Mein unliebstes Sorgenkind Tomcat empfehle ich hinter einem Reverse Proxy zu „verstecken“.
Das beruhigt nicht nur das Gemüt, sondern erspart auch die nervenaufreibende Konfiguration. Bitte beachtet hierzu die Hinweise zum Ende des Artikels!

Installation

Für die gesamte Bandbreite an Protokollen für den Fernzugriff, die da wären VNC, RDP, SSH wie auch Telnet, verlangt das System folgende Abhängigkeiten:

apt-get install build-essential tomcat7 libpng12-dev libossp-uuid-dev libpulse-dev libcairo2-dev libssl-dev libvncserver-dev libvorbis-dev libtelnet-dev libssh2-1-dev libpango1.0-dev libfreerdp-dev

Ich arbeite im Verzeichnis ~/build, lade und entpacke dorthin die erfolderlichen Dateien:

mkdir ~/build ; cd ~/build
wget --content-disposition -O - http://sourceforge.net/projects/guacamole/files/current/source/guacamole-server-0.9.6.tar.gz/download | tar xfvz -
wget --content-disposition -O - http://sourceforge.net/projects/guacamole/files/current/source/guacamole-client-0.9.6.tar.gz/download | tar xfvz -
wget --content-disposition http://sourceforge.net/projects/guacamole/files/current/binary/guacamole-0.9.6.war/download

Die Installation des Guacamole Servers:

cd guacamole-server*
./configure --with-init-dir=/etc/init.d
make
make install
# Einige freerdp Libs musste ich hierher verknüpfen:
mkdir /usr/lib/x86_64-linux-gnu/freerdp/
ln -s /usr/local/lib/freerdp/*.so /usr/lib/x86_64-linux-gnu/freerdp/
ldconfig # Die Bibliotheken neu einlesen

Im Anschluss die WebApp an den vorgesehen Ort des Tomcat Servers kopieren, um die weitere Verarbeitung kümmert sich der Server eigenständig:

cp ~/build/guacamole-0.9.6.war /var/lib/tomcat7/webapps/guacamole.war

Als Anweisung für die WebApp werden zwei wichtige Dateien benötigt:

  • Die Benutzer- und Verbindungsverwaltung erfolgt durch die Datei user-mapping.xml.
  • guacamole.properties stellt Informationen bereit, wie die Verbindung zum Daemon guacd hergestellt werden soll.

Beide Dateien werden nach /etc/guacamole/ kopiert, entsprechende Links für den Zugriff durch die WebApp sind symbolisch:

mkdir {/etc/guacamole,/usr/share/tomcat7/.guacamole}
cp ~/build/guacamole-client-0.9.6/guacamole/doc/example/{guacamole.properties,user-mapping.xml} /etc/guacamole/
ln -s /etc/guacamole/guacamole.properties /usr/share/tomcat7/.guacamole/guacamole.properties

Bevor die Dienste neugestartet werden, bitte noch die Konfiguration durchführen.

Konfiguration

Zu beiden oben erwähnten Konfigurationsdateien guacamole.properties sowie user-mapping.xml, besteht noch die Möglichkeit, den Daemon guacd anzupassen.
Dabei handelt es sich um die (Achtung: nicht-existente) Datei /etc/guacamole/guacd.conf.
Das Vorhandensein dieser Konfiguration ist optional!
Die Standardkonfiguration sieht vor, dass der Daemon sich auf localhost:4822/tcp bindet.
Zudem ließe sich SSL aktivieren, um die Verbindung des Guacamole Clients zum Server zu verschlüsseln. Für gewöhnlich befinden sich beide Komponenten auf einer Maschine, was diesen Schritt womöglich überflüßig macht.
Bedenkt, dass dies nicht die Kommunikation des Browsers zum Guacamole Client betrifft.
Ich überspringe diese Konfiguration. Alle (wenigen) Parameter und deren Bedeutungen sind in der man page man guacd.conf zu finden.

Die erste notwendige Anpassung betrifft die Datei /etc/guacamole/guacamole.properties.
Etwaige Anmerkungen stehen im Snippet.
basic-user-mapping sollte wie unten angepasst werden, es sei denn, die Datei wurde an einen anderen Ort kopiert.

/etc/guacamole/guacamole.properties:

# Hostname and port of guacamole proxy
# Anmerkung: Wie erwähnt handelt es sich hierbei um die korrekten Standardwerte.
guacd-hostname: localhost
guacd-port:     4822
# Auth provider class (authenticates user/pass combination, needed if using the provided login screen)
# Anmerkung: Die Authentifizierung und Zuweisung von Verbindungen mit einer Datei verwalten.
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
basic-user-mapping: /etc/guacamole/user-mapping.xml

Last und auch fast least, ein Beispiel für /etc/guacamole/user-mapping.xml.

/etc/guacamole/user-mapping.xml:

<user-mapping>
    <authorize username="guacadmin"
               password="ich-bin-ein-md5-hash"
               encoding="md5">
        <connection name="windowssrv.domain.local">
            <protocol>rdp</protocol>
            <param name="hostname">einwindowssrv</param>
            <param name="port">7894</param>
            <param name="username">user019</param>
            <param name="password">plaintextpasswort</param>
        </connection>
        <connection name="meinlogserver">
            <protocol>ssh</protocol>
            <param name="hostname">192.168.123.32</param>
            <param name="port">22</param>
            <param name="username">root</param>
            <param name="private-key">-----BEGIN RSA PRIVATE KEY-----
ICHBINEINKEYFILE
-----END RSA PRIVATE KEY-----</param>
        </connection>
    </authorize>
</user-mapping>

Vorab: Die Datei kann durch ein simples chown tomcat7: /etc/guacamole/user-mapping.xml ; chmod 600 /etc/guacamole/user-mapping.xml vor fremden Zugriff gesichert werden.

Bitte versteht, dass ich nicht auf sämtliche Parameter eingehen kann.
Das XML-Format ist selbsterklärend, die Dokumentation hierzu ausführlich.
Oben ist zur Veranschaulichung ein Klartext-Passwort hinterlegt, bitte nehmt euch daran ein schlechtes Beispiel.
Es soll zeigen, dass es möglich- aber nicht ratsam ist.
Beim Verzicht auf Daten wie „username“ oder „password“, werden diese erfragt.

Es dürfen viele „authorize“-Tags bestehen, in ihnen verschiedenste „connection“-Tags mit unterschiedlichsten Parametern.
Ein „private-key“ Parameter wird wider Erwarten nicht als Pfad zu einer Datei-, sondern im Klartext eingetragen.

Weitere Authentifierungsmethoden – etwa LDAP – sind ebenso möglich.

Dienst starten und verwenden

Nachdem eine überraschend geringe Anzahl an Konfigurationsdateien angepasst wurde, möchten Tomcat und der Guacamole Server neugestartet werden:

service tomcat restart
service guacd restart

Die Login-Maske steht unter der Adresse http://1.2.3.4:8080/guacamole bereit.

Ist euer Server ein Freigänger („im Netz“), sollte er bestmöglich vor fremdem Zugriff geschützt werden.

Apaches HTTPd und Apaches Tomcat verstehen sich besonders gut, das dürfte keine große Überraschung sein.
Wie der Apache HTTP Server als Proxy für Tomcat zu verwenden ist, beschreiben die Entwickler hier.

Achtung: In jedem Fall ist das Buffering des Proxys abzuschalten!
Während Apaches HTTP Server die Anweisung flushpackets="on" versteht, kennt Nginx es als proxy_buffering off;.

Eine simple „um-NAT-ung“ des Ports 8080 (ohne weitere Konfiguration), schadet der WebSocket-Verbindung und ist nicht zu empfehlen!

13 Antworten auf “Guacamole: Eine HTML5 Remote-Access Applikation

  1. hemanth kumar

    Hi kindly help !!!
    I am trying to connect to Windows 7 using rdp its not working for me. I am using GUACAMOLE 0.9.9
    and FreeRDP version 1.0.2. This is my usermapping.xml

    rdp
    localhost
    3389
    root–>

    rdp
    172.16.0.9
    7894
    <!–123456 –>

    rdp
    172.16.0.9
    3389
    any
    User
    123456

    rdp
    172.16.0.11
    3389
    rdp
    true
    <!– false
    Viju
    123456–>

    rdp
    172.16.0.9
    3389
    User
    123456

  2. hemanth kumar

    Hi I am trying to connect to Windows 7 using rdp its not working for me. I am using GUACAMOLE 0.9.9
    and FreeRDP version 1.0.2. This is my usermapping.xml

    rdp
    localhost
    3389
    root–>

    rdp
    172.16.0.9
    7894
    <!–123456 –>

    rdp
    172.16.0.9
    3389
    any
    User
    123456

    rdp
    172.16.0.11
    3389
    rdp
    true
    <!– false
    Viju
    123456–>

    rdp
    172.16.0.9
    3389
    User
    123456

  3. Joomo

    Gibt es eine Möglichkeit die Übersicht der VNC-Verbindungen so zu konfigurieren, dass man einer Verbindung anderen Verbindungen unterordnen kann.
    Hintergrund: Ich habe mehrere Rechner auf denen mehrer VMs laufen. Die möchte ich ganz gerne dem Host hierarchisch in der Verbindungsübersicht unterordnen.

    Viele Grüße

  4. Torsten

    Hi Andre, ich habe den guacamole server mal nach deiner Anleitung installiert.
    Hat ganz gut geklappt der Port 8008 fürs webinterface hat mich nur was irritiert, müsste doch bestimmt 8080 sein, oder?

    Habe in meinem lokalen Netzwerk ne ssh Verbindung hinzugefügt, hat auch geklappt.
    Mit der rdp Verbindung klappt es leider nicht. :/
    Habe mir mal den syslog angeguckt, habe das hier gefunden kann aber nicht viel damit anfangen.

    guacd[2807]: Protocol „rdp“ selected
    guacd[2807]: Connection ID is „$00173647231-a7643-4612-9643-67324724“
    kernel: [ 777.261020] guacd[2807]: segfault at 0 ip 00007f8868070d91 sp 00007ffd2d3dd7a8 error 4 in libc-2.13.so[7f8867ff1000+181000]

    Hast du da vielleicht einen Tipp für mich?
    Danke

        1. Torsten

          Mit Jessie funktioniert die rdp Verbindung.

          Würde mich nur mal interessieren welche Bibliotheken ich für wheezy aktualisieren muss damit es damit auch funktioniert.

          1. André P. Autor

            Okay, das macht es schon mal einfacher.
            Ich bin mir fast sicher, dass es „libfreerdp“ ist. Werde mich jetzt mal ranmachen und es auf einem Wheezy System testen. Gib mir nur etwas Zeit, mich hat die Magen-Darm-Grippe erwischt…

            1. Torsten

              Ja klar, kein Stress.
              Gute Besserung.
              Meinste ich kriege auch stunnel vor Tomcat gepackt anstatt Apache? Muss ich mal testen.
              Deine Seite hier gefällt mir echt gut, du gibst gute Tipps.

              Danke

              1. André P. Autor

                Danke! :-)
                Ich habe gestern libfreerdp aus dem Git gezogen und gebaut, komme aber immer noch nicht dazu, es endlich mal zu testen… Aus den Backports bekommst du die Library leider nicht. Aber vielleicht ist es ja auch was anderes, erst mal abwarten.

  5. Elinoy

    Interessant mal zu hören, dass auch andere das Nutzen =D

    Ich verwende aktuell noch die Version 0.8.3, da die bei Trusty paketiert dabei ist. Da du eher die Installation beschreibst und wenig auf die Features eingehst: Klappt mittlerweile strg+c|v per ssh?

    Wenn du als einziger die Guacamole-Installation nutzt, empfiehlt es sich übrigens die NoAuth-Erweiterung und Basic-Auth vom Reverse-Proxy. Allerdings eben wirklich nur wenn niemand das mitnutzt, da man bei dem Setup die aktiven Sessions einfach klauen kann.

    1. André P. Autor

      Ist ganz cool, habe es leider aus den Augen verloren, nachdem ich vor einer längeren Zeit davon las. :-)

      Copy/Paste vom lokalen Gerät zum Server? Dafür musst du den Umweg über das Menü gehen, das du mit Strg+Alt+Shift aufrufst.

      Hast du schon mal die MySQL Auth. ausprobiert? Klingt recht interessant, hier erscheint dann auch ein Menü, in dem Benutzer angelegt werden können etc.

      Aber du hast schon Recht, solange ich es ausprobiere, werde ich wohl auf die NoAuth Variante umschwenken.

      Viele Grüße

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.