Benutzer-Werkzeuge

Webseiten-Werkzeuge


linux:oracle_linux_8_guacamole

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.

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.

 Ü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:  Architektur Übersicht - Guacamole System Umgebung unter Oracle Linux 8

Ablauf:

  1. Aufsetzen eines Oracle Linux 8 Hosts
  2. Notwendige Libraries installieren
  3. Apache Guacamole Server aus dem Source Code übersetzen
  4. Apache Tomcat installieren
  5. Basis Konfiguration für Guacamole definieren
  6. Apache Guacamole Web Client App installieren
  7. Datenbank für den produktiven Einsatz in einer größeren Umgebung einrichten
  8. Apache httpd als Proxy für SSL einrichten
  9. LDAP Integration in das Active Directory für die Benutzer Authentifizierung
  10. Erweiterte Konfiguration

Basis Oracle 8 System vorbereiten

Den Host vorbereiten wie 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!) ⇒ 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:

tomcat.service
[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:

<Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000"
               redirectPort="8443" />
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

..
 <Connector protocol="AJP/1.3"
               address="127.0.0.1"
               port="8009"
 
               tcpNoDelay="true"
 
               maxThreads="400" 
               processorCache="400"
 
               acceptCount="350" 
               acceptorThreadCount="2"
               connectionTimeout="2000"
 
               requiredSecret="ORACLEAPEX1234"
               secretRequired="true"
 
               redirectPort="8443" />

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

WEB

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

<user-mapping>
    <!-- Per-user authentication and config information -->      
        <authorize 
            username="admin"
            password="48503dfd58720bd5ff35c102065a52d7"
            encoding="md5">
 
        <connection name="Oracle APEX ENV>
            <protocol>ssh</protocol>
            <param name="hostname">10.10.10.90</param>
            <param name="port">22</param>
        </connection>
 
        <connection name="Windows Client GPI">
            <protocol>rdp</protocol>
            <param name="hostname">10.10.10.10</param>
            <param name="port">3389</param>       
            <param name="ignore-cert">true</param>
            <param name="security">nla</param>
        </connection>
    </authorize>
</user-mapping>

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://<your-Server>: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:
<code bash>
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
<IfModule mod_deflate.c>
  # 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
 
</IfModule>

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

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:

<IfModule mpm_worker_module>
    ServerLimit             250
    StartServers             10
    MinSpareThreads          75
    MaxSpareThreads         250
    ThreadLimit              64
    ThreadsPerChild          32
    MaxClients             8000
    MaxRequestsPerChild   10000
</IfModule>

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 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
<VirtualHost *:80>
    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]
</VirtualHost>

Anpassen /etc/httpd/conf.d/ssl.conf

 # nicht in der Vhost Section!
 SSLPassPhraseDialog exec:/srv/cert/passphrase-file.conf
 
 # forward ORDS requests to tomcat
 <VirtualHost *:443>
    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
    <Location "/guacamole-1.5.0">
        ProxyPass        "ajp://localhost:8009/guacamole-1.5.0" secret=ORACLEAPEX1234 timeout=600
        #nicht notwendig? ProxyPassReverse "ajp://localhost:8009/guacamole-1.5.0"
    </Location>
</VirtualHost>
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:

..
  <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" 
               address="127.0.0.1" />
..

LDAP Integration

Nachdem die Datenbank Integration nun aufgesetzt ist, kann im nächsten Schritt die Integration der Anmeldung im AD erfolgen.

 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

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

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

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
linux/oracle_linux_8_guacamole.txt · Zuletzt geändert: 2023/11/24 11:45 von gpipperr