Jetty jako kontener Shibboleth
Jetty to zalecany kontener dla Shibboleth IdP.
Instalacja Jetty 9
Aktualna wersja to Jetty jetty-distribution-9.4.44.v20210927.tar.gz
Jetty 9.4.44
Pobieramy dystrybucję Jetty 9.4.44 ze strony https://www.eclipse.org/jetty/download.html, np.
wget https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.44.v20210927/jetty-distribution-9.4.44.v20210927.tar.gz
Tworzymy konto użytkownika jetty
useradd --system --home-dir /home/jetty --user-group jetty
Następnie rozpakowujemy pakiet i umieszczamy w katalogu docelowym instalacji, np. /opt/jetty
tar xfvz jetty-distribution-9.4.44.v20210927.tar.gz mv jetty-distribution-9.4.44.v20210927 /opt/jetty ln -s /opt/jetty/bin/jetty.sh /etc/init.d/jetty
Tworzymy plik /etc/default/jetty i wpisujemy w nim zmienne środowiskowe jetty:
JETTY_HOME=/opt/jetty JETTY_BASE=/opt/jetty-apps JETTY_USER=jetty JETTY_PORT=80 JETTY_HOST=..... JETTY_PID=/home/jetty/jetty.pid JETTY_STATE=/home/jetty/jetty.state TMPDIR=/opt/jetty-apps/tmp
Ustawienie JETTY_BASE oznacza, że aplikacje Jetty będą umieszczane w katalogu /opt/jetty-apps.Inicjujemy ten katalog:
mkdir /opt/jetty-apps cd /opt/jetty-apps java -jar /opt/jetty/start.jar --create-startd --add-to-start=http,https,console-capture,deploy,requestlog, \ jsp,jstl,plus,servlets,annotations,ext,resources,ssl
i tworzymy katalog tmp:
mkdir tmp
W pliku /opt/jetty-apps/webapps/idp.xml umieszczamy:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="war">/opt/shibboleth-idp/war/idp.war</Set>
<Set name="contextPath">/idp</Set>
<Set name="extractWAR">false</Set>
<Set name="copyWebDir">false</Set>
<Set name="copyWebInf">true</Set>
</Configure>
W pliku /opt/jetty-apps/start.d/ssl.ini zmieniamy port na 9443:
jetty.ssl.port = 9443
oraz wskazujemy plik z certyfikatem stron IdP - plik ten przygotowujemy w formacie PKCS12
jetty.sslContext.keyStorePath=credentials/jetty.p12 jetty.sslContext.trustStorePath=credentials/jetty.p12 jetty.sslContext.keyStorePassword=password1 jetty.sslContext.keyManagerPassword=password1 jetty.sslContext.trustStorePassword=password1 jetty.sslContext.keyStoreType=PKCS12 jetty.sslContext.trustStoreType=PKCS12
Hasła (jetty.sslContext.keyStorePassword, jetty.sslContext.trustStorePassword, jetty.sslContext.keyManagerPassword) można podać otwartym tekstem, można też zastosować przedstawioną na stronie https://wiki.eclipse.org/Jetty/Howto/Secure_Passwords metodę ukrycia hasła w postaci OBF.
Pobieramy bibliotekę https://build.shibboleth.net/nexus/content/repositories/releases/net/shibboleth/utilities/jetty9/jetty9-dta-ssl/1.0.0/jetty9-dta-ssl-1.0.0.jar i kopiujemy ją do katalogu /opt/jetty-apps/lib/ext/.
Na firewallu serwera zapewniamy forward zleceń kierowanych na port 443 na port 9443. Np. w konfiguracji iptables dodajemy:
*nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 9443 COMMITUpewniamy się, że port 9443 jest otwarty (w sekcji *filter iptables):
-A INPUT -m tcp -p tcp --dport 9443 -j ACCEPT
Restartujemy iptables.
Właścicielem procesu jetty będzie użytkownik jetty. Zapewniamy odpowiednie uprawnienia w katalogach:
chown -R jetty:jetty /opt/jetty/logs/ /opt/jetty-apps/logs/ /opt/jetty-apps/tmp/ /opt/shibboleth-idp/metadata/ /opt/shibboleth-idp/logs/ chown root:jetty /opt/jetty-apps/credentials/* /opt/shibboleth-idp/credentials/* chmod 640 /opt/jetty-apps/credentials/* /opt/shibboleth-idp/credentials/*
Konfiguracja SSL/TLS pod kątem wymogów bezpieczeństwa
Należy zadbać o to, by serwer spełniał wymagania bezpieczeństwa dotyczące: stosowanego certyfikatu, obsługiwanych protokołów oraz akceptowanych typów szyfrowania (cipher suites). Przydatnym testem jest strona https://www.ssllabs.com/ssltest/.W pliku /opt/jetty/etc/jetty-ssl-context.xml, na końcu, przed znacznikiem zamykającym
</Configure>
dodajemy:
<Call name="addExcludeCipherSuites">
<Arg>
<Array type="String">
<Item>.*_DHE_.*$</Item>
</Array>
</Arg>
</Call>
Przygotowanie plików z certyfikatami i kluczami prywatnymi
Pliki z kluczem prywatnym, certyfikatem serwera oraz certyfikatami pośrednimi (pozyskane w czasie generowania certyfikatu serwera np. poprzez usługę PIONIER TCS) należy umieścić w magazynie wskazanym w pliku /opt/jetty-apps/start.d/ssl.ini jako jetty.sslContext.keyStorePath oraz jetty.sslContext.trustStorePath. Jeśli np. certyfikat został wystawiony przez usługę TCS i dysponujemy trzema plikami:
- server.key
- server.pem
- chain.pem
wykonujemy:
cat server.pem chain.pem > jetty-chain.pem openssl pkcs12 -export -inkey server.key -in jetty-chain.pem -out jetty.p12
Plik p12 (lub jks) przegrywamy do katalogu wskazanego w pliku /opt/jetty-apps/start.d/ssl.ini w wierszach jetty.sslContext.keyStorePath oraz jetty.sslContext.trustStorePath (jest to ten sam plik, ponieważ w jednym pliku mamy zarówno certyfikat serwera jak i certyfikaty wystawców).
Uruchomienie jetty
/etc/init.d/jetty start