===== 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): yum install jdk-8u192-linux-x64.rpm Kontrola, či je Java nainštalovaná správne: update-alternatives --display java alebo java -version Ak sme inštalovali Javu z RPM od Oracle, JAVA_HOME treba nastaviť na adresár: /usr/java/latest Pridáme export JAVA_HOME do ''~/.bashrc'' a ''~/.bash_profile'' JAVA_HOME=/usr/java/latest export JAVA_HOME ===== 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: unzip -x jce_policy-8.zip Rozbalené súbory skopírujeme na príslušné miesto do JAVA_HOME: cp UnlimitedJCEPolicyJDK8/*.jar /usr/java/jdk1.8.0_192-amd64/jre/lib/security/ ===== 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ť: groupadd idp useradd -m -g idp -s /bin/bash idp 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'': 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 Zmeníme vlastníka adresára: chown -R idp:idp /opt/jetty Vytvoríme konfiguračný súbor v ''/etc'' vim /etc/default/jetty s obsahom: JETTY_HOME=/opt/jetty JETTY_BASE=/opt/jetty ===== Konfigurácia Jetty ===== Prepneme sa do používateľa idp a nakonfigurujeme Jetty pre potreby IdP: 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 Upravíme konfiguračný súbor ''http.ini''. vim /opt/jetty/start.d/http.ini HTTP len pre localhost na porte 80: --module=http jetty.http.host=localhost jetty.http.port=80 HTTPS bude počúvať na štandartnom porte 443: vim /opt/jetty/start.d/ssl.ini jetty.ssl.port=443 Kvôli spúšťaniu jetty pod neprivilegovaným používateľom na privilegovanom porte: vim /opt/jetty/start.d/setuid.ini # --------------------------------------- # Module: setuid --module=setuid ## SetUID Configuration jetty.setuid.startServerAsPrivileged=false jetty.setuid.userName=idp jetty.setuid.groupName=idp jetty.setuid.umask=002 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). mkdir -p /opt/jetty/webapps/root vim /opt/jetty/webapps/root/index.html Pripravíme server pre aplikáciu Shebboleth IdP: mkdir /opt/jetty/tmp Vytvoríme konfiguračný súbor aplikácie: vim /opt/jetty/webapps/idp.xml s obsahom: /opt/shibboleth-idp/war/idp.war /idp false false true /opt/jetty/tmp ==== Ďalšie nastavenia a zabezpečenie ==== vim /opt/jetty/start.d/server.ini Nebude sa zobrazovať verzia servera: jetty.httpConfig.sendServerVersion=false Content-Security-Policy by sme si mali upraviť podľa našich potrieb ale zatiaľ to necháme tak. vim /opt/jetty/etc/jetty-rewrite.xml REQUEST ASYNC * Strict-Transport-Security max-age=15768000 * X-Content-Type-Options nosniff * X-Xss-Protection 1; mode=block * X-Frame-Options DENY * Content-Security-Policy-Report-Only 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' * Referrer-Policy no-referrer-when-downgrade ==== SSL ==== Certifikát budem generovať ako root (exit). Pripravime si SSL certifikát, ktorý budeme potrebovať ďalej. Vygenerovanie novej žiadosti o cerifikát: cd /root/ssl_cert openssl req -new -newkey rsa:2048 -nodes -keyout demoidpkey -out demoidp.csr 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: cat demoidp.crt DigiCertCA.crt > jetty-cert.txt 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''): openssl pkcs12 -export -inkey demoidp.key -in jetty-cert.txt -out jetty-cert.pkcs12 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''). $JAVA_HOME/bin/keytool -importkeystore -srckeystore jetty-cert.pkcs12 -srcstoretype PKCS12 -destkeystore keystore Keystore presunieme do ''/etc'' a zmeníme mu oprávnenia: mv keystore /opt/jetty/etc chown idp:idp /opt/jetty/etc/keystore Pomocou ''jetty-util'' vygenerujeme obsfukované verzie hesiel ''Heslo1'' a ''Heslo2'': java -cp /opt/jetty/lib/jetty-util-9.3.25.v20180904.jar org.eclipse.jetty.util.security.Password Výstupom príkazu bude niečo ako: 2018-12-06 12:28:09.771:INFO::main: Logging initialized @97ms sKbH...Q5r9Q OBF:1rxd1f9t1...1l5b1pbe1dv01v2n1f8t1rvh MD5:b31221...a3b41cbac61f Podobne treba obsfukovať aj Heslo1 java -cp /opt/jetty/lib/jetty-util-9.3.25.v20180904.jar org.eclipse.jetty.util.security.Password Výstupom príkazu bude niečo ako: 2018-12-06 12:30:12.968:INFO::main: Logging initialized @98ms YAbK...3tRm OBF:1sa31i7i1vfx...61jlf1e1z1vgx1i8g1sb7 MD5:34cdf9c2...904d366401d6 Obsfukované heslá zadáme do súboru ''start.d/ssl.ini'': vim /opt/jetty/start.d/ssl.ini Heslá pre ''keyStorePassword'' a ''trustStorePassword'' su rovnaké: jetty.sslContext.keyStorePassword=OBF:1rxd1f9t1v1r...1f8t1rvh #Heslo2 jetty.sslContext.keyManagerPassword=OBF:1sa31i7i1vfx1...1i8g1sb7 #Heslo1 jetty.sslContext.trustStorePassword=OBF:1rxd1f9t1v1r...1v2n1f8t1rvh #Heslo2 Zakážeme málo bezpečné šifry: Vytvoríme súbor ''/opt/jetty/etc/tweak-ssl.xml'' vim /opt/jetty/etc/tweak-ssl.xml Obsah súboru: .*DES.* .*DSS.* .*MD5.* .*NULL.* .*RC4.* .*_RSA_.*MD5$ .*_RSA_.*SHA$ .*_RSA_.*SHA1$ TLS_DHE_RSA_WITH_AES_128.* TLS_DHE_RSA_WITH_AES_256.* SSL SSLv2 SSLv2Hello SSLv3 TLS_DHE_RSA.* TLS_ECDHE.* Pridáme obsah súboru do konfigurácie https: echo /opt/jetty/etc/tweak-ssl.xml >> /opt/jetty/start.d/https.ini ==== Dokončenie inštalácie Jetty ==== Ak sme niekde omylom zle nastavili oprávnenia nastavíme ich znovu: chown idp:idp -R /opt/jetty 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ť. vim /etc/systemd/system/jetty.service # # 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 > TREBA TO ESTE OTESTOVAT (asi ten unitfile nefunguje) ==== Firewall ==== Povoliť HTTPS na firewalle: firewall-cmd --zone=public --permanent --add-service=https firewall-cmd --reload Spustiť jetty: systemctl daemon-reload systemctl enable jetty systemctl start jetty Po spustení (chvíľu to trvá) by mala fungovať homepage po nasmerovaní browsera na ''demoidp.sanet.sk''. Zistenie stavu servera: /opt/jetty/bin/jetty.sh check