Konfigurácia a inštalácia OpenJDK a Jetty

Budú sa inštalovať nasledovné verzie softvérov:

Java OpenJDK 11

Jetty 9.4

Inštalácia OpenJDK

dnf -y install java-11-openjdk

Adresár s nainštalovanou verziou: /usr/lib/jvm Zobrazenie podrobností nainštalovanej verzie:

java -version

Nastavíme Java_HOME (premennú používajú aplikácie Java na určenie umiestnenia inštalácie Java):

vim /etc/profile.d/java.sh

Do vytvoreného súboru zapíšeme:

JAVA_HOME="/usr/lib/jvm/java-11-openjdk-11.0.x.x-x.el8_2.x86_64"

Po uložení súboru java.sh uplatníme zmeny:

source /etc/profile.d/java.sh

Skontrolujeme nastavenie:

echo $JAVA_HOME

Mal by sa zobraziť výsledok:

/usr/lib/jvm/java-11-openjdk-11.0.x.x-x.el8_2.x86_64

Inštalácia a konfigurácia Jetty

Vytvoríme novú skupinu “idp” a používateľa “idp”.

groupadd idp
useradd -m -g idp -s /bin/bash idp

Stiahneme aktuálnu verziu Jetty (v tomto návode je to jetty-distribution-9.4.31…)

Eclipse Jetty Downloads - The latest release
wget URL=odkaz-na-stiahnutie-jetty
wget https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.31.v20200723/jetty-distribution-9.4.31.v20200723.tar.gz

Rozbalíme, premiestnime a premenujeme:

tar -zxvf jetty-distribution-9.4.31.v20200723.tar.gz
mv jetty-distribution-9.4.31.v20200723 /opt/
mv /opt/jetty-distribution-9.4.31.v20200723 /opt/jetty

Zmeníme vlastníka adresára:

chown -R idp:idp /opt/jetty

Vytvoríme konfiguračný súbor:

vim /etc/default/jetty

S obsahom:

JETTY_HOME=/opt/jetty
JETTY_BASE=/opt/jetty
su idp
cd /opt/jetty

Konfigurácia Jetty:

java -jar /opt/jetty/start.jar --create-startd
java -jar /opt/jetty/start.jar --add-to-start=http,https,console-capture,deploy,jsp,jstl,plus,servlets,annotations,ext,resources,requestlog,setuid,rewrite,ssl

Úprava konfiguračného súboru start.ini:

vim /opt/jetty/start.d/start.ini
# ---------------------------------------
# Module: http
# Enables an HTTP connector on the server.
# By default HTTP/1 is support, but HTTP2C can
# be added to the connector with the http2c module.
# ---------------------------------------
--module=http
jetty.http.host=localhost
jetty.http.port=80
# ---------------------------------------
# Module: ssl
# Enables a TLS(SSL) Connector on the server.
# This may be used for HTTPS and/or HTTP2 by enabling
# the associated support modules.
# ---------------------------------------
--module=ssl
jetty.ssl.port=443

Úprava konfiguračného súboru “setuid.ini” (spustenie Jetty pod neprivilegovaným používateľom):

vim /opt/jetty/start.d/setuid.ini
# ---------------------------------------
# Module: setuid
# Enables the unix setUID configuration so that the server
# may be started as root to open privileged ports/files before
# changing to a restricted user (eg jetty).
# ---------------------------------------
--module=setuid

## SetUID Configuration
# jetty.setuid.startServerAsPrivileged=false
# jetty.setuid.userName=jetty
# jetty.setuid.groupName=jetty
# jetty.setuid.umask=002
# jetty.setuid.clearSupplementalGroups=false
jetty.setuid.startServerAsPrivileged=false
jetty.setuid.userName=idp
jetty.setuid.groupName=idp
jetty.setuid.umask=002

Vytvorenie domovskej stránky pre webový server:

mkdir -p /opt/jetty/webapps/root
vim /opt/jetty/webapps/root/index.html

Príklad obsahu index.html:

<html>
        <head>
                <title>
                        DemoIdP
                </title>
        </head>
        <body>
                <h1>DemoIdP</h1>
        </body>
</html>

Príprava pre aplikáciu Shibboleth IdP:

mkdir /opt/jetty/tmp
vim /opt/jetty/webapps/idp.xml

Konfiguračný súbor idp.xml obsahuje:

<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>
    <Set name="tempDirectory">/opt/jetty/tmp</Set>
</Configure>

Upravíme konfiguračný súbor start.ini (nastavenia pre zvýšenie bezpečnosti):

vim /opt/jetty/start.d/start.ini
# ---------------------------------------
# Module: server
# Enables the core Jetty server on the classpath.
# ---------------------------------------
--module=server
jetty.httpConfig.sendServerVersion=false

Konfiguráciu jetty-rewrite.xml doplníme nasledovne:

vim /opt/jetty/etc/jetty-rewrite.xml
<?xml version="1.0"?><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
<Configure id="Server" class="org.eclipse.jetty.server.Server">
 
  <!-- =========================================================== -->
  <!-- configure rewrite handler                                   -->
  <!-- =========================================================== -->
  <Call name="insertHandler">
    <Arg>
      <New class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
        <Set name="rewriteRequestURI"><Property name="jetty.rewrite.rewriteRequestURI" deprecated="rewrite.rewriteRequestURI" default="true"/></Set>
        <Set name="rewritePathInfo"><Property name="jetty.rewrite.rewritePathInfo" deprecated="rewrite.rewritePathInfo" default="false"/></Set>
        <Set name="originalPathAttribute"><Property name="jetty.rewrite.originalPathAttribute" deprecated="rewrite.originalPathAttribute" default="requestedPath"/></Set>
 
        <!-- Set DispatcherTypes  -->
        <Set name="dispatcherTypes">
          <Array type="javax.servlet.DispatcherType">
            <Item><Call class="javax.servlet.DispatcherType" name="valueOf"><Arg>REQUEST</Arg></Call></Item>
            <Item><Call class="javax.servlet.DispatcherType" name="valueOf"><Arg>ASYNC</Arg></Call></Item>
          </Array>
        </Set>
 
        <Get id="Rewrite" name="ruleContainer"/>
 
        <!-- see rewrite-compactpath.xml for example how to add a rule -->
 
        <Call name="addRule">
          <Arg>
            <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
              <Set name="pattern">*</Set>
              <Set name="name">Strict-Transport-Security</Set>
              <Set name="value">max-age=15768000</Set>
            </New>
          </Arg>
        </Call>
 
        <Call name="addRule">
          <Arg>
            <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
              <Set name="pattern">*</Set>
              <Set name="name">X-Content-Type-Options</Set>
              <Set name="value">nosniff</Set>
            </New>
          </Arg>
        </Call>
 
        <Call name="addRule">
          <Arg>
            <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
              <Set name="pattern">*</Set>
              <Set name="name">X-Xss-Protection</Set>
              <Set name="value">1; mode=block</Set>
            </New>
          </Arg>
        </Call>
 
        <Call name="addRule">
          <Arg>
            <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
              <Set name="pattern">*</Set>
              <Set name="name">X-Frame-Options</Set>
              <Set name="value">DENY</Set>
            </New>
          </Arg>
        </Call>
 
        <Call name="addRule">
          <Arg>
            <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
              <Set name="pattern">*</Set>
              <Set name="name">Content-Security-Policy-Report-Only</Set>
              <Set name="value">default-src 'self'; style-src 'self' https://maxcdn.bootstrapcdn.com; script-src 'self' https://maxcdn.bootstrapcdn.com https://ajax.googleapis.com; img-src 'self'; font-src https://maxcdn.bootstrapcdn.com; frame-ancestors 'none'</Set>
            </New>
          </Arg>
        </Call>
 
        <Call name="addRule">
          <Arg>
            <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
              <Set name="pattern">*</Set>
              <Set name="name">Referrer-Policy</Set>
              <Set name="value">no-referrer-when-downgrade</Set>
            </New>
          </Arg>
        </Call>
 
      </New>
    </Arg>
  </Call>
</Configure>

Konfigurácia SSL

Pre webový server budeme potrebovať verejný certifikát vydaný verejnou certifikačnou autoritou (ďalej CA).

Vygenerujeme si žiadosť o certifikát (nachádzame sa v domovskom adresári používateľa “root”):

mkdir ssl_cert (vytvoríme si adresár, do ktorého budeme ukladať všetko potrebné)
cd /root/ssl_cert
openssl req -new -newkey rsa:2048 -nodes -keyout demoidp.key -out demoidp.csr

Proces generovania prebieha nasledovne (možeme si pripraviť informácie, ktoré potrebujeme vyplniť):

Generating a RSA private key
.......+++++
........+++++
writing new private key to 'demoidp.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

V adresári “/root/ssl_cert” by sa mali nachádzať vygenerované súbory:

demoidp.csr
demoidp.key

Súbor demoidp.csr je určený pre vygenerovanie SSL certifikátu verejnou CA.

Certifikát, ktorý sme už dostali od verejnej CA si v tomto príklade premenujeme na: “demoidp.crt”.

V adresári “/root/ssl_cert” máme spolu sústredené súbory:

demoidp.csr
demoidp.key
demoidp.crt (skopírovaný a premenovaný certifikát od verejnej CA)
intermediate.crt (medziľahlý certifikát od verejnej CA doručený spolu s SSL certifikátom - koreňový certifikát verejnej CA nepotrebujeme

V prípade, že verejná CA používa medziľahlý certifikát potrebujeme ho zlúčiť s SSL certifikátom vygenerovaným pre webový server:

cat demoidp.crt intermediate.crt > jetty-cert.txt

Vytvorený súbor jetty-cert.txt prevedieme do formátu PKCS#12.

Budeme vyzvaný na zadanie hesla (nezabudneme si ho poznačiť, pre účely tohto návodu ho nazveme Heslo_1)

openssl pkcs12 -export -inkey demoidp.key -in jetty-cert.txt -out jetty-cert.pkcs12

V adresári “/root/ssl_cert” by sa mali momentálne spolu nachádzať súbory:

demoidp.csr
demoidp.key
demoidp.crt
intermediate.crt
jetty-cert.txt
jetty-cert.pkcs12

Ďalej importujeme súbor “jetty-cert.pkcs12” do keystore.

Pri vytváraní keystore budeme vyzvaný na zadanie nového hesla, ktoré si tiež nezabudneme poznačiť (pre účely tohto návodu ho nazveme Heslo_2).

Následne potom budeme vyzvaný na zadanie hesla - Heslo_1, ktoré sme zadali pri vytváraníjetty-cert.pkcs12.

$JAVA_HOME/bin/keytool -importkeystore -srckeystore jetty-cert.pkcs12 -srcstoretype PKCS12 -destkeystore keystore

Proces prebieha nasledovne:

Importing keystore jetty-cert.pkcs12 to keystore...
Enter destination keystore password:  ------------------> zadávame Heslo_2
Re-enter new password: -------------> zadávame Heslo_2
Enter source keystore password: ----------------> zadávame Heslo_1
Entry for alias 1 successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or cancelled

V adresáry “/root/ssl_cert” nám pribudol súbor “keystore”. Presunieme ho do umiestnenia “/opt/jetty/etc” a nastavíme mu potrebné oprávnenia:

mv keystore /opt/jetty/etc
chown idp:idp /opt/jetty/etc/keystore

Obsfukácia hesla.

Účelom je skomplikovať viditeľnosť hesla “Heslo_2”, ktoré potrebujeme zapísať do konfigurácie start.ini.

java -cp /opt/jetty/lib/jetty-util-9.4.31.v20200723.jar org.eclipse.jetty.util.security.Password Heslo_2

Výstup po úspešnej obsfukácii vyzerá nasledovne (pre príklad sú použité “x”):

Heslo_2
OBF:XxxxXxxxXXxxxxXXxxxXXXXxxxxxXXXXxxxxXxxXxXxXxxxxXXxXXxxxxX
MD5:XxXxxXXxxxXxxXXxXxx

Do konfigurácie start.ini doplníme obsfukované Heslo_2 vo formáte OBF:

vim /opt/jetty/start.d/start.ini
# ---------------------------------------
# Module: ssl
# Enables a TLS(SSL) Connector on the server.
# This may be used for HTTPS and/or HTTP2 by enabling
# the associated support modules.
# ---------------------------------------
--module=ssl
jetty.ssl.port=443

## Keystore password
jetty.sslContext.keyStorePassword=OBF:XxxxXxxxXXxxxxXXxxxXXXXxxxxxXXXXxxxxXxxXxXxXxxxxXXxXXxxxxX

## KeyManager password
jetty.sslContext.keyManagerPassword=OBF:XxxxXxxxXXxxxxXXxxxXXXXxxxxxXXXXxxxxXxxXxXxXxxxxXXxXXxxxxX

## Truststore password
jetty.sslContext.trustStorePassword=OBF:XxxxXxxxXXxxxxXXxxxXXXXxxxxxXXXXxxxxXxxXxXxXxxxxXXxXXxxxxX

Zakázanie nedôveryhodných protokolov a slabých šifier

Vytvoríme súbor tweak-ssl.xml:

vim /opt/jetty/etc/tweak-ssl.xml

S obsahom:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
 
<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
 
  <!-- Zakázání starých a nedůvěryhodných šifer -->
  <Call name="addExcludeCipherSuites">
    <Arg>
      <Array type="String">
        <Item>.*DES.*</Item>
        <Item>.*DSS.*</Item>
        <Item>.*MD5.*</Item>
        <Item>.*NULL.*</Item>
        <Item>.*RC4.*</Item>
        <Item>.*_RSA_.*MD5$</Item>
        <Item>.*_RSA_.*SHA$</Item>
        <Item>.*_RSA_.*SHA1$</Item>
        <Item>TLS_DHE_RSA_WITH_AES_128.*</Item>
        <Item>TLS_DHE_RSA_WITH_AES_256.*</Item>
      </Array>
    </Arg>
  </Call>
 
  <!-- Zakázání nedůvěryhodných protokolů -->
  <Call name="addExcludeProtocols">
    <Arg>
     <Array type="java.lang.String">
       <Item>SSL</Item>
       <Item>SSLv2</Item>
       <Item>SSLv2Hello</Item>
       <Item>SSLv3</Item>
     </Array>
    </Arg>
  </Call>
 
  <!-- Povolení Forward Secrecy -->
  <Set name="IncludeCipherSuites">
    <Array type="String">
      <Item>TLS_DHE_RSA.*</Item>
      <Item>TLS_ECDHE.*</Item>
    </Array>
  </Set>
 
</Configure>

Ďalej pridáme obsah súboru do konfigurácie HTTPS:

echo /opt/jetty/etc/tweak-ssl.xml >> /opt/jetty/start.d/https.ini

Vytvorenie systemd service file pre Jetty

vim /usr/lib/systemd/system/jetty.service

Vytvoríme súbor jetty.service s obsahom:

#
# A basic systemd configuration for Jetty to start on boot 
# 
# Uses the Service scenario of 'oneshot' run as root
# and once the process has run, it is considered successful
# regardless of error code (even 'FAILURE') as jetty
# may take longer to start than jetty.sh observes it's logs 
# for.  
#
#

[Unit]
Description=Jetty Web Application Server
After=network.target

[Install]
WantedBy=multi-user.target
Alias=jetty.service
 
[Service]
Type=oneshot

# Execute pre and post scripts as root
PermissionsStartOnly=true

# The process will be considered active after it exits
RemainAfterExit=yes

# Note on the Start we do not wait for successful start.
# This is to allow the container to run beyond the jetty shell script
# in cases where it takes very long to start and results in jetty.sh
# reporting FAILED.  It's a false positive on failure.

ExecStart=-/opt/jetty/bin/jetty.sh start
ExecStop=/opt/jetty/bin/jetty.sh stop
ExecReload=/opt/jetty/bin/jetty.sh restart

Povolíme službu HTTPS vo firewall:

firewall-cmd --zone=public --permanent --add-service=https
firewall-cmd --reload
firewall-cmd --zone=public --list-services  (môžeme skontrolovať zmenu)

Nastavíme automatické spustenie služby jetty.service a službu spustíme:

systemctl daemon-reload
systemctl enable jetty
systemctl start jetty
systemctl status jetty (môžeme skontrolovať stav)

Stav Jetty môžeme skontrolovať aj spustením skriptu:

/opt/jetty/bin/jetty.sh check

Môžete pokračovať Konfigurácia a inštalácia Shibboleth

  • install/idp/konfiguracia_a_instalacia_openjdk_a_jetty
  • Posledná úprava: 09. 04. 2021 12:43