Inhaltsverzeichnis
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.
Ü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.
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 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.
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
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:
<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>
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.
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
Mehr dazu unter 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
Datenbank Einsatz
Bedienung
Beispiele für Konfiguration:
Rest API