Apache Guacamole, Teil 1: Grundlagen und Installation unter CentOS 7

Leser meines Blogs wissen, dass ich seit vielen Jahren schon ein Homelab pflege, in welchem ich gerne die Produkte einsetze, mit denen ich beruflich zu tun habe. Es ist einfach praktisch, schon privat Hands-on Erfahrung sammeln zu können und Dinge von Grund auf zu verstehen. Um von unterwegs auf meine Umgebung zugreifen zu können, habe ich in den letzten Jahren auf eine VPN-Lösung gesetzt. Gelegentlich stößt man aber immer wieder mal auf Netze, in denen auch ausgehende Ports stark reglementiert sind (z.B. lediglich HTTP/HTTPS erlaubt). Anstatt den Standardport meiner VPN-Lösung zu verwenden hatte ich einen entsprechenden High Port gewählt, um den häufigsten Bruteforce-Attacken aus dem Weg zu gehen.

Das Verwenden des Standard-Ports war keine Wahl, also war ich auf der Suche nach einer Alternative. In einer Schulung habe ich zufällig von Apache Guacamole erfahren, welches genau das bietet, was ich benötige. Das Tool bietet eine HTML5-Oberfläche, über welche Remote-Sessions gestartet werden können. Die folgenden Protokolle werden unterstützt:

  • VNC
  • RDP
  • SSH
  • Telnet

Die einzelnen Verbindungskonfigurationen und Benutzer werden in einer der folgenden Datenbanken gespeichert:

  • MySQL bzw. MariaDB
  • PostgreSQL
  • Microsoft SQL

Es gibt zahlreiche Erweiterungen, die die Software erweitern – beispielsweise um LDAP- oder Zwei-Faktor-Authentifizierung.

Architektur

Guacamole besteht im wesentlichen aus mehreren Komponenten:

Guacamole-Architektur

  • Guacamole Server (Tomcat Servlet Container)
  • Guacamole Proxy Server (guacd), stellt Verbindungen zu Remote Hosts her
  • Remote Hosts – mit oben erwähnten Protokollen

Ein Guacamole Server kann mehrere Proxy-Server kontaktieren. So lassen sich beispielsweise mit einem Frontend zahlreiche Desktops in unterschiedlichen Netzwerksegmenten verwenden – was auch beim Design der Firewall-Regeln nicht unerheblich sein dürfte:

Komplexes Setup mit mehreren Proxy-Servern

In diesem Beispiel werden Guacamole Server und der dazugehörige Proxy auf einem System installiert, als Datenbank kommt MariaDB zum Einsatz.

Installation

Vorab werden benötigte Pakete installiert – neben Tomcat- und MariaDB-Server werden auch eine Java-Bibliothek für MySQL und eine Terminal-Schriftart benötigt. Anschließend werden die Tomcat-, MariaDB- und Guacamole Proxy-Server für Autostart konfiguriert:

# yum install tomcat mariadb{,-server} guacd libguac{,-client*} mysql-connector-java dejavu-sans-mono-fonts
# systemctl enable tomcat
# systemctl enable mariadb ; systemctl start mariadb
# systemctl enable guacd ; systemctl start tomcat

Der Guacamole Server steht bereits vorkompiliert als WAR-Datei (Web Application Archive) zur Verfügung. Die Datei wird heruntergeladen und und nach /var/lib/tomcat/webapps kopiert:

$ wget 'http://apache.org/dyn/closer.cgi?action=download&filename=guacamole/0.9.14/binary/guacamole-0.9.14.war' -O guacamole-0.9.14.war
# cp guacamole-0.9.14.war /var/lib/tomcat/webapps/guacamole.war

Vor dem Download empfiehlt es sich zu überprüfen, ob es bereits eine neuere Version gibt!

Beim Start des Tomcat-Servers wird die Datei automatisch entpackt und die Anwendung so bereitgestellt. Vor der Inbetriebnahme empfiehlt es sich, die MariaDB-Installation abzusichern:

# mysql_secure_installation
...
Set root password? [Y/n] y
...
Remove anonymous users? [Y/n] y
...
Disallow root login remotely? [Y/n] y
...
Remove test database and access to it? [Y/n] y
...
Reload privilege tables now? [Y/n]  y

Empfehlenswert ist es auch, eine dedizierte Datenbank mit entsprechendem Benutzer und Passwort zu erstellen:

# mysql -u root -p
> CREATE USER 'pinkepank'@'localhost' IDENTIFIED BY 'password';
> CREATE DATABASE IF NOT EXISTS guac_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
> GRANT SELECT,INSERT,UPDATE,DELETE ON guac_db.* TO 'pinkepank'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
Unbedingt Datenbank-/Benutzername und Passwort dem eigenen Gusto anpassen!

Konfiguration

Die leere Datenbank muss noch mit Leben befüllt werden, damit Guacamole verwendet werden kann. Hierfür wird das guacamole-auth-jdbc-Modul benötigt – dieses wird von der Webseite hheruntergeladen und entpackt:

$ wget 'http://apache.org/dyn/closer.cgi?action=download&filename=guacamole/0.9.14/binary/guacamole-auth-jdbc-0.9.14.tar.gz' -O guacamole-auth-jdbc-0.9.14.tar.gz
$ tar xfz guacamole-auth-jdbc-0.9.14.tar.gz

Der entpackte Ordner erhält Datenbank-Schemata für MySQL, PostgreSQL und Microsoft SQL. Das entsprechende Schema wird wie folgt eingespielt:

$ cd guacamole-auth-jdbc-0.9.14/mysql
$ cat schema/*.sql | mysql -u root -p guac_db

Anschließend werden das generische MySQL Java-Modul und die Authentifizierungs-Erweiterung in die entsprechenden Ordner kopiert. Der Erweiterungsordner für Guacamole muss erst noch erstellt werden:

# mkdir -p /usr/share/tomcat/.guacamole/extensions
# cp /usr/share/java/mysql-connector-java.jar /usr/share/tomcat/lib
# cp guacamole-auth-jdbc-mysql-0.9.14.jar /usr/share/tomcat/.guacamole/extensions
# chown root:tomcat -R /usr/share/tomcat/.guacamole
# chown root:root /usr/share/tomcat/lib/mysql-connector-java.jar
# restorecon -R /usr/share/tomcat/.guacamole /usr/share/tomcat/lib

Als nächstes muss eine Konfigurationsdatei erstellt werden. Diese enthält unter anderem Verbindungsinformationen zur Datenbank:

# vi /usr/share/tomcat/.guacamole/guacamole.properties
#database settings
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guac_db
mysql-username: pinkepank
mysql-password: guacpass

#additional settings
mysql-default-max-connections-per-user: 0
mysql-default-max-group-connections-per-user: 0

Anschließend kann Tomcat gestartet werden – im Protokoll sollte das erfolgreiche Entpacken der Datei dokumentiert sein:

# systemctl start tomcat
# less /var/log/tomcat/catalina.out
...
INFO: Deployment of web application archive /var/lib/tomcat/webapps/guacamole.war has finished in 86 ms

Anschließend kann es nötig sein, einen entsprechenden Firewall-Port zu öffnen – beispielsweise mit firewall-cmd:

# firewall-cmd --add-port=8080/tcp
# firewall-cmd --add-port=8080/tcp --permanent

Wer den direkten Zugriff auf Tomcat nicht zulasen und lieber einen Reverse Proxy konfigurieren will, kann beispielsweise die folgende Apache-Konfiguration verwenden:

ProxyPass /guacamole http://localhost:8080/guacamole
ProxyPassReverse /guacamole http://localhost:8080/guacamole

Damit die notwendigen Zugriffe nicht von SELinux geblockt werden, müssen die folgenden Booleans gesetzt werden:

# setsebool -P httpd_can_network_connect 1
# setsebool -P httpd_can_network_relay

Erster Zugriff

Anschließend kann Guacamole über die URL http://hostname:8080/guacamole aufgerufen werden.

hostname ist selbstverständlicherweise noch zu ersetzen.

Apache Guacamole-Login

Rechts kann unter dem Benutzernamen ein Menü heruntergeklappt werden – mit Klicks auf Settings und Connections lassen sich die einzelnen Remote-Desktops (New Connection) hinzufügen:

Erstellen eines neuen Verbindungsprofils

Die Definition eines SSH-Profils würde beispielsweise wie folgt aussehen:

  • Edit Connection
    • Name: Profilname
    • Protocol: SSH
  • Guacamole Proxy Parameters (GUACD)
    • Hostname: localhost
    • Port: 4822
    • Encryption: Unencrypted (die Verschlüsselung mittels SSL/TLS werden wir uns in einem späteren Artikel ansehen)
  • Parameters
    • Network
      • Hostname: Hostname bzw. IP-Adresse des Hosts
      • Port: 22
    • Authentication (optional)
      • Username / Password bzw. Private Key

Neben einzelnen Profilen lassen sich auch Verbindungsgruppen erstellen – beispielsweise um Verbindungen je nach Standort oder Funktion zu gruppieren.

Nach erfolgter Konfiguration genügt im Menü ein Klick auf Home, um eine Übersicht aller verfügbaren Verbindungen anzuzeigen:

Definierte Verbindungen und Verbindungsgruppen

Ein Klick auf ein Profil startet die Remote-Verbindung:

RDP-Sitzung

Ausblick

In diesem Artikel wurde Guacamole grundlegend konfiguriert – aber natürlich gibt es noch Optimierungspotenzial. So empfiehlt es sich beispielsweise, die Kommunikation zwischen Frontend und Proxy-Server mittels SSL/TLS abzusichern. Darüber hinaus wäre der Einsatz mehrerer Proxy-Server in größeren Netzumgebungen (z.B. DMZ, LAN) von Interesse. Die einzelnen Remote-Protokolle unterstützen zahlreiche Zusatzparameter, die es noch zu entdecken gilt. All diese Themen schauen wir uns im nächsten Teil dieser Blog-Serie an – es bleibt also spannend! 🙂

Schreibe einen Kommentar