Jetty jako kontener Shibboleth

Z PIONIER.Id
Wersja z dnia 14:47, 3 sty 2023 autorstwa Pisarz (dyskusja | edycje) (1 wersja)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacji Przejdź do wyszukiwania

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