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 [23. 07. 2019 15:55]
jsilaci@umb.sk vytvorené
— (aktuálne)
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>