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.
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:
Für diese Umgebung werden drei Ebene von Anwender verwendet und konfiguriert.
Im Laufe der Installation werden die pro Schritt die passenden User angelegt.
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:
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
dnf install dejavu-sans-mono-fonts
GCC und Tools installieren:
dnf install unzip make cmake gcc libtool wget
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
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/
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
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.
! 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.
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
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
Konfiguration befindet sich dann hier:
Apache Tomcat wird über die folgenden vier Dateien in $CATALINA_BASE/conf konfiguriert:
Die Dateien liegen unter $CATALINA_HOME\conf Verzeichnis
Ü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" />
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
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
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].
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>
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.
Guacamole unterstützt die Mysql/MariaDB, Postgree und MS SQL. Leider noch nicht eine Oracle Datenbank.
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
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/
# 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
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!
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!
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
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:
siehe auch ⇒ https://docs.oracle.com/en/operating-systems/oracle-linux/8/obe-apache-install/#before-you-begin
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
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
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
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
File: /etc/httpd/conf.d/security.conf
ServerSignature Off ServerTokens Prod TraceEnable Off
Test z.b. mit https://www.joedog.org/siege-home/ oder auch https://httpd.apache.org/docs/2.4/programs/ab.html
File: vi /etc/httpd/conf.d/guacamole.conf
HostnameLookups off
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.
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.
Um die Zertifikate besser zu finden wird ein zentrale Order unter /srv anlegt, dort erzeugen wir auch den Zertifikatsrequest.
*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
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
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
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
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" /> ..
Nachdem die Datenbank Integration nun aufgesetzt ist, kann im nächsten Schritt die Integration der Anmeldung im AD erfolgen.
Ablauf:
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/
Ü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
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.
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!
In der DB muss der User gleich wie im AD genannt werden, damit der AD User zu einem DB User gemappt werden kann.
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.
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).
Auf dem Guacamole Server:
dnf install google-droid-sans-mono-fonts
In den Verbindungseinstellungen „DroidSansMono“ für die Schriftart hinterlegen.
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.
Mehr dazu unter Session Recording in Apache Guacamole
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
Datenbank Einsatz
Bedienung
Beispiele für Konfiguration:
Rest API