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 [2024/03/27 08:37] (aktuální) – Jan Oppolzer | ||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
====== Jetty ====== | ====== 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:tech:idp: | |
- | ---- | + | |
- | + | ||
- | ===== 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=" | + | |
- | < | + | |
- | <Array type=" | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | <!-- Exclude old and unsafe protocols --> | + | |
- | <Call name=" | + | |
- | < | + | |
- | <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 | + | |
- | + | ||
- | * 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=" | + | |
- | < | + | |
- | <New class=" | + | |
- | + | ||
- | <Set name=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | + | ||
- | <Set name=" | + | |
- | <Array type=" | + | |
- | < | + | |
- | < | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | <!-- Strict-Transport-Security --> | + | |
- | <Call name=" | + | |
- | < | + | |
- | <New class=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | <!-- X-Content-Type-Options --> | + | |
- | <Call name=" | + | |
- | < | + | |
- | <New class=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | <!-- X-Xss-Protection --> | + | |
- | <Call name=" | + | |
- | < | + | |
- | <New class=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | <!-- X-Frame-Options --> | + | |
- | <Call name=" | + | |
- | < | + | |
- | <New class=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | <!-- Content-Security-Policy --> | + | |
- | <Call name=" | + | |
- | < | + | |
- | <New class=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | <Set name=" | + | |
- | </ | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | <!-- Referrer-Policy --> | + | |
- | <Call name=" | + | |
- | < | + | |
- | <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 | + |