===== Eine Oracle System Umgebung mit Apache Guacamole auf Oracle Linux 8.7 verwalten =====
Eine immer wichtigere Anforderung in der Administration einer Server Umgebung ist die Trennung des Zugriffs auf die Server vom lokalen Arbeitsplatz des Administrators/DBA's.
[[https://guacamole.apache.org/| Apache Guacamole ]] wird hier als Clientless Remote Desktop Gateway eingesetzt.
Über diesen zentralen Punkt können nun alle Server über einen normalen Browser erreicht werden.
{{ :linux:guacamole_architektur_overview.jpg?550 | Übersicht über die Guacamole Architektur }}
Über eine zentrale Stelle kann damit gesteuert werden, wie von außen auf die Server zugegriffen werden kann.
===Hauptfunktionen===
Von und zu der Session können Dateien kopiert werden, in SSH Sessions kann über eine eigene Eingabe Leiste auch die Zwischenablage eingefügt werden, in RDP Session funktioniert das auch direkt.
Funktionalität:
* Wartung von Servern per SSH/VNC/RDP/Telnet über den Browser
* Copy/Past über Zwischenablage möglich (SSH mit eigenen Eingabe Feld)
* Datei Down/Upload auf die Maschine über die Browser Oberfläche
* Hinterlegen der Verbindung mit Zugriffsrechte auf Gruppen/Usern
* Leider nur mit festen Connection Parameter pro Servern, d.h. wenn andere Settings notwendig sind, muss pro User eine eigene Connection hinterlegt werden (wie persönlicher SSH Key pro User).
* Autorisierung des Zugriffs auf die Guacamole Oberfläche im normalen Betrieb über das Active Directory
* Teilen des Zugriffs / "Bildschirms" mit User, die nicht in Guacamole berechtigt sind, über einen Link
* Session lassen sich aufzeichnen und damit protokollieren.
=== Die Guacamole User ===
Für diese Umgebung werden drei Ebene von Anwender verwendet und konfiguriert.
* Statischer User mit Zugriff auf Guacamole Server
* Zur Wartung falls Datenbank oder LDAP Probleme gelöst werden müssen und ein normales Login nicht funktioniert
* Datenbank User für das Einrichten der Server / Gruppen und des ersten LDAP Users
* Zur Reserve falls LDAP Problem auftauchen und ein LDAP Login nicht mögliche ist
* LDAP AD User (muss auch parallel in der DB angelegt werden)
* Normaler, täglicher User für das Normale Arbeiten, kann keine User / Gruppen / Connections verwalten
Im Laufe der Installation werden die pro Schritt die passenden User angelegt.
=== Ablauf Basis Installation ===
Guacamole besteht aus zwei Komponenten, den guacd Demon für die eigentlichen Zugriff auf die Server und dem Guacamole Client der das HTML5 Protokoll für die Bildschirm Anzeige im Browser erzeugt.
Auf einem Oracle Linux 8 System wird Guacamole aus den Quellen übersetzt und der Web Client über einen Apache httpd/Tomcat Applikationserver Stack bereitgestellt. Der Apache HTTP stellt dabei die SSL Verschlüsselung in Richtung Browser sicher.
Die Verwaltung der Server und Nutzer erfolgt über eine MariaDB, leider steht noch kein Oracle DB Connector zur Verfügung.
Der "normale" User wird über das Active Directory autorisiert.
Architektur Übersicht:
{{ :linux:guacamole_architekture_apache_http_mysql_v01.jpg?300 | Architektur Übersicht - Guacamole System Umgebung unter Oracle Linux 8}}
Ablauf:
- Aufsetzen eines Oracle Linux 8 Hosts
- Notwendige Libraries installieren
- Apache Guacamole Server aus dem Source Code übersetzen
- Apache Tomcat installieren
- Basis Konfiguration für Guacamole definieren
- Apache Guacamole Web Client App installieren
- Datenbank für den produktiven Einsatz in einer größeren Umgebung einrichten
- Apache httpd als Proxy für SSL einrichten
- LDAP Integration in das Active Directory für die Benutzer Authentifizierung
- Erweiterte Konfiguration
----
==== Basis Oracle 8 System vorbereiten ====
Den Host vorbereiten wie [[linux:linux_8_system_grundeinstellungen_oracle_datenbank_rac|Ein Oracle Linux 8 Basis System als Grundlagen für eine Oracle Clusterware und Datenbank Installation vorbereiten]] beschrieben, bzw. nach Ihren Unternehmensvorgaben.
Voraussetzung: EPL Repo aktiviert, siehe obige Anleitung!
System auf den aktuellsten Stand heben.
dnf update
=== Notwendigen Font installieren ===
dnf install dejavu-sans-mono-fonts
=== Benötigte Libraries installieren===
== gcc ==
GCC und Tools installieren:
dnf install unzip make cmake gcc libtool wget
== Guacamole Libs ==
Libs installieren:
dnf install cairo-devel libjpeg-turbo-devel libpng-devel libuuid-devel uuid-devel freerdp-devel pango-devel pulseaudio-libs-devel openssl-devel libvorbis-devel libwebp-devel libwebsockets libwebsockets-devel libssh2-devel libssh2 libgcrypt libgcrypt-devel libtelnet-devel libvncserver-devel libvorbis-devel libwebp-devel
== ffmpeg Lib ==
Um die Sessions als Video Stream aufzuzeichnen, muss die ffmpeg zuvor installiert sein.
Dazu muss aber ein eingenes Repository eingebunden werden:
dnf install -y https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
dnf install -y https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm
dnf -y install ffmpeg
dnf -y install ffmpeg-devel
siehe auch => https://computingforgeeks.com/how-to-install-ffmpeg-on-centos-rhel-8/
----
==== Apache Guacamole Server - Code übersetzen ====
Den Sourcecode herunterladen und auf dem Serverbereitstellen:
# Create Working Directory
mkdir /srv/guacamole_source
#Get Source Code and extract the code
cd /srv/guacamole_source
wget wget https://downloads.apache.org/guacamole/1.5.0/source/guacamole-server-1.5.0.tar.gz
sha256sum guacamole-client-1.5.0.tar.gz
# check with https://downloads.apache.org/guacamole/1.5.0/source/guacamole-server-1.5.0.tar.gz.sha256 !
tar -xvf guacamole-server-1.5.0.tar.gz
Source Code übersetzten:
cd /srv/guacamole_source/guacamole-server-*/
./configure --with-init-dir=/etc/init.d
------------------------------------------------
guacamole-server version 1.5.0
------------------------------------------------
Library status:
freerdp2 ............ yes
pango ............... yes
libavcodec .......... yes
libavformat.......... yes
libavutil ........... yes
libssh2 ............. yes
libssl .............. yes
libswscale .......... yes
libtelnet ........... yes
libVNCServer ........ yes
libvorbis ........... yes
libpulse ............ yes
libwebsockets ....... yes
libwebp ............. yes
wsock32 ............. no
Protocol support:
Kubernetes .... yes
RDP ........... yes
SSH ........... yes
Telnet ........ yes
VNC ........... yes
Services / tools:
guacd ...... yes
guacenc .... yes
guaclog .... yes
FreeRDP plugins: /usr/lib64/freerdp2
Init scripts: /etc/init.d
Systemd units: no
Type "make" to compile guacamole-server.
Darauf achten das bei allen Protokollen auch ein "yes" steht! Fehlt etwas stimmt etwas nicht mit den benötigten Libraries! Fehlt eine Lib, wird die dazugehörige Option auch nicht aktiviert.
Übersetzten und installieren:
make
make install
Libs bekannt geben:
ldconfig
Autostart einrichten:
systemctl daemon-reload
systemctl start guacd
systemctl enable guacd
systemctl status guacd
----
==== Apache Guacamole Web Client ====
Für den Webclient wird eine Apache / Tomcat Umgebung aufgesetzt.
Im ersten Schritt wird ein Tomcat9 installiert und konfiguriert. SSL wird dann später über den Apache HTTP als Proxy erfüllt.
=== Tomcat9 ===
! Java muss zuvor installiert werden ! (siehe Basis Konfiguration!) => [[linux:linux_8_system_grundeinstellungen_oracle_datenbank_rac#java_installation|Java Setup Oracle Linux 8]]
Oder für OpenJDK:
dnf install java-latest-openjdk.x86_64
# Versionen anzeigen
/usr/sbin/alternatives --display java
# Version einstellen
/usr/sbin/alternatives --config java
# Version auswählen
Software über => https://tomcat.apache.org/download-90.cgi herunterladen.
Nur Apache Tomcat Release 9.0.x wird vom Guacamole nur unterstützt! Tomcat 10 klappt nicht => Class [oracle.dbtools.entrypoint.WebApplicationRequestEntryPoint] is not a Servlet - das ist noch nicht kompatibel!
=== Basis Installation ===
Damit später einfacher ein Update von Tomcat eingespielt werden kann, wird das Software Home und das Konfigurations-Home getrennt angelegt und dann verlinkt konfiguriert.
Tomcat User anlegen:
useradd tomcat
passwd tomcat
mkdir -p /srv/tomcat
chown tomcat:tomcat /srv/tomcat
Tomcat Sofware installieren:
su - tomcat
cd /srv/tomcat
mkdir install
cd install
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.73/bin/apache-tomcat-9.0.73.tar.gz
sha256sum apache-tomcat-9.0.73.tar.gz
9fc807d5549726f2d4638882f72629f8d03a89f5617445ad963810fd4f406744 apache-tomcat-9.0.73.tar.gz
# mit dem Key der Webseite vom Tomcat vergleichen um sicher zu sein das alles auch da und unverändert ist!
# in dieser Verzeichnis auspacken
cd ..
mkdir apache-tomcat-9.0.73
tar xzf ./install/apache-tomcat-9.0.73.tar.gz
#aber dann verlinken!
ln -s /srv/tomcat/apache-tomcat-9.0.73/ /srv/tomcat/tomcat
#Konfiguration außerhalb der Software speichern
mkdir config
cp -r /srv/tomcat/tomcat/conf /srv/tomcat/config/
cp -r /srv/tomcat/tomcat/logs /srv/tomcat/config/
cp -r /srv/tomcat/tomcat/temp /srv/tomcat/config/
cp -r /srv/tomcat/tomcat/webapps /srv/tomcat/config/
cp -r /srv/tomcat/tomcat/work /srv/tomcat/config/
Erster Start zum testen ob Java gefunden wird und der Tomcat an sich startet:
# als Tomcat User!
su - tomcat
#Profil einstellen
vi ~/.bash_profile
export JAVA_HOME=/etc/alternatives/jre
export CATALINA_HOME=/srv/tomcat/tomcat
export CATALINA_BASE=/srv/tomcat/config
. ~/.bash_profile
# Tomcat über die Console starten mit
$CATALINA_HOME/bin/startup.sh
# Logs prüfen
cd /srv/tomcat/config/logs
tail catalina.out
..
17-Mar-2021 14:31:49.555 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [917] milliseconds
..
# Alternativ pürfen mit
ps -ef | grep tomcat
netstat -nlp | grep 8080
# Start Seite aufrufen:
lynx localhost:8080
#wieder stoppen
$CATALINA_HOME/bin/shutdown.sh
==Tomcat Auto Start einrichten ==
**root**
Datei unter /etc/systemd/system/tomcat.service als root anlegen:
[Unit]
Description=Tomcat - instance
After=syslog.target network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
WorkingDirectory=/srv/tomcat/config
Environment="JAVA_HOME=/etc/alternatives/jre"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"
Environment="CATALINA_PID=/srv/tomcat/config/run/tomcat.pid"
Environment="CATALINA_BASE=/srv/tomcat/config"
Environment="CATALINA_HOME=/srv/tomcat/tomcat"
#alternativ wenn -Xmx4096m
Environment="CATALINA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m -server -XX:+UseParallelGC"
ExecStart=/srv/tomcat/tomcat/bin/startup.sh
ExecStop=/srv/tomcat/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
Start konfigurieren:
systemctl daemon-reload
systemctl enable tomcat.service
systemctl start tomcat.service
systemctl status tomcat.service
Bei Problemen deguggen mit:
systemd-analyze verify /etc/systemd/system/tomcat.service
===Tomcat Basis Konfiguration===
Konfiguration befindet sich dann hier:
* Release Notes : $CATALINA_HOME
* Bin Directory : $CATALINA_HOME/bin
* Config : $CATALINA_BASE/conf
* Webapps : $CATALINA_BASE/webapps
* Logs : $CATALINA_BASE/logs
Apache Tomcat wird über die folgenden vier Dateien in $CATALINA_BASE/conf konfiguriert:
* server.xml
* context.xml
* tomcat-users.xml
* web.xml
Die Dateien liegen unter $CATALINA_HOME\conf Verzeichnis
==TCP Port setzen - server.xml ==
Über "server.xml" wird der Port gesetzt, der Default ist 8080.
Soll der Port verändert werden, zum Beispiel auf 8090, folgende Zeile suchen und anpassen:
== AJP Protokoll aktivieren ==
Der Apache HTTP wird als Proxy eingesetzt.
Einkommentieren und die localhost IP Adresse auf das V4 Format (127.0.0.1) statt V6 (::1) setzen und die AJP Parameter setzen.
vi **/srv/tomcat/config/conf/server.xml**
..
Bei Tomcat9 auf die „requiredSecret“ Einstellung achten, ohne diese Secret ist mir nicht gelungen die AJP Schnittstelle in Funktion zu setzen.
Mittler Block sind die Performance Relevanten Parameter mal "nach Gefühl" gesetzt, testen und nachschärfen ist hier noch notwendig.
Bedeutung der Parameter => https://tomcat.apache.org/tomcat-9.0-doc/config/ajp.html
Pürfen ob der Port auch funktioniert:
netstat -tulpe | grep 8009
tcp6 0 0 localhost:8009 [::]:* LISTEN tomcat 6057382 8333/java
=== Apache Tomcat härten ===
Nach dem ersten Test ob alles funktioniert wie erwartet, muss unbedingt **sofort** die Härtung der Umgebung erfolgen.
Zum Beispiel als erstes alle Beispiel Deployments/Servlets unter TOMCAT_HOME/webapps (bis auf Guacamole) löschen.
Dann steht allerdings auch eine Admin Oberfläche des Tomcat NICHT mehr zur Verfügung, was den Betrieb an sich aber nicht stört.
Siehe auch Härtungsanleitungen und Richtlinien dazu im Netz:
CIS
* https://nvd.nist.gov/ncp/checklist/937
WEB
* https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html
== Tomcat Native Libraries aktiveren ==
Installieren:
dnf install tomcat-native.x86_64
siehe auch => http://tomcat.apache.org/native-doc/
Umgebung setzen über neue Datei setenv.sh:
cd /srv/tomcat/tomcat/bin
vi setenv.sh
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib
export LD_LIBRARY_PATH
Verwendung prüfen:
cd /srv/tomcat/config/logs
grep Native *
catalina.out:17-Mar-2021 23:48:43.592 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.23] using APR version [1.6.3].
----
==== Guacamole Konfiguration anlegen ====
Die Guacamole Konfiguration wird unter **/etc/guacamole** angelegt.
Konfiguration anlegen:
mkdir -p /etc/guacamole/{extensions,lib}
touch /etc/guacamole/{guacamole.properties,guacd.conf}
Tomcat Umgebungsvariable setzten die definiert wo die Konfiguration liegt:
echo GUACAMOLE_HOME=/etc/guacamole >> /etc/default/tomcat9
cat etc/default/tomcat9
GUACAMOLE_HOME=/etc/guacamole
vi /etc/guacamole/guacd.conf
[daemon]
pid_file = /var/run/guacd.pid
#log_level = debug
[server]
bind_host = 127.0.0.1
bind_port = 4822
#[ssl]
#server_certificate = /etc/ssl/certs/guacd.crt server_key =
#/etc/ssl/private/guacd.key
Im ersten Schritt wird mit der user-mapping.xml gearbeitet, der DB Connect erfolgt später.
vi /etc/guacamole/guacamole.properties
guacd-hostname: localhost
guacd-port: 4822
user-mapping: /etc/guacamole/user-mapping.xml
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
User Mapping für den ersten Test:
Passwort erzeugen
echo -n MyPassword | openssl md5
(stdin)= 48503dfd58720bd5ff35c102065a52d7
vi /etc/guacamole/user-mapping.xml
10.10.10.90
22
rdp
10.10.10.10
3389
true
nla
----
==== Guacamole Cient Installation ===
Der eigentliche Client wird als WAR File im Tomcat deployt und liest die Konfiguration unter /etc/guacamole.
# Als Tomcat User
su - tomcat
cd /srv/tomcat/config/webapps
wget https://downloads.apache.org/guacamole/1.5.0/binary/guacamole-1.5.0.war
**Testauf über http://:8080/guacamole-1.5.0/#/**
Nun haben wir eine erste im Prinzip funktionierende Umgebung und können mit den ersten Tests beginnen.
----
In Folge wird nun eine Datenbank für die Verwaltung der Server / Anwender hinterlegt und der Apache HTTP als SSL Proxy aufgesetzt.
----
==== Datenbank hinterlegen ====
Guacamole unterstützt die Mysql/MariaDB, Postgree und MS SQL. Leider noch nicht eine Oracle Datenbank.
=== MariaDB Basis Datenbank Umgebung bereitstellen===
**root**
Software installieren
dnf install mariadb-server
DB Konfigurieren:
vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Enable binary Log
log_bin=bin-log
binlog_format=row
max_binlog_size=100M
expire_logs_days=7
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
Service einrichten
systemctl enable mariadb.service
systemctl start mariadb.service
ps auxwf | grep mariadb
netstat -tulpen | grep 3306
systemctl status mariadb.service
tail /var/log/mariadb/mariadb.log
DB Umgebung optimieren:
# Sicherheit einstellen und root Passwort setzen
/usr/bin/mysql_secure_installation
# mit dem Passwort anmelden
mysql -h localhost -u root -p
#version
select VERSION();
#Datenbanken
SHOW DATABASES;
#User
SELECT Host,User FROM mysql.user;
#Unötige entfernen
DELETE FROM mysql.user WHERE Host='::1' AND User='root'
quit
#LOG-Rotate Konfiguration
vi /etc/logrotate.d/mariadb
eine sehr gute Anleitung für den Start findet sich auch hier => https://dokuwiki.tachtler.net/doku.php?id=tachtler:mariadb_centos_7
=== JDBC Treiber installieren und mit Tomcat verbinden ===
Download RPM von https://dev.mysql.com/downloads/connector/j/ (Red Hat Enterprise Linux 8 / Oracle Linux 8 (Architecture Independent), RPM Package) und auf den Server kopieren
Treiber installieren:
dnf install mysql-connector-j-8.0.32-1.el8.noarch.rpm
ls -la /usr/share/java/mysql-connector-j.jar
Treiber in Tomcat bereitstellen und in Guacamole:
cp -a /usr/share/java/mysql-connector-j.jar /srv/tomcat/tomcat/lib
cp -a /usr/share/java/mysql-connector-j.jar /etc/guacamole/lib/
----
=== Guacamole Datenbank bereitstellen===
# mit dem Passwort anmelden
mysql -h localhost -u root -p
CREATE DATABASE IF NOT EXISTS guacamole DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
SHOW databases LIKE 'guacamole';
SELECT PASSWORD('gurcaZugangKonsole2023');
-- Use database.
USE mysql;
-- Create user.
CREATE USER 'guacamole_user'@'10.10.10.155' IDENTIFIED BY PASSWORD '*D15600C362200601800BCF462D6190B5301A1FEB';
-- Grant privileges for database guacamole to new users.
GRANT USAGE ON *.* TO 'guacamole_user'@'10.10.10.155' IDENTIFIED BY PASSWORD '*D15600C362200601800BCF462D6190B5301A1FEB';
GRANT SELECT, INSERT, UPDATE, DELETE ON `guacamole`.* TO 'guacamole_user'@'10.10.10.155';
-- Make sure that priviliges are reloaded.
FLUSH PRIVILEGES;
SELECT * FROM mysql.user WHERE User = 'guacamole_user';
SHOW GRANTS FOR 'guacamole_user'@'10.10.10.155';
quit
=== Schema Skripte und den Adapter bereitstellen ===
Wir wollen am Ende die Library guacamole-auth-jdbc-mysql-1.5.0.jar verwenden, diese muss in das GUACAMOLE_HOME/ext.
Adapter und Schema SQL bereitstellen:
cd /srv/guacamole_source
mkdir ex
cd ex
wget https://downloads.apache.org/guacamole/1.5.0/binary/guacamole-auth-jdbc-1.5.0.tar.gz
tar -xvf guacamole-auth-jdbc-1.5.0.tar.gz
cd /srv/guacamole_source/ex/guacamole-auth-jdbc-1.5.0/mysql
# Adapter hinterlegen
cp guacamole-auth-jdbc-mysql-1.5.0.jar /etc/guacamole/extensions/
das Schema anlegen:
cd /srv/guacamole_source/ex/guacamole-auth-jdbc-1.5.0/mysql/schema
#
#DB namen hinzufügen mit use guacamole;
#
[root@guacamole01 schema]# vi 001-create-schema.sql
..
use guacamole;
..
[root@guacamole01 schema]# vi 002-create-admin-user.sql
..
use guacamole;
..
#Schema einspielen
/usr/bin/mysql -u root -p < 001-create-schema.sql
/usr/bin/mysql -u root -p < 002-create-admin-user.sql
#Keine Rückmeldung von den Skripten heißt ok!
=== Guacamole konfigurieren ====
Wir haben ja bereits eine Konfiguration, diese ist die ersten, die gesucht wird und dann wird auch dieser User verwendet!
Der Vorteil von diesen zwei Konfiguration ist, das wenn die MariaDB ein Problem hat, kann man sich ja nicht mehr anmelden um das zu fixen!
== DB Connect hinzufügen==
vi /etc/guacamole/guacamole.properties
guacd-hostname: localhost
guacd-port: 4822
user-mapping: /etc/guacamole/user-mapping.xml
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
# MySQL properties
mysql-hostname: 10.10.10.155
mysql-port: 3306
mysql-database: guacamole
mysql-username: guacamole_user
mysql-password: gurcaZugangKonsole2023
mysql-default-max-connections-per-user: 0
mysql-default-max-group-connections-per-user: 0
mysql-user-required: false
Steht der Parameter mysql-user-required auf true wírd die user-mapping.xml nicht mehr verwendet!
Soll diese als Backup Zugang dienen, diesen Parameter auf false setzen!
Tomcat neu starten
systemctl stop tomcat.service
systemctl start tomcat.service
In Log von Tomcat (catalina.out) kann geprüfe werden ob die Extension auch gefunden wird:
11:55:13.469 [main] INFO o.a.g.environment.LocalEnvironment - GUACAMOLE_HOME is "/etc/guacamole".
11:55:13.577 [main] INFO o.a.g.GuacamoleServletContextListener - Read configuration parameters from "/etc/guacamole/guacamole.properties".
11:55:13.578 [main] INFO o.a.g.rest.auth.HashTokenSessionMap - Sessions will expire after 60 minutes of inactivity.
11:55:13.955 [main] INFO o.a.g.a.mysql.conf.MySQLEnvironment - Installed JDBC driver for MySQL/MariaDB detected as "MySQL Connector/J".
11:55:14.996 [main] INFO o.a.g.extension.ExtensionModule - Extension "MySQL Authentication" (mysql) loaded.
Nun kann sich mit dem Default User und Password guacadmin/guacadmin angemeldet werden.
Danach gleich das Passwort von diesem User ändern!
Nun können die User und die Server über die Weboberfläche hinterlegt werden
----
Im nächste Schritt muss der Apache HTTP als Proxy mit SSL konfiguriert werden
----
==== Apache HTTP als SSL Proxy für Guacamole =====
Ziel ist es das alles über den Apache Webserver ausgeliefert wird.
Hier darauf achten, dass alles so konfiguriert ist, das maximale Performance mit dem System erreicht wird!
Ablauf:
* HTTPD installieren
* Module aktivieren
* Apache Compression aktivieren
* SSL einrichten
* TomCat Connector einrichten
siehe auch => https://docs.oracle.com/en/operating-systems/oracle-linux/8/obe-apache-install/#before-you-begin
=== SE Linux einstellungen===
Falls SE auf "Permissive" folgende Einstellungen wählen:
# Kontrolle
getenforce
Permissive
# einstellen mit:
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_relay 1
setsebool -P httpd_graceful_shutdown 1
setsebool -P nis_enabled 1
=== HTTPD ===
dnf install httpd.x86_64
dnf install mod_ssl.x86_64
dnf install httpd-tools.x86_64
Starten und Auto Start einrichten:
systemctl start httpd
systemctl enable --now httpd.service
systemctl status httpd
#test
curl guacamole01.pipperr.local:80
# falls firewall im einsatz
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
#version
apachectl -v
Server version: Apache/2.4.37 (Oracle Linux)
Server built: Apr 6 2023 14:07:29
* /etc/httpd/conf/httpd.conf – Main Apache config file
* /etc/httpd/ – Location for all config files
* /etc/httpd/conf.d/ – All config files in this directory are included in the main confog file
* /etc/httpd/conf.modules.d/ – Location for Apache module config files
===Notwendige Module aktiveren===
Folgende Module wollen wir einsetzen: **ssl proxy http2 proxy_ajp headers rewrite**
Welche Module stehen uns zu Verfügung:
yum list mod\*
yum list mod\* | grep "ssl\|proxy\|http2\|proxy_ajp\|headers\|rewrite"
Was ist bereits aktiviert:
apachectl -M
apachectl -M | grep "ssl\|proxy\|http2\|proxy_ajp\|headers\|rewrite"
unnötige Module deativieren:
cd /etc/httpd/conf.modules.d
apachectl -M | wc -l
mv 00-dav.conf 00-dav.conf_disable
mv 00-lua.conf 00-lua.conf_disable
mv 01-cgi.conf 01-cgi.conf_disable
vi 00-base.conf
#LoadModule dbd_module modules/mod_dbd.so
#Restart und prüfen
apachectl restart
apachectl -M | wc -l
===“Apache Compression“ serverweit aktivieren===
File /etc/httpd/conf.d/compression.conf :
# compression
# Compress HTML, CSS, JavaScript, Text, XML and fonts
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
# Remove browser bugs (only needed for really old browsers)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
=> https://httpd.apache.org/docs/2.4/mod/mod_deflate.html
Pürfen ob das Modul auch enabled ist:
[root@apex01 conf.modules.d]# apachectl -M | grep "deflate"
deflate_module (shared)
Bei bereits komprimierten Dateien vermeiden:
vi /etc/httpd/conf.d/guacamole.conf
#Force compression even when the client does not send Accept Encoding Header
# nicht notwendig da bereits definiert ! SetEnv force-gzip "yes"
#Nicht kompremieren
SetEnvIfNoCase Request_URI "\.(?:exe|t?gz|zip|ar|bz2|sit|rar)$" no-gzip dont-vary
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|jpg|ico|png)$" no-gzip dont-vary
SetEnvIfNoCase Request_URI "\.(?:pdf)$" no-gzip dont-vary
SetEnvIfNoCase Request_URI "\.(?:flv)$" no-gzip dont-vary
siehe auch https://httpd.apache.org/docs/current/mod/mod_setenvif.html#setenvifnocase
=== Erste Security Einstellungen ====
File: /etc/httpd/conf.d/security.conf
ServerSignature Off
ServerTokens Prod
TraceEnable Off
=== Erste Performane Einstellungen ====
Test z.b. mit https://www.joedog.org/siege-home/ oder auch https://httpd.apache.org/docs/2.4/programs/ab.html
== DNS Lookup abschlalten==
File: vi /etc/httpd/conf.d/guacamole.conf
HostnameLookups off
== Worker Threads konfigurien ==
was ist eingestellt:
# apachectl -M | grep mpm
mpm_worker_module (shared)
# httpd -V | grep MPM
Server MPM: worker
Einstellungen siehe => https://httpd.apache.org/docs/current/mod/mpm_common.html#startservers
Datei anlegen => /etc/httpd/conf.modules.d/10-mpm-worker_settings.conf:
ServerLimit 250
StartServers 10
MinSpareThreads 75
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 32
MaxClients 8000
MaxRequestsPerChild 10000
Diese müssen natürlich im Detail mit Tests auf die idealen Werte eingestellt werden.
=== Apache härten und SSL einrichten =====
Nachdem nun das ganze so einigermaßen über Port 80 und den Apache Webserver funktioniert, muss die Umgebung gehärtet und auf SSL/TLS umgestellt werden.
Bei der Konfiguration wird das System so eingestellt das nur noch TLS 1.1 zulässig ist.
Für das Erzeugen des Zertifikatsrequest wird das mitgelieferte [[https://www.openssl.org/docs/|openssl]] eingesetzt.
==Zertifikats erstellen===
Um die Zertifikate besser zu finden wird ein zentrale Order unter /srv anlegt, dort erzeugen wir auch den Zertifikatsrequest.
==Selbstsigniertes Zertifikat mit Password anlegen==
*root*
# Zertifikats store
mkdir /srv/cert
cd /srv/cert
openssl genrsa -des3 -out server.pem 2048
# pass phrase merken ! abc1234
openssl genrsa -des3 -out server.key 2048
openssl rsa -in server.pem -out server.key
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
**Problem:** SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
**Lösung :** => 2048 als Key Längen verwenden!
Falls "Password entry required for 'Enter TLS private key passphrase for apex01.pipperr.local:443 (RSA) :' (PID 9560) " => Password hinterlegen (oder mit openssl entfernen) in /srv/cert/passphrase-file.conf:
vi /srv/cert/passphrase-file.conf
#!/bin/sh
# password für pem phrase hinterlegen
echo "abc1234"
#Ausführen setzen
chmod 760 /srv/cert/passphrase-file.conf
vi /etc/httpd/conf.d/ssl.conf
# nicht in der Vhost Section!
SSLPassPhraseDialog exec:/srv/cert/passphrase-file.conf
Passphrase entfernen:
ssh-keygen -p
== Zertifikats Request ohne PWD auf dem Key anlegen==
Für eine MS CA ein Certifikat anlegen:
mkdir /srv/cert_gpi
cde /srv/cert_gpi
#Key
openssl genrsa -out server.key 4096
#Request
openssl req -new -key server.key -out server.csr -subj "/C=DE/ST=Hessen/O=GPIConsilt/CN=apex01.pipperr.local/emailAddress=info@pipperr.de" -addext 'subjectAltName=DNS:apex01,DNS:apex01.pipperr.local'
#anzeigen lassen
openssl req -noout -text -in server.csr
DAs Server.crt dann entsprechend "einreichen" und das Zertifikat dann als "server.crt" auf dem Server wieder hinterlegen.
Zuvor prüfen mit:
openssl x509 -text -in server.cer
In der ssl.conf die Pfade entsprechend anpassen:
# SSL certificates settings
SSLCertificateFile /srv/cert_gpi/server.cer
SSLCertificateKeyFile /srv/cert_gpi/server.key
==Zertifikat in Apache einbinden==
Apache Konfiguration anpassen auf:
neu anlegen /etc/httpd/conf.d/vhost.conf
Immer auf 443 weiterleiten:
# force HTTPS
ServerName pipperr.local
ServerAlias guacamole01.pipperr.local
RewriteEngine on
RewriteCond %{SERVER_NAME} =guacamole01.pipperr.local [OR]
RewriteCond %{SERVER_NAME} =pipperr.local
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
Anpassen /etc/httpd/conf.d/ssl.conf
# nicht in der Vhost Section!
SSLPassPhraseDialog exec:/srv/cert/passphrase-file.conf
# forward ORDS requests to tomcat
ServerName pipperr.info
ServerAlias guacamole01.pipperr.info
# SSL certificates settings
SSLCertificateFile /srv/cert/server.crt
SSLCertificateKeyFile /srv/cert/server.pem
# uncomment the line below if you want
# to redirect traffic to guacamole from root path
RedirectMatch permanent "^/$" "/guacamole-1.5.0"
# proxy guacamole-1.5.0 requests to tomcat
ProxyRequests off
ProxyPreserveHost On
ProxyPass "ajp://localhost:8009/guacamole-1.5.0" secret=ORACLEAPEX1234 timeout=600
#nicht notwendig? ProxyPassReverse "ajp://localhost:8009/guacamole-1.5.0"
Auf das "secret" in GroßKleinschreibung achten sonst erhält man einen 403 Fehler!!
Testen:
apachectl -t
apachectl -S
#Starten
apachectl restart
#Logs auswerten
cd /var/log/httpd
# bei Fehlern:
systemctl stop httpd.service
rm -rf *log
systemctl start httpd.service
=== Umgebung valideren ===
https://richardforth.github.io/apache2buddy_ag/
wget -O /root/apache2buddy.pl https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl
perl apache2buddy.pl --skip-os-version-check
----
=== Tomcat härten ===
Nachdem nun der Apache Zugriff auf Tomcat eingerichtet ist, Tomcat nur auf Local Host beschränken, damit niemand den Apache HTTP überspringen kann.
Nur noch Zugriff auf Tomcat über "localhost" erlauben (address="127.0.0.1" hinzufügen), dazu server.xml anpassen.
/srv/tomcat/config/conf/server.xml:
..
..
----
==== LDAP Integration =====
Nachdem die Datenbank Integration nun aufgesetzt ist, kann im nächsten Schritt die Integration der Anmeldung im AD erfolgen.
{{ :linux:guacamole_ldap_integration_ad.jpg?400 | LDAP Integration Apache Guacamole}}
Ablauf:
* Plugin herunterladen und hinterlegen
* AD User in AD anlegen
* LDAP Parameter hinterlegen
* User mit gleichen Namen über einen DB Connect anlegen
=== Plugin hinterlegen ===
Plugin herunterladen und im Extension Directory hinterlegen:
cd /srv/guacamole_source
mkdir ex
cd ex
wget https://downloads.apache.org/guacamole/1.5.0/binary/guacamole-auth-ldap-1.5.0.tar.gz
tar -xvf guacamole-auth-ldap-1.5.0.tar.gz
cd /srv/guacamole_source/ex/guacamole-auth-ldap-1.5.0/
# Adapter hinterlegen
cp guacamole-auth-ldap-1.5.0.jar /etc/guacamole/extensions/
=== Service Account User im AD hinterlegen ===
Über AD Methoden einen Service Account vom AD Admin anlegen lassen.
Auf dem Guacamle Server mit LDAP Search die Anbindung an das AD testen (alle AD Namen auslesen) mit:
ldapsearch -x -LLL -h pipperr.local -D ADReadOnlyUserGuca -w MyTopADReadOnlySecret -b "DC=pipperr,DC=de" -s sub "(objectClass=user)" name
===LDAP Parameter hinterlegen ===
In diese Konfiguration wird mit "ldap-username-attribute: sAMAccountName" aus "ldap-search-bind-dn" der User ADReadOnlyUserGuca ausgelesen und das Password von "ldap-search-bind-password" verwendet.
der LDAP Search Parameter prüft das der Username existiert und der User in einer der beiden Gruppen linux_admin_grp oder dba_grp ist. Auf das "=" im Vergleich "memberOf" achten! Ein ":" ist hier anscheinend nicht richtig obwohl es in vielen Beispielen so definiert ist!
vi /etc/guacamole/guacamole.properties
# LDAP SETTINGS
# AD Server
ldap-hostname: pipperr.local
ldap-port: 389
ldap-encryption-methode: none
ldap-search-bind-dn: CN=ADReadOnlyUserGuca,OU=Serviceaccounts,OU=ID Department,OU=Users,OU=GPI Consult,DC=pipperr,DC=de
#Password of the CN=ADReadOnlyUserGuca User!
ldap-search-bind-password: MyTopADReadOnlySecret
ldap-username-attribute: sAMAccountName
ldap-user-base-dn: OU=Users,OU=GPI Consult,DC=pipperr,DC=local
ldap-user-search-filter: (&(objectClass=user)(|(memberOf=CN=dba_grp,OU=DD Groups,OU=ID Department,OU=Groups,OU=GPI Consult,DC=pipperr,DC=de)(memberOf=CN=linux_admin_grp,OU=DD Groups,OU=ID Department,OU=Groups,OU=GPI Consult,DC=pipperr,DC=de)))
Tomcat neu starten.
==Problem "is not a valid LDAP filter" ==
13:08:45.034 [ajp-nio-127.0.0.1-8009-exec-4] DEBUG o.a.g.rest.RESTExceptionMapper - Processing of request aborted by extension.
org.apache.guacamole.GuacamoleServerException: "(&(objectClass=user)((memberOf:CN=dba_grp,OU=PKI,OU=Application Groups,OU=ID Department,OU=Groups,OU=GPI Consult,DC=pipperr,DC=de)))" is not a valid LDAP filter.
**Lösung**: Ein **":"** ist nicht zulässig, es muss ein **"="** sein!
===User in Guacamole in der DB anlegen===
In der DB muss der User gleich wie im AD genannt werden, damit der AD User zu einem DB User gemappt werden kann.
----
==== Weitere Einstellungen ====
=== Bedienung ===
Die wichtigsten Keybord Shortcuts für eine Guacamole Terminal Session:
strgaltshift öffnet und schließt das Fenster für die Zwischenablage, den Datei Browser und die Konfiguration der Zwischenablage.
=== Daten über die Datenbank einfügen===
https://guacamole.apache.org/doc/gug/jdbc-auth.html#modifying-data-manually
=== Font Probleme ===
Wenn das Terminal unter Guacamole die Zeichen nicht richtig darstellt, fehlt der gewünschte Font aus den Connection Einstellungen bzw. der Default Font wurde nicht installiert (dnf install dejavu-sans-mono-fonts).
== DroidSansMono als Terminal Font verwenden ==
Auf dem Guacamole Server:
dnf install google-droid-sans-mono-fonts
In den Verbindungseinstellungen** "DroidSansMono"** für die Schriftart hinterlegen.
== Hack als Terminal Font verwenden ==
Den Font "Hack" => https://github.com/source-foundry/Hack als Font aktiveren.
Ein "schöner" Font für die Programmierung und die Console Beispiel => https://www.dafont.com/hack.font?text=guacamole
Diesen wird zuvor auf dem Gucamole Server hinterlegt:
cd /srv/guacamole_source/
mkdir hack_font
cd hack_font/
wget https://github.com/source-foundry/Hack/releases/download/v3.003/Hack-v3.003-ttf.zip
unzip Hack-v3.003-ttf.zip
wget https://raw.githubusercontent.com/source-foundry/Hack/master/config/fontconfig/45-Hack.conf
cp 45-Hack.conf /etc/fonts/conf.d/
cp -r ttf /usr/share/fonts
mv /usr/share/fonts/ttf/ /usr/share/fonts/hack
fc-cache -f -v
fc-list | grep "Hack"
#Generl für die Console einstellen
vi /etc/vconsole.conf
KEYMAP="de"
FONT="Hack"
Unter Den Connection Einstellungen für den Server als Font Name "Hack" eintragen.
----
=== Recording ===
Mehr dazu unter [[linux:oracle_linux_8_guacamole_session_recording|Session Recording in Apache Guacamole]]
----
==== Probleme ====
=== Zeichen werden doppelt oder nicht angezeigt, z.b. im VI ===
siehe Bug => https://issues.apache.org/jira/browse/GUACAMOLE-1256
Eine Lösung kann sein für Vi "set scrolloff=0" zu setzen.
#als default setzen
cd
vi .vimrc
set scrolloff=0
----
====Quellen ====
* https://computingforgeeks.com/how-to-install-ffmpeg-on-centos-rhel-8/
* https://computingforgeeks.com/install-apache-tomcat-9-on-linux-rhel-centos/
* https://guacamole.apache.org/doc/gug/installing-guacamole.html
* https://computingforgeeks.com/install-guacamole-remote-desktop-centos/
* https://chemnitzer.linux-tage.de/2022/media/programm/material/235.pdf
* https://adamtheautomator.com/apache-guacamole/
Datenbank Einsatz
* https://guacamole.apache.org/doc/gug/jdbc-auth.html
* https://dokuwiki.tachtler.net/doku.php?id=tachtler:apache_guacamole
Bedienung
* https://guacamole.apache.org/doc/gug/using-guacamole.html
Beispiele für Konfiguration:
* https://github.com/elgalu/guaca-docker/blob/master/guacamole_home/example.guacamole.properties
Rest API
* https://copyprogramming.com/howto/how-can-i-connect-user-with-a-connection-by-using-guacamole-rest-api#how-can-i-connect-user-with-a-connection-by-using-guacamole-rest-api