====== Migrace Jetty na Shibboleth plugin ====== **Na této stránce se nachází návod, jak migrovat z Jetty instalovaného ze zdrojových kódů na Jetty Base Plugin od Shibbolethu. Plugin zjednodušuje správu verzí Jetty pomocí symbolických odkazů a poskytuje předpřipravenou konfigurační strukturu pro provoz Shibboleth IdP.** ---- ===== Příprava ===== Předpokládáme, že při instalaci Jetty ze zdrojových kódů jste postupovali dle našeho návodu [[:cs:tech:idp:5:jetty]]. Zastavíme původní službu jetty.service a smažeme ji: # Zastavíme Jetty systemctl stop jetty.service # Smažeme jetty.service a override.conf rm /etc/systemd/system/jetty.service /etc/systemd/system/jetty.service.d/override.conf ===== Instalace ===== Vývojáři z Konsorcia Shibboleth zjednodušili provoz Shibbolethu, pokud se rozhodnete používat jimi doporučený webový server Jetty. Nyní se Jetty instaluje pomocí skriptů dodaných Shibbolehtem. Pro tzv. JettyBasePluginu je nutný Shibboleth IdP verze alespoň 5.1. # Přepnutí do adresáře /opt/shibboleth-idp cd /opt/shibboleth-idp # Instalace pluginu Jetty ./bin/plugin.sh -I net.shibboleth.idp.plugin.jetty # Stažení Jetty verze 12.1.6 ./bin/downloadjetty.sh 12.1.6 # Použití Jetty verze 12.1.6 ./bin/setjettyversion.sh 12.1.6 # Nastavení Jetty na major verzi 12 (pro konfiguraci) ./bin/setjettybase.sh 12 Tím je instalace hotová a přesuneme se ke konfiguraci. ===== Konfigurace ===== Konfigurace Jetty pro běh Shibboleth IdP je velice přímočará – stačí stáhnout již připravené konfigurační soubory a v některých z nich provést drobné změny. ==== Keystore ==== Pro jednoduchost použijeme stávající keystore. cp /opt/jetty-idp/etc/keystore.p12 /opt/shibboleth-idp/credentials/idp-userfacing.p12 chown jetty /opt/shibboleth-idp/credentials/idp-userfacing.p12 chmod 600 /opt/shibboleth-idp/credentials/idp-userfacing.p12 ==== shibboleth.ini ==== Konfigurační soubor ''/opt/shibboleth-idp/jetty-base/start.d/shibboleth.ini'' je víceméně připravený, stačí v něm provést několik změn: - ''jetty.ssl.host=0.0.0.0'' z původní hodnoty ''127.0.0.1'', - ''jetty.ssl.port=443'' z původní hodnoty ''8443'', - ''jetty.http.port=80'' z původní hodnoty ''8080'', - ''jetty.sslContext.keyStorePassword='' heslo z předchozího kroku, když jste generovali keystore, - ''jetty.sslContext.trustStorePassword='' heslo z předchozího kroku, když jste generovali keystore, - ''jetty.sslContext.keyManagerPassword='' heslo z předchozího kroku, když jste generovali keystore, - ''jetty.httpConfig.sendServerVersion=false'' tento řádek ve výchozí konfiguraci chybí, - ''etc/tweak-ssl.xml'' tento řádek ve výchozí konfiguraci chybí. # Setup common for running an IdP or a Hub (for SP4) # Enable our "comprehensive" module --module=shibboleth # Route access logging through standard SLF4J logging API etc/jetty-requestlog.xml # Do not expose contexts to web. jetty.server.default.showContexts=false ################################## ## Network/Host/Port configuration ################################## ## TLS host and port to bind to jetty.ssl.host=0.0.0.0 jetty.ssl.port=443 # Non-TLS host and port to bind to jetty.http.host=127.0.0.1 jetty.http.port=80 ###################################### ## Keystore properties for TLS support ###################################### # Keystore file path (relative to $jetty.base) jetty.sslContext.keyStorePath=../credentials/idp-userfacing.p12 jetty.sslContext.trustStorePath=../credentials/idp-userfacing.p12 # Keystore type #jetty.sslContext.keyStoreType=PKCS12 #jetty.sslContext.trustStoreType=PKCS12 # Keystore passwords jetty.sslContext.keyStorePassword=changeit jetty.sslContext.trustStorePassword=changeit jetty.sslContext.keyManagerPassword=changeit # Deny SSL renegotiation jetty.sslContext.renegotiationAllowed=false # Skip SNI hostcheck jetty.ssl.sniHostCheck=false # Suppress node name in JSESSIONID values # This assumes a non-clustered Jetty deploy jetty.sessionIdManager.workerName= jetty.httpConfig.sendServerVersion=false etc/tweak-ssl.xml Předpřipravený soubor ''shibboleth.ini'' pro Jetty můžete stáhnout od nás. # Stažení připraveného souboru shibboleth.ini wget -O /opt/shibboleth-idp/jetty-base/start.d/shibboleth.ini \ 'https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=3' ==== shibboleth.mod ==== Do souboru ''/opt/shibboleth-idp/jetty-base/modules/shibboleth.mod'' přidáme podporu pro HTTP2 a modul rewrite starající se o posílání dodatečných hlaviček definovaných v ''jetty-rewrite-rules.xml'' níže. [description] Configure Jetty for use as a Shibboleth IdP and/or SP Hub container. [tags] shibboleth [depend] ee11-annotations ee11-deploy ee11-jsp ee11-jstl ee11-plus ee11-servlets ee11-webapp resources server ext http https ssl rewrite http2 [files] tmp/ Hotový soubor ''shibboleth.mod'' můžete stáhnout od nás. # Stažení připraveného souboru shibboleth.mod wget -O /opt/shibboleth-idp/jetty-base/modules/shibboleth.mod \ https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=5 ==== tweak-ssl.xml ==== Konfiguračním souborem ''/opt/shibboleth-idp/jetty-base/etc/tweak-ssl.xml'' nastavíme moderní šifrování pro Jetty. .*DES.* .*DSS.* .*MD5.* .*NULL.* .*RC4.* .*_RSA_.*MD5$ .*_RSA_.*SHA$ .*_RSA_.*SHA1$ TLS_DHE_RSA_WITH_AES_128.* TLS_DHE_RSA_WITH_AES_256.* TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 SSL SSLv2 SSLv2Hello SSLv3 TLSv1.3 TLSv1.2 TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_ECDHE.* Soubor ''tweak-ssl.xml'' pro jednoduchost stáhněte od nás. # Stažení připraveného souboru tweak-ssl.xml wget -O /opt/shibboleth-idp/jetty-base/etc/tweak-ssl.xml \ 'https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=7' ==== jetty-rewrite-rules.xml ==== V souboru ''/opt/shibboleth-idp/jetty-base/etc/jetty-rewrite-rules.xml'' nastavíme bezpečnostní hlavičky jako HSTS a další. * Strict-Transport-Security Max-Age=15768000 * X-Content-Type-Options nosniff * X-Xss-Protection 1; mode=block * X-Frame-Options DENY * Content-Security-Policy default-src 'self'; style-src 'self'; script-src 'self' 'unsafe-inline'; img-src 'self'; font-src; frame-ancestors 'none' * Referrer-Policy no-referrer-when-downgrade Soubor ''jetty-rewrite-rules.xml'' je k dispozici u nás. # Stažení připraveného souboru jetty-rewrite-rules.xml wget -O /opt/shibboleth-idp/jetty-base/etc/jetty-rewrite-rules.xml \ https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=9 ==== index.jsp ==== Vytvoříme adresář ''/opt/shibboleth-idp/jetty-base/webapps/root/'' a v něm soubor ''index.jsp'' s přesměrováním na hlavní stránku naší organizace. # Vytvoříme adresář webapps/root/ mkdir -p /opt/shibboleth-idp/jetty-base/webapps/root/ # Vytvořime soubor index.jsp echo '<% response.sendRedirect("https://www.example.org/"); %>' \ > /opt/shibboleth-idp/jetty-base/webapps/root/index.jsp ==== mariadb-java-client.jar ==== V Jetty musíme vytvořit symbolický odkaz na knihovnu pro komunikaci s databází MariaDB. # Vytvoření adresáře pro externí knihovny mkdir /opt/shibboleth-idp/jetty-base/lib/ext # Vytvoření symbolického odkazu na knihovnu pro databázi MariaDB ln -s /usr/share/java/mariadb-java-client.jar \ /opt/shibboleth-idp/jetty-base/lib/ext/ ==== jetty.service ==== Součástí rozšíření IdP pro Jetty je i soubor ''/opt/shibboleth-idp/jetty-base/jetty.service'' pro systemd, který je nutné drobně upravit. Musíme změnit skupinu na ''jetty'' a přidat sekci ''[Install]''. [Unit] Documentation=https://www.eclipse.org/jetty/documentation/ Description=Jetty Server After=network-online.target Wants=network-online.target [Service] Type=forking # Set to your chosen values. User=jetty Group=jetty # Allow binding to port 80/443. AmbientCapabilities=CAP_NET_BIND_SERVICE Restart=no TimeoutSec=45 KillMode=process WorkingDirectory=/opt/shibboleth-idp/jetty-base ExecStart=/opt/shibboleth-idp/bin/runjetty.sh start ExecStop=/bin/kill ${MAINPID} SuccessExitStatus=130 143 [Install] WantedBy=multi-user.target Případně můžete soubor ''jetty.service'' stáhnout následujícím příkazem. # Stažení jetty.service wget -O /opt/shibboleth-idp/jetty-base/jetty.service \ 'https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=13' Nyní je nutné vytvořit symbolický odkaz do systemd. # Vytvoření symbolického odkazu do systemd ln -s /opt/shibboleth-idp/jetty-base/jetty.service \ /etc/systemd/system/ ==== Práva ==== Nyní vytvoříme pracovní adresář a nastavíme odpovídající práva. # Vytvoření pracovního adresáře pro Jetty mkdir /opt/shibboleth-idp/jetty-dist/jetty-tmp # Nastavení práv k pracovnímu adresáři pro Jetty chown jetty /opt/shibboleth-idp/jetty-dist/jetty-tmp # Nastavení práv k runjetty.sh chown jetty /opt/shibboleth-idp/bin/runjetty.sh # Nastavení práv k adresáři s logy chown jetty /opt/shibboleth-idp/logs/ ==== Spuštění ==== Nyní můžeme spustit Jetty. # Znovunačtení systemd konfigurace systemctl daemon-reload # Spouštět Jetty po startu operačního systému systemctl enable jetty # Spuštění Jetty systemctl start jetty Přesvědčíme se, že vše funguje: # Kontrola síťových spojení ss -tlpn | fgrep java Měli bychom vidět, že port ''80'' poslouchá pouze na adrese ''127.0.0.1'' a port ''443'' na všech adresách: # Kontrola síťových spojení LISTEN 0 50 [::ffff:127.0.0.1]:80 *:* users:(("java",pid=15630,fd=61)) LISTEN 0 50 *:443 *:* users:(("java",pid=15630,fd=55))