Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
| cs:tech:idp:jetty [2020/03/27 07:51] – [idp.ini] 9ec128d6c1ed31e124c9d0343d1175613f20f405@einfra.cesnet.cz | cs:tech:idp:jetty [2026/03/04 17:20] (aktuální) – odstraněno Jan Oppolzer | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| - | ====== Jetty ====== | ||
| - | |||
| - | **Na této stránce se nachází návod, jak do linuxové distribuce Debian nainstalovat Jetty jako servlet kontejner a HTTP server pro potřeby Shibboleth IdP. Před instalací musíme zprovoznit [[cs: | ||
| - | |||
| - | ---- | ||
| - | |||
| - | ===== Instalace ===== | ||
| - | |||
| - | //Jetty// nainstalujeme následujícím příkazem: | ||
| - | |||
| - | <code bash> | ||
| - | # Instalace Jetty | ||
| - | apt install --no-install-recommends jetty9 | ||
| - | </ | ||
| - | |||
| - | Nastavíme proměnnou // | ||
| - | |||
| - | <code bash> | ||
| - | # Nastavení proměnné JAVA_HOME | ||
| - | eval $(echo " | ||
| - | </ | ||
| - | |||
| - | ===== Konfigurace ===== | ||
| - | |||
| - | Nakonfigurovat Jetty pro běh Shibboleth IdP je velice triviální, | ||
| - | |||
| - | ==== idp.mod ==== | ||
| - | |||
| - | Vytvoříme si v Jetty tzv. modul pro Shibboleth IdP, který obsahuje veškeré závislosti, | ||
| - | |||
| - | V adresáři ''/ | ||
| - | |||
| - | < | ||
| - | [description] | ||
| - | Shibboleth IdP | ||
| - | |||
| - | [depend] | ||
| - | annotations | ||
| - | deploy | ||
| - | ext | ||
| - | http | ||
| - | http2 | ||
| - | https | ||
| - | jsp | ||
| - | jstl | ||
| - | plus | ||
| - | requestlog | ||
| - | resources | ||
| - | rewrite | ||
| - | server | ||
| - | servlets | ||
| - | ssl | ||
| - | |||
| - | [files] | ||
| - | tmp/ | ||
| - | </ | ||
| - | |||
| - | Nejsnáze toho dosáhneme stažením již připraveného souboru: | ||
| - | |||
| - | <code bash> | ||
| - | # Stažení souboru idp.mod | ||
| - | wget -P / | ||
| - | https:// | ||
| - | </ | ||
| - | |||
| - | ==== keystore ==== | ||
| - | |||
| - | Pro šifrovanou komunikaci bude IdP využívat TLS certifikát. Ten je možné získat na službě [[https:// | ||
| - | |||
| - | Získaný certifikát (zde označený jako '' | ||
| - | |||
| - | <code bash> | ||
| - | # Spojení koncového a mezilehlého certifikátu | ||
| - | cat cert.pem chain.pem > jetty.txt | ||
| - | </ | ||
| - | |||
| - | Následně si certifikát ('' | ||
| - | |||
| - | <code bash> | ||
| - | # Generování nového hesla | ||
| - | openssl rand -hex 20 | ||
| - | |||
| - | # Převod certifikátu do formátu PKCS#12 | ||
| - | openssl pkcs12 -export -inkey key.pem -in jetty.txt -out jetty.pkcs12 | ||
| - | </ | ||
| - | |||
| - | Pak již zbývá jen do adresáře ''/ | ||
| - | |||
| - | <code bash> | ||
| - | # Generování keystore | ||
| - | keytool -importkeystore -srckeystore jetty.pkcs12 \ | ||
| - | -srcstoretype PKCS12 -destkeystore / | ||
| - | |||
| - | # Změna práv ke keystoru | ||
| - | chmod 640 / | ||
| - | chgrp jetty / | ||
| - | </ | ||
| - | |||
| - | Heslo, které jsme si vygenerovali pomocí příkazu '' | ||
| - | |||
| - | ==== idp.ini ==== | ||
| - | |||
| - | V adresáři ''/ | ||
| - | |||
| - | <code ini> | ||
| - | # --------------------------------------- | ||
| - | # Module: idp | ||
| - | # Shibboleth IdP | ||
| - | # --------------------------------------- | ||
| - | --module=idp | ||
| - | |||
| - | # Allows setting Java system properties (-Dname=value) | ||
| - | # and JVM flags (-X, -XX) in this file | ||
| - | --exec | ||
| - | |||
| - | # Newer garbage collector that reduces memory needed for larger metadata files | ||
| - | -XX: | ||
| - | |||
| - | # Maximum amount of memory that Jetty may use | ||
| - | -Xmx1500m | ||
| - | |||
| - | # Keystore password | ||
| - | jetty.sslContext.keyStorePassword=FIXME | ||
| - | # Truststore password | ||
| - | jetty.sslContext.trustStorePassword=FIXME | ||
| - | # KeyManager password | ||
| - | jetty.sslContext.keyManagerPassword=FIXME | ||
| - | |||
| - | # HTTP | ||
| - | jetty.http.host=127.0.0.1 | ||
| - | jetty.http.port=80 | ||
| - | |||
| - | # HTTPS | ||
| - | jetty.ssl.host=0.0.0.0 | ||
| - | jetty.ssl.port=443 | ||
| - | |||
| - | # Disable SSL renegotiation | ||
| - | jetty.sslContext.renegotiationAllowed=false | ||
| - | |||
| - | # Hide Jetty version | ||
| - | jetty.httpConfig.sendServerVersion=false | ||
| - | |||
| - | etc/ | ||
| - | </ | ||
| - | |||
| - | Opět můžeme stáhnout připravený soubor: | ||
| - | |||
| - | <code bash> | ||
| - | # Stažení souboru idp.ini | ||
| - | wget -P / | ||
| - | https:// | ||
| - | </ | ||
| - | |||
| - | V souboru ''/ | ||
| - | |||
| - | < | ||
| - | jetty.sslContext.keyStorePassword= | ||
| - | jetty.sslContext.trustStorePassword= ___HESLO___ | ||
| - | jetty.sslContext.keyManagerPassword= ___HESLO___ | ||
| - | </ | ||
| - | |||
| - | ==== tweak-ssl.xml ==== | ||
| - | |||
| - | V adresáři ''/ | ||
| - | |||
| - | <code xml> | ||
| - | <?xml version=" | ||
| - | < | ||
| - | |||
| - | < | ||
| - | |||
| - | <!-- Exclude old and unsafe ciphers --> | ||
| - | <Call name=" | ||
| - | <Arg> | ||
| - | <Array type=" | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <!-- Exclude old and unsafe protocols --> | ||
| - | <Call name=" | ||
| - | <Arg> | ||
| - | <Array type=" | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <!-- Forward Secrecy --> | ||
| - | <Set name=" | ||
| - | <Array type=" | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Opět můžete použít jíž připravený soubor: | ||
| - | |||
| - | <code bash> | ||
| - | # Stažení souboru tweak-ssl.xml | ||
| - | wget -P /etc/jetty9 \ | ||
| - | https:// | ||
| - | </ | ||
| - | |||
| - | ==== idp.xml ==== | ||
| - | |||
| - | V adresáři ''/ | ||
| - | |||
| - | <code xml> | ||
| - | <?xml version=" | ||
| - | < | ||
| - | |||
| - | < | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Již připravený soubor si můžete stáhnout: | ||
| - | |||
| - | <code bash> | ||
| - | # Stažení souboru idp.xml | ||
| - | wget -P / | ||
| - | https:// | ||
| - | </ | ||
| - | |||
| - | ==== start.ini ==== | ||
| - | |||
| - | Aby si Jetty nestěžovalo, | ||
| - | |||
| - | <code bash> | ||
| - | # Smazání souboru a symbolického odkazu start.ini | ||
| - | rm / | ||
| - | </ | ||
| - | |||
| - | ==== index.jsp ==== | ||
| - | |||
| - | V adresáři ''/ | ||
| - | |||
| - | **Změňte '' | ||
| - | |||
| - | <code bash> | ||
| - | # Smazání statického webu v Jetty | ||
| - | rm / | ||
| - | |||
| - | # Vytvoření přesměrování na domovskou stránku | ||
| - | echo '<% response.sendRedirect(" | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ==== Knihovny ==== | ||
| - | |||
| - | Jetty potřebuje pro správnou funkčnost tyto ctyři JAR soubory, které je nutné umístit do složky s externími knihovnami ''/ | ||
| - | |||
| - | * commons-dbcp2-2.1.1.jar ([[https:// | ||
| - | * commons-pool2-2.4.2.jar ([[https:// | ||
| - | * commons-logging-api-1.1.jar ([[https:// | ||
| - | * mariadb-java-client.jar (JDBC ovladač pro MariaDB). | ||
| - | |||
| - | Po stažení prvních tří souborů uvedených výše je umístíme na server do adresáře ''/ | ||
| - | |||
| - | === Apache Commons DBCP & Pool === | ||
| - | |||
| - | <code bash> | ||
| - | # Přesunutí Apache Commons DBCP2 a Pool2 JAR souborů do Jetty: | ||
| - | cd /opt | ||
| - | mv commons-dbcp2-2.1.1.jar \ | ||
| - | | ||
| - | | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | === JDBC pro MariaDB === | ||
| - | |||
| - | JDBC pro MariaDB jsme nainstalovali v [[mariadb|předchozím krkou]] instalací balíčku '' | ||
| - | |||
| - | <code bash> | ||
| - | # Vytvoření symbolického odkazu na JDBC | ||
| - | ln -s / | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ===== Bezpečnost ===== | ||
| - | |||
| - | Tento krok není pro běh IdP nutný, ale je velice vhodný pro zvýšení bezpečnosti uživatelů, | ||
| - | |||
| - | ==== jetty-rewrite.xml ==== | ||
| - | |||
| - | V adresáři ''/ | ||
| - | |||
| - | <WRAP important 100%> | ||
| - | Zkontrolujte si zejména **Content-Security-Policy** hlavičku! | ||
| - | |||
| - | Pokud se v prohlížeči na IdP nenačtou např. styly nebo obrázky, je to chybějícími záznamy právě v Content-Security-Policy hlavičce. Pokud byste např. chtěli povolit načítání obrázků ze všech [šifrovaných] URL adres (a ne jenom z URL adresy serveru s IdP, čili //' | ||
| - | |||
| - | Používáte-li pro obrázky formát SVG, který v sobě obsahuje definici kaskádových stylů, nezapomeňte do // | ||
| - | |||
| - | //I přes tyto počáteční problémy se však toto bezpečnostní opatření vyplatí, protože webový prohlížeč odmítne uživatelům načíst podstrčené soubory, pokud by se to útočníkovi nějak povedlo.// | ||
| - | </ | ||
| - | |||
| - | <code xml> | ||
| - | <?xml version=" | ||
| - | < | ||
| - | |||
| - | < | ||
| - | |||
| - | <Call name=" | ||
| - | <Arg> | ||
| - | <New class=" | ||
| - | |||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | |||
| - | <Set name=" | ||
| - | <Array type=" | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <!-- Strict-Transport-Security --> | ||
| - | <Call name=" | ||
| - | <Arg> | ||
| - | <New class=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <!-- X-Content-Type-Options --> | ||
| - | <Call name=" | ||
| - | <Arg> | ||
| - | <New class=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <!-- X-Xss-Protection --> | ||
| - | <Call name=" | ||
| - | <Arg> | ||
| - | <New class=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <!-- X-Frame-Options --> | ||
| - | <Call name=" | ||
| - | <Arg> | ||
| - | <New class=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <!-- Content-Security-Policy --> | ||
| - | <Call name=" | ||
| - | <Arg> | ||
| - | <New class=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <!-- Referrer-Policy --> | ||
| - | <Call name=" | ||
| - | <Arg> | ||
| - | <New class=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | <Set name=" | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Jako v předchozích případech, | ||
| - | |||
| - | <code bash> | ||
| - | # Přepsání původního souboru jetty-rewrite.xml novým | ||
| - | wget -O / | ||
| - | https:// | ||
| - | </ | ||
| - | |||
| - | ===== Restart ===== | ||
| - | |||
| - | Konfigurace je hotová, čili můžeme Jetty restartovat: | ||
| - | |||
| - | <code bash> | ||
| - | # Restartování Jetty | ||
| - | systemctl restart jetty9 | ||
| - | </ | ||
| - | |||
| - | Přesvědčíme se, že vše funguje: | ||
| - | |||
| - | <code bash> | ||
| - | # Kontrola síťových spojení | ||
| - | ss -tlpn | fgrep java | ||
| - | </ | ||
| - | |||
| - | Měli bychom vidět, že port '' | ||
| - | |||
| - | <code bash> | ||
| - | # Kontrola síťových spojení | ||
| - | LISTEN | ||
| - | LISTEN | ||
| - | </ | ||
| - | |||
| - | Vyzkoušíme, | ||
| - | |||
| - | <code bash> | ||
| - | # Vyzkoušení přesměrování | ||
| - | wget -S -O/dev/null http:// | ||
| - | wget -S -O/dev/null https:// | ||
| - | </ | ||
| - | |||
| - | ---- | ||
| - | |||
| - | **Máme-li nainstalováno Jetty, můžete pokračovat instalací [[cs: | ||