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 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:
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:
1# yum install tomcat mariadb{,-server} guacd libguac{,-client*} mysql-connector-java dejavu-sans-mono-fonts
2# systemctl enable tomcat
3# systemctl enable mariadb ; systemctl start mariadb
4# 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:
1$ 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
2# 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:
1# mysql_secure_installation
2...
3Set root password? [Y/n] y
4...
5Remove anonymous users? [Y/n] y
6...
7Disallow root login remotely? [Y/n] y
8...
9Remove test database and access to it? [Y/n] y
10...
11Reload privilege tables now? [Y/n] y
Empfehlenswert ist es auch, eine dedizierte Datenbank mit entsprechendem Benutzer und Passwort zu erstellen:
1# mysql -u root -p
2> CREATE USER 'pinkepank'@'localhost' IDENTIFIED BY 'password';
3> CREATE DATABASE IF NOT EXISTS guac_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
4> GRANT SELECT,INSERT,UPDATE,DELETE ON guac_db.* TO 'pinkepank'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
5> 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:
1$ 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
2$ 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:
1$ cd guacamole-auth-jdbc-0.9.14/mysql
2$ 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:
1# mkdir -p /usr/share/tomcat/.guacamole/extensions
2# cp /usr/share/java/mysql-connector-java.jar /usr/share/tomcat/lib
3# cp guacamole-auth-jdbc-mysql-0.9.14.jar /usr/share/tomcat/.guacamole/extensions
4# chown root:tomcat -R /usr/share/tomcat/.guacamole
5# chown root:root /usr/share/tomcat/lib/mysql-connector-java.jar
6# 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:
1# vi /usr/share/tomcat/.guacamole/guacamole.properties
2# database settings
3mysql-hostname: localhost
4mysql-port: 3306
5mysql-database: guac_db
6mysql-username: pinkepank
7mysql-password: guacpass
8
9# additional settings
10mysql-default-max-connections-per-user: 0
11mysql-default-max-group-connections-per-user: 0
12
13Anschließend kann Tomcat gestartet werden - im Protokoll sollte das erfolgreiche Entpacken der Datei dokumentiert sein:
14
15# systemctl start tomcat
16# less /var/log/tomcat/catalina.out
17...
18INFO: 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
:
1# firewall-cmd --add-port=8080/tcp
2# 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:
1ProxyPass /guacamole http://localhost:8080/guacamole
2ProxyPassReverse /guacamole http://localhost:8080/guacamole
Damit die notwendigen Zugriffe nicht von SELinux geblockt werden, müssen die folgenden Booleans gesetzt werden:
1# setsebool -P httpd_can_network_connect 1
2# 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.
Die Standard-Zugangsdaten sind guacadmin - admin, diese sollten schnellstmöglich geändert werden!
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:
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
- Network
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:
Ein Klick auf ein Profil startet die Remote-Verbindung:
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! 🙂