===== 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