Rozdiely

Tu môžete vidieť rozdiely medzi vybranou verziou a aktuálnou verziou danej stránky.

Odkaz na tento prehľad zmien

install-idp-jetty [2019/07/23 13:55] (aktuálne)
jsilaci@umb.sk vytvorené
Riadok 1: Riadok 1:
 +===== Oracle Java =====
  
 +Aplikácia Shibboleth IdP je napísaná v jazku Java. Na jej spustenie budeme potrebovať Oracle JDK.
 +Najskôr musíme na stránke http://​www.oracle.com/​technetwork/​java/​javase/​downloads/​index.html odkliknúť súhlas s lic. podmienkami Oracle: http://​www.oracle.com/​technetwork/​java/​javase/​downloads/​index.html
 +
 +Potom stiahneme instalačný balíček (skopírujeme URL z webu - inštalujem JDK 8):
 +
 +<​code>​
 +yum install jdk-8u192-linux-x64.rpm
 +</​code>​
 +
 +Kontrola, či je Java nainštalovaná správne:
 +
 +<​code>​
 +update-alternatives --display java
 +</​code>​
 +
 +alebo
 +
 +<​code>​
 +java -version
 +</​code>​
 +
 +Ak sme inštalovali Javu z RPM od Oracle, JAVA_HOME treba nastaviť na adresár:
 +
 +<​code>​
 +/​usr/​java/​latest
 +</​code>​
 +
 +Pridáme export JAVA_HOME do ''​~/​.bashrc''​ a ''​~/​.bash_profile''​
 +
 +<​code>​
 +JAVA_HOME=/​usr/​java/​latest
 +export JAVA_HOME
 +</​code>​
 +
 +===== Java Cryptography Extension =====
 +
 +Kvôli lepším možnostiam šifrovania treba doinštalovať JCE.
 +
 +JCE stiahneme zo stránky Oracle podobne ako JDK (so súhlasom): http://​www.oracle.com/​technetwork/​java/​javase/​downloads/​jce8-download-2133166.html
 +
 +Zip archív rozbalime:
 +
 +<​code>​
 +unzip -x jce_policy-8.zip
 +</​code>​
 +
 +Rozbalené súbory skopírujeme na príslušné miesto do JAVA_HOME:
 +
 +<​code>​
 +cp UnlimitedJCEPolicyJDK8/​*.jar /​usr/​java/​jdk1.8.0_192-amd64/​jre/​lib/​security/​
 +</​code>​
 +
 +===== Jetty =====
 +
 +Ako aplikačný server budeme používať Jetty (podľa odporúčania Shibbloleth).
 +
 +Server Jetty bude bežať pod neprivilegovaným používateľom (aj ked spúšťať sa bude pod rootom, ale o tom neskôr), ktorého treba vytvoriť:
 +
 +<​code>​
 +groupadd idp
 +useradd -m -g idp -s /bin/bash idp
 +</​code>​
 +
 +Stiahneme instalačný balík z webu (napr 9.3): http://​central.maven.org/​maven2/​org/​eclipse/​jetty/​jetty-distribution/​9.3.25.v20180904/​
 +
 +Rozbalíme balík, presunieme ho do ''/​opt''​ a premenujeme na ''​jetty'':​
 +
 +<​code>​
 +tar -zxvf jetty-distribution-9.3.25.v20180904.tar.gz
 +mv jetty-distribution-9.3.25.v20180904 /opt/
 +mv /​opt/​jetty-distribution-9.3.25.v20180904 /opt/jetty
 +</​code>​
 +
 +Zmeníme vlastníka adresára:
 +
 +<​code>​
 +chown -R idp:idp /opt/jetty
 +</​code>​
 +
 +Vytvoríme konfiguračný súbor v ''/​etc''​
 +
 +<​code>​
 +vim /​etc/​default/​jetty
 +</​code>​
 +
 +s obsahom:
 +
 +<​code>​
 +JETTY_HOME=/​opt/​jetty
 +JETTY_BASE=/​opt/​jetty
 +</​code>​
 +
 +===== Konfigurácia Jetty =====
 +
 +Prepneme sa do používateľa idp a nakonfigurujeme Jetty pre potreby IdP:
 +
 +<​code>​
 +su idp
 +cd /opt/jetty
 +java -jar /​opt/​jetty/​start.jar --add-to-startd=http,​https,​logging,​deploy,​jsp,​jstl,​plus,​servlets,​annotations,​ext,​resources,​logging,​requestlog,​setuid,​rewrite
 +</​code>​
 +
 +Upravíme konfiguračný súbor ''​http.ini''​.
 +
 +<​code>​
 +vim /​opt/​jetty/​start.d/​http.ini
 +</​code>​
 +
 +HTTP len pre localhost na porte 80:
 +
 +<​code>​
 +--module=http
 +jetty.http.host=localhost
 +jetty.http.port=80
 +</​code>​
 +
 +HTTPS bude počúvať na štandartnom porte 443:
 +
 +<​code>​
 +vim /​opt/​jetty/​start.d/​ssl.ini
 +</​code>​
 +
 +<​code>​
 +jetty.ssl.port=443
 +</​code>​
 +
 +Kvôli spúšťaniu jetty pod neprivilegovaným používateľom na privilegovanom porte:
 +
 +<​code>​
 +vim /​opt/​jetty/​start.d/​setuid.ini
 +</​code>​
 +
 +<​code>​
 +# ---------------------------------------
 +# Module: setuid
 +--module=setuid
 +
 +## SetUID Configuration
 +jetty.setuid.startServerAsPrivileged=false
 +jetty.setuid.userName=idp
 +jetty.setuid.groupName=idp
 +jetty.setuid.umask=002
 +</​code>​
 +
 +Vytvoríme domovskú strúnku pre web server (stále pod používateľom idp - obsah stránky podľa uváženia - môže byť aj presmerovanie na inú stránku).
 +
 +<​code>​
 +mkdir -p /​opt/​jetty/​webapps/​root
 +vim /​opt/​jetty/​webapps/​root/​index.html
 +</​code>​
 +
 +Pripravíme server pre aplikáciu Shebboleth IdP:
 +
 +<​code>​
 +mkdir /​opt/​jetty/​tmp
 +</​code>​
 +
 +Vytvoríme konfiguračný súbor aplikácie:
 +
 +<​code>​
 +vim /​opt/​jetty/​webapps/​idp.xml
 +</​code>​
 +
 +s obsahom:
 +
 +<code xml>
 +<​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>​
 +</​code>​
 +
 +==== Ďalšie nastavenia a zabezpečenie ====
 +
 +<​code>​
 +vim /​opt/​jetty/​start.d/​server.ini
 +</​code>​
 +
 +Nebude sa zobrazovať verzia servera:
 +
 +<​code>​
 +jetty.httpConfig.sendServerVersion=false
 +</​code>​
 +
 +Content-Security-Policy by sme si mali upraviť podľa našich potrieb ale zatiaľ to necháme tak.
 +
 +<​code>​
 +vim /​opt/​jetty/​etc/​jetty-rewrite.xml
 +</​code>​
 +
 +<code 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>​
 + 
 + 
 +        <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>​
 +</​code>​
 +
 +==== SSL ====
 +
 +Certifikát budem generovať ako root (exit).
 +
 +Pripravime si SSL certifikát,​ ktorý budeme potrebovať ďalej. ​
 +
 +Vygenerovanie novej žiadosti o cerifikát:
 +
 +<​code>​
 +cd /​root/​ssl_cert
 +openssl req -new -newkey rsa:2048 -nodes -keyout demoidpkey -out demoidp.csr
 +</​code>​
 +
 +Sôbor .csr poslať na podpis (stačí obsah sôboru). Podpísaný certifikát premenujeme na ''​demoidp.crt''​.
 +
 +Momentálne by sme mali mať v adresáari ''/​root/​ssl_cert''​ tieto certifikáty:​
 +
 +  * demoidp.crt
 +  * demoidp.csr
 +  * demoidp.key
 +  * DigiCertCA.crt
 +
 +Súbor so žiadosťou ''​demoidp.csr''​ už nebudeme potrebovať.
 +
 +Certifikáty musíme "​zlúčiť"​ do jedného sôboru:
 +
 +<​code>​
 +cat demoidp.crt DigiCertCA.crt > jetty-cert.txt
 +</​code>​
 +
 +Vytvorený sôbor prevedieme do formátu PKCS #12. Pri tejto operácii budeme vyzvaný na zadanie hesla. Heslo si zapamätáme (označíme si ho ako ''​Heslo1''​):​
 +
 +<​code>​
 +openssl pkcs12 -export -inkey demoidp.key -in jetty-cert.txt -out jetty-cert.pkcs12
 +</​code>​
 +
 +Certifikát importujeme do keystore (súbor keystore sa vytvorí v adresári, kde zadávame príkaz - pozor aby boli práva na zápis). Pri vytváraní budeme požiadaný o vytvorenie nového hesla (označíme si ho ''​Heslo2''​) a zadanie pôvodného hesla k certifikatu (''​Heslo1''​).
 +
 +<​code>​
 +$JAVA_HOME/​bin/​keytool -importkeystore -srckeystore jetty-cert.pkcs12 -srcstoretype PKCS12 -destkeystore keystore
 +</​code>​
 +
 +Keystore presunieme do ''/​etc''​ a zmeníme mu oprávnenia:​
 +
 +<​code>​
 +mv keystore /​opt/​jetty/​etc
 +chown idp:idp /​opt/​jetty/​etc/​keystore
 +</​code>​
 +
 +Pomocou ''​jetty-util''​ vygenerujeme obsfukované verzie hesiel ''​Heslo1''​ a ''​Heslo2'':​
 +
 +<​code>​
 +java -cp /​opt/​jetty/​lib/​jetty-util-9.3.25.v20180904.jar org.eclipse.jetty.util.security.Password <​Heslo2>​
 +</​code>​
 +
 +Výstupom príkazu bude niečo ako:
 +
 +<​code>​
 +2018-12-06 12:​28:​09.771:​INFO::​main:​ Logging initialized @97ms
 +sKbH...Q5r9Q
 +OBF:​1rxd1f9t1...1l5b1pbe1dv01v2n1f8t1rvh
 +MD5:​b31221...a3b41cbac61f
 +</​code>​
 +
 +Podobne treba obsfukovať aj Heslo1
 +
 +<​code>​
 +java -cp /​opt/​jetty/​lib/​jetty-util-9.3.25.v20180904.jar org.eclipse.jetty.util.security.Password <​Heslo1>​
 +</​code>​
 +
 +Výstupom príkazu bude niečo ako:
 +
 +<​code>​
 +2018-12-06 12:​30:​12.968:​INFO::​main:​ Logging initialized @98ms
 +YAbK...3tRm
 +OBF:​1sa31i7i1vfx...61jlf1e1z1vgx1i8g1sb7
 +MD5:​34cdf9c2...904d366401d6
 +</​code>​
 +
 +Obsfukované heslá zadáme do súboru ''​start.d/​ssl.ini'':​
 +
 +<​code>​
 +vim /​opt/​jetty/​start.d/​ssl.ini
 +</​code>​
 +
 +Heslá pre ''​keyStorePassword''​ a ''​trustStorePassword''​ su rovnaké:
 +
 +<​code>​
 +jetty.sslContext.keyStorePassword=OBF:​1rxd1f9t1v1r...1f8t1rvh ​       #Heslo2
 +jetty.sslContext.keyManagerPassword=OBF:​1sa31i7i1vfx1...1i8g1sb7 ​    #​Heslo1
 +jetty.sslContext.trustStorePassword=OBF:​1rxd1f9t1v1r...1v2n1f8t1rvh ​ #Heslo2
 +</​code>​
 +
 +Zakážeme málo bezpečné šifry:
 +
 +Vytvoríme súbor ''/​opt/​jetty/​etc/​tweak-ssl.xml''​
 +
 +<​code>​
 +vim /​opt/​jetty/​etc/​tweak-ssl.xml
 +</​code>​
 +
 +Obsah súboru:
 +
 +<code xml>
 +<?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>​
 +</​code>​
 +
 +Pridáme obsah súboru do konfigurácie https:
 +
 +<​code>​
 +echo /​opt/​jetty/​etc/​tweak-ssl.xml >> /​opt/​jetty/​start.d/​https.ini
 +</​code>​
 +
 +==== Dokončenie inštalácie Jetty ====
 +
 +Ak sme niekde omylom zle nastavili oprávnenia nastavíme ich znovu:
 +
 +<​code>​
 +chown idp:idp -R /opt/jetty
 +</​code>​
 +
 +Vytvoríme definíciu služby pre systemd:
 +
 +Jetty treba spušťať pod rootom a potom keď otvorí port 80 a 443 sa "​znížia"​ jeho oprávnenia na idp. Používateľ idp tie porty nevie otvoriť.
 +
 +<​code>​
 +vim /​etc/​systemd/​system/​jetty.service
 +</​code>​
 +
 +<​code>​
 +#
 +# 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 ​
 +</​code>​
 +
 +> TREBA TO ESTE OTESTOVAT (asi ten unitfile nefunguje)
 +
 +==== Firewall ====
 +
 +Povoliť HTTPS na firewalle:
 +
 +<​code>​
 +firewall-cmd --zone=public --permanent --add-service=https
 +firewall-cmd --reload
 +</​code>​
 +
 +Spustiť jetty:
 +
 +<​code>​
 +systemctl daemon-reload
 +systemctl enable jetty
 +systemctl start jetty
 +</​code>​
 +
 +Po spustení (chvíľu to trvá) by mala fungovať homepage po nasmerovaní browsera na ''​demoidp.sanet.sk''​.
 +
 +Zistenie stavu servera:
 +
 +<​code>​
 +/​opt/​jetty/​bin/​jetty.sh check
 +</​code>​
  • install-idp-jetty.txt
  • Posledná úprava: 2019/07/23 13:55
  • od jsilaci@umb.sk