Apache Guacamole – Zwei-Faktor-Authentifizierung einrichten (Teil 4)

[Aktualisiert: 30.03.2020] Nachdem die Einrichtung  von Guacamole  soweit abgeschlossen ist, macht man sich natürlich Gedanken über die Absicherung des Zugangs. Je nach Planung/Umgebung hat man nun Zugriff auf Server, Applikationen und Daten im LAN. Es ist inzwischen nicht mehr zeitgemäß solche Zugänge ausschließlich mit Benutzername und Passwort absichern. Oft verwenden die Nutzer das selbe Passwort für unterschiedliche Konten – unabhängig ob privat oder geschäftlich.

Abhilfe schafft in meinen Augen nur eine Implementierung einer Zwei-Faktor-Authentifizierung (2FA) in Form eines Einmalpassworts (One-Time-Passwort (OTP) ). Neben dem Benutzernamen und dem dazugehörigen Passwort muss auch das jeweilige OTP des Benutzer eingeben werden. Eine Anmeldung ist daher nur möglich, wenn alle drei Eingaben zusammen passen. Guacamole stellt dafür offizell die TOTP Erweiterung zur Verfügung.

Installation und Konfiguration von TOTP

Installation der Extension:

cd /usr/src/
wget --trust-server-names "https://apache.org/dyn/closer.cgi?action=download&filename=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/

Konfiguration ergänzen:

cat << EOF >> /etc/guacamole/guacamole.properties

#
# TOTP Settings
#

#The human-readable name of the entity issuing user accounts. If not specified, "Apache Guacamole" will be used by default.
totp-issuer: guacamole.lab01.wydler.eu

#The number of digits which should be included in each generated TOTP code. Legal values are 6, 7, or 8. By default, 6-digit codes are generated.
totp-digits: 6

#The duration that each generated code should remain valid, in seconds. By default, each code remains valid for 30 seconds.
totp-period: 30

#The hash algorithm that should be used to generate TOTP codes. Legal values are "sha1", "sha256", and "sha512". By default, "sha1" is used.
totp-mode: sha256

EOF

Beim Parameter „totp-issuer“ bei Möglichkeit auf Leerzeichen verzichten. Hat meinen Versuchen immer wieder Probleme gemacht.

Damit die Änderungen wirksam werden, muss der Apache Tomcat neu gestartet werden.

systemctl restart tomcat8.service

Einrichtung von TOTP für Benutzer

Die Weboberfläche von Guacamole aufrugen und mit dem Administrator guacamole anmelden. Nach der erfolgreichen Anmeldung erscheint folgender Dialog.

An dieser Stelle benötigt man nun eine App(likation) für das Smartphone/Tablet bzw. Rechner/Notebook, mit der die 2FA verwaltet werden kann. Die bekannste App ist wohl der Google Authenticator. Enthält ein QR Code mehrere Parameter, so erscheint nachdem Scannen eine Fehlermeldung. Grund dafür ist, dass im QR Code mehrere Parameter enhalten sind. Die Erfahrung bezieht sich auf aktuelle Geräte von Apple mit iOS.  Auf der Suche nach Alternativen bin ich bie der App OTP Auth hängen gelieben. Unkomplizierte Bedienung und die OTPs sind schnell und einfach eingerichtet.

Den angezeigten QR Code nun mit OTP Auth  scannen. Ist alles korrekt wird in der App fortlaufend (alle 30 Sekunden) ein neues OTP für jedes Konto angezeigt. Das OTP für guacadmin in das Feld „Authentication Code“ eingeben. Passt dies zu dem anzumeldeten Benutzer, erscheint die Übersichtsseite von Guacamole.

Standardmäßig ist die 2FA nur für den Administrator guacadmin (automatisch) aktiviert. Für allen Benutzern ist ein manueller Eingriff durch den Administrator notwendig. Dazu unter Einstellungen in den Reiter Benutzer wechseln. In der Übersicht den entsprechenden Benutzer anklicken. Es öffnet sich die Eigenschaften des Benutzerkontos.

Im Bereich Berechtigungen ist die Option „Ändere eigenes Passwort“ zu aktivieren.Bei der nächstens Anmeldung des Benutzers an Guacamole, wird er aufgefordert TOTP einzurichten.  Das Vorgehen ist das Selbe wie bereits oben für den Benutzer guacadmin beschrieben.

TOTP für Benutzer zurücksetzen

Zur Zeit werden viele Home Office Arbeitsplätze eingerichtet. Der eine oder andere greift auf Apache Guacamole zurück und sicht die Zugänge zum System mit einer 2 Faktor Authentifizierung  ab. Wie weiter oben beschrieben wird dafür oft Apps auf Smartphone/Tablet dafür genutzt. Was aber wenn jemand ausversehen den Eintrag in der App bzw. die App löscht?!

Dann muss für den betroffenen Benutzer, mit aktivierter 2FA der prviate Schlüssel (=Serect Key) zurückgesetzt werden. Leider ist diese Funktion nach wie vor nicht in der Oberfläche integriert. Dies bedeutet der Wert muss über die Kommandozeile (Terminal oder SSH) des verwendeten Datenbank-Server s(z.B. PostgreSQL) gelöscht werden. Nachstehend habe ich die Befehle für MySQL bzw. MariaDB und PostgreSQL Datenbank-Server dokumentiert.

MySQL/MariaDB

Aufbau der Verbindung zur Datenkbank.

mysql -u BENUTZERNAME -pPASSWORT <datenbankname> SHOW TABLES;

Kontrolle ob es dir korrekte Datenbank ist.

MariaDB [<dbname>]> SHOW TABLES;
+---------------------------------------+
| Tables_in_<dbname>                    |
+---------------------------------------+
| guacamole_connection                  |
| guacamole_connection_attribute        |
| guacamole_connection_group            |
| guacamole_connection_group_attribute  |
| guacamole_connection_group_permission |
| guacamole_connection_history          |
| guacamole_connection_parameter        |
| guacamole_connection_permission       |
| guacamole_entity                      |
| guacamole_sharing_profile             |
| guacamole_sharing_profile_attribute   |
| guacamole_sharing_profile_parameter   |
| guacamole_sharing_profile_permission  |
| guacamole_system_permission           |
| guacamole_user                        |
| guacamole_user_attribute              |
| guacamole_user_group                  |
| guacamole_user_group_attribute        |
| guacamole_user_group_member           |
| guacamole_user_group_permission       |
| guacamole_user_history                |
| guacamole_user_password_history       |
| guacamole_user_permission             |
+---------------------------------------+
23 rows in set (0.00 sec)

Die folgende SQL-Abfrage liefert die ID des angegebenen Benutzernamen zurück. Dazu Wert „guacadmin“ durch den betrofffenen Benutzernamen ersetzen.

MariaDB [<dbname>]> SELECT user_id FROM
    -> guacamole_user
    -> INNER JOIN
    -> guacamole_entity ON guacamole_entity.entity_id = guacamole_user.entity_id
    -> WHERE
    -> guacamole_entity.name = 'guacadmin';
+---------+
| user_id |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

TOTP für den Benutzer zurücksetzen. Dazu die ID vom vorherigen Schritte als Wert für die Spalte „user_id“ eintragen.

MariaDB [<dbname>]> UPDATE guacamole_user_attribute SET attribute_value='false' WHERE attribute_name = 'guac-totp-key-confirmed' and user_id = '1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Verbindung beenden.

MariaDB [<dbname>]> quit
Bye

Meldet sich der Benutzer erneut bei Guacamole an, erhält dieser wie gewohnt die Daten für die Einrichtung der 2FA.

PostgreSQL

Aufbau der Verbindung zur Datenkbank.

root@f80805051663:/# psql dbname dbuser
psql (12.2 (Debian 12.2-2.pgdg100+1))
Type "help" for help.

Kontrolle ob es dir korrekte Datenbank ist.

guacamole=# \dt
                        List of relations
 Schema |                 Name                  | Type  | Owner
--------+---------------------------------------+-------+--------
 public | guacamole_connection                  | table | dbuser
 public | guacamole_connection_attribute        | table | dbuser
 public | guacamole_connection_group            | table | dbuser
 public | guacamole_connection_group_attribute  | table | dbuser
 public | guacamole_connection_group_permission | table | dbuser
 public | guacamole_connection_history          | table | dbuser
 public | guacamole_connection_parameter        | table | dbuser
 public | guacamole_connection_permission       | table | dbuser
 public | guacamole_entity                      | table | dbuser
 public | guacamole_sharing_profile             | table | dbuser
 public | guacamole_sharing_profile_attribute   | table | dbuser
 public | guacamole_sharing_profile_parameter   | table | dbuser
 public | guacamole_sharing_profile_permission  | table | dbuser
 public | guacamole_system_permission           | table | dbuser
 public | guacamole_user                        | table | dbuser
 public | guacamole_user_attribute              | table | dbuser
 public | guacamole_user_group                  | table | dbuser
 public | guacamole_user_group_attribute        | table | dbuser
 public | guacamole_user_group_member           | table | dbuser
 public | guacamole_user_group_permission       | table | dbuser
 public | guacamole_user_history                | table | dbuser
 public | guacamole_user_password_history       | table | dbuser
 public | guacamole_user_permission             | table | dbuser
(23 rows)

Die folgende SQL-Abfrage liefert die ID des angegebenen Benutzernamen zurück. Dazu Wert „guacadmin“ durch den betrofffenen Benutzernamen ersetzen.

guacamole=# \gexec
SELECT user_id FROM 
    guacamole_user
INNER JOIN 
    guacamole_entity ON guacamole_entity.entity_id = guacamole_user.entity_i
WHERE
guacamole_entity.name = 'guacadmin';

 user_id
---------
       1
(1 row)

TOTP für den Benutzer zurücksetzen. Dazu die ID vom vorherigen Schritte als Wert für die Spalte „user_id“ eintragen.

guacamole=# UPDATE guacamole_user_attribute SET attribute_value='false' WHERE attribute_name = 'guac-totp-key-confirmed' and user_id = '1';
UPDATE 1

Verbindung beenden.

\q

Meldet sich der Benutzer erneut bei Guacamole an, erhält dieser wie gewohnt die Daten für die Einrichtung der 2FA.

Abonnieren
Benachrichtige mich bei
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
Back to top