Toto je staršia verzia dokumentu!
Konfigurácia a inštalácia OpenJDK a Jetty
Budú sa inštalovať nasledovné verzie softvérov:
Java OpenJDK 11
Jetty 9.4
OpenJDK
Akú verziu Jetty mám použiť?
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
jetty.service
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