Rozdiely

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

Odkaz na tento prehľad zmien

Nasledujúca revízia
Predchádzajúca revízia
install-idp [22. 07. 2019 22:15]
127.0.0.1 externá úprava
— (aktuálne)
Riadok 1: Riadok 1:
-====== Inštalácia Shibboleth ====== 
  
-IdP budeme inštalovať na Centos 7 podľa návodu uverejneného na  https://www.eduid.cz/cs/tech/idp (s príslušnými zmenami). 
- 
-<code> 
-yum install vim wget unzip ntp 
-</code> 
- 
-===== NTP ===== 
- 
-Kvôli správnej funkcionalite IdP je dôležité aby mal server nastavený presný čas. To zabezpečíme spustením služby ntpd. 
- 
-<code> 
-systemctl enable ntpd 
-systemctl start ntpd 
-</code> 
- 
-Po chvíli je možné vidieť zoznam serverov, s ktorými prebieha synchronizácia: 
- 
-<code> 
-ntpq -p 
-</code> 
- 
- 
-===== 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> 
- 
-===== Shibboleth IdP ===== 
- 
-Stiahneme a rozbalíme inľtalačný balíček: 
- 
-<code> 
-wget https://shibboleth.net/downloads/identity-provider/3.4.1/shibboleth-identity-provider-3.4.1.tar.gz 
-tar -xzf shibboleth-identity-provider-3.4.1.tar.gz 
-</code> 
- 
-Spustíme inštaláciu: 
- 
-<code> 
-./shibboleth-identity-provider-3.4.1/bin/install.sh 
-</code> 
- 
-Výstup: 
- 
-<code> 
-Source (Distribution) Directory (press <enter> to accept default): [/root/shibboleth-identity-provider-3.4.1] 
- 
-Installation Directory: [/opt/shibboleth-idp] 
- 
-Hostname: [demoidp.sanet.sk] 
- 
-SAML EntityID: [https://demoidp.sanet.sk/idp/shibboleth] 
- 
-Attribute Scope: [sanet.sk] 
- 
-Backchannel PKCS12 Password: <Heslo3> 
-Re-enter password: <Heslo3> 
-Cookie Encryption Key Password: <Heslo4> 
-Re-enter password: <Heslo4> 
-Warning: /opt/shibboleth-idp/bin does not exist. 
-Warning: /opt/shibboleth-idp/edit-webapp does not exist. 
-Warning: /opt/shibboleth-idp/dist does not exist. 
-Warning: /opt/shibboleth-idp/doc does not exist. 
-Warning: /opt/shibboleth-idp/system does not exist. 
-Generating Signing Key, CN = demoidp.sanet.sk URI = https://demoidp.sanet.sk/idp/shibboleth ... 
-...done 
-Creating Encryption Key, CN = demoidp.sanet.sk URI = https://demoidp.sanet.sk/idp/shibboleth ... 
-...done 
-Creating Backchannel keystore, CN = demoidp.sanet.sk URI = https://demoidp.sanet.sk/idp/shibboleth ... 
-...done 
-Creating cookie encryption key files... 
-...done 
-Rebuilding /opt/shibboleth-idp/war/idp.war ... 
-...done 
- 
-BUILD SUCCESSFUL 
-Total time: 3 minutes 8 seconds 
-</code> 
- 
-Presunieme inštalačný adresár do ''/opt'' (zatial neviem načo) a nastavíme opravnenia: 
- 
-<code> 
-mv shibboleth-identity-provider-3.4.1 /opt/ 
-chown -R idp:idp /opt/shibboleth-id* 
-</code> 
- 
-Reštartujeme Jetty, servlet by sa mal nahrať: 
- 
-<code> 
-systemctl restart jetty 
-</code> 
- 
-Stav IdP môžeme zobraziť príkazom: 
- 
-<code> 
-/opt/shibboleth-idp/bin/status.sh 
-</code> 
- 
-Funkčnost je možné overiť aj zobrazením stránky v prehliadači: https://demoidp.sanet.sk/idp 
- 
-===== Konfigurácia IdP ===== 
- 
-Prepnúť sa na používateľa idp: 
- 
-<code> 
-su - idp 
-</code> 
- 
-Aby Shibboleth poznal cestu k Jave aj pod neprivilegovaným učtom musíme ju špecifikovať: 
- 
-<code> 
-JAVA_HOME=/usr/java/latest /opt/shibboleth-idp/bin/reload-service.sh -id shibboleth.ReloadableAccessControlService 
-</code> 
- 
-==== conf/idp.properties ==== 
- 
-V konfigurácii idp nastavíme premennú ''idp.cookie.secure'' na true (odkomentovať a zmeniť na true): 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/idp.properties 
-</code> 
- 
-<code> 
-idp.cookie.secure = true 
-</code> 
- 
-a reštartujeme jetty (ako root) 
- 
-<code> 
-systemctl restart jetty 
-</code> 
- 
-==== conf/access-control.xml ==== 
- 
-Tu je možné obmedziť prístup k stránkam so špeciálnou funkcionalitou (pre adminov): 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/access-control.xml 
-</code> 
- 
-<code xml> 
- 
-<util:map id="shibboleth.AccessControlPolicies"> 
- 
-        <entry key="AccessByIPAddress"> 
-            <bean id="AccessByIPAddress" parent="shibboleth.IPRangeAccessControl" 
-                p:allowedRanges="#{ {'127.0.0.1/32', '194.160.39.60/32', '194.160.44.13/32'} }" /> 
-        </entry> 
-... 
-</code> 
- 
-Znovunačitame konfigurácie (pokiaľ robíme pod userom idp musíme stále zadávať JAVA_HOME): 
- 
-<code> 
-JAVA_HOME=/usr/java/latest /opt/shibboleth-idp/bin/reload-service.sh -id shibboleth.ReloadableAccessControlService 
-</code> 
- 
-Teraz by malo byť možné z vybraných IP zobraziť napríklad info o stave idp: https://demoidp.sanet.sk/idp/status 
- 
-==== conf/ldap.properties ==== 
- 
-Zaitaľ sa mi nepodarilo nakonfigurovať IdP tak aby mu stačilo spojenie s LDAP bez SSL. Možno je to bug: http://shibboleth.net/pipermail/users/2015-August/023536.html 
- 
-Pre použitie SSL treba stiahnuť ssl certifikat z LDAP servera: 
- 
-<code> 
-openssl s_client -showcerts -connect io.fpv.umb.sk:636 </dev/null 2>/dev/null|openssl x509 -outform PEM > /opt/shibboleth-idp/credentials/ldap-server.crt 
-</code> 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/ldap.properties 
-</code> 
- 
-<code> 
-idp.authn.LDAP.authenticator                   = bindSearchAuthenticator 
- 
-idp.authn.LDAP.ldapURL                         = ldaps://ldap.umb.sk:636 
-idp.authn.LDAP.useStartTLS                     = false 
-idp.authn.LDAP.useSSL                          = true 
- 
-idp.authn.LDAP.connectTimeout                  = PT3S 
-idp.authn.LDAP.responseTimeout                 = PT3S 
- 
-idp.authn.LDAP.sslConfig                       = certificateTrust 
-idp.authn.LDAP.trustCertificates               = %{idp.home}/credentials/ldap-server.crt 
- 
-idp.authn.LDAP.baseDN                          = ou=users,dc=ldap,dc=umb,dc=sk 
-idp.authn.LDAP.subtreeSearch                   = true 
-idp.authn.LDAP.userFilter                      = (uid={user}) 
-idp.authn.LDAP.bindDN                          = cn=demoidp,ou=system,ou=users,dc=ldap,dc=umb,dc=sk 
-idp.authn.LDAP.bindDNCredential                = ------- heslo pre ldap usera ------- 
- 
-idp.attribute.resolver.LDAP.ldapURL             = %{idp.authn.LDAP.ldapURL} 
-idp.attribute.resolver.LDAP.connectTimeout      = %{idp.authn.LDAP.connectTimeout:PT3S} 
-idp.attribute.resolver.LDAP.responseTimeout     = %{idp.authn.LDAP.responseTimeout:PT3S} 
-idp.attribute.resolver.LDAP.baseDN              = %{idp.authn.LDAP.baseDN:undefined} 
-idp.attribute.resolver.LDAP.bindDN              = %{idp.authn.LDAP.bindDN:undefined} 
-idp.attribute.resolver.LDAP.bindDNCredential    = %{idp.authn.LDAP.bindDNCredential:undefined} 
-idp.attribute.resolver.LDAP.useStartTLS         = %{idp.authn.LDAP.useStartTLS:true} 
-idp.attribute.resolver.LDAP.trustCertificates   = %{idp.authn.LDAP.trustCertificates:undefined} 
-idp.attribute.resolver.LDAP.searchFilter        = (uid=$resolutionContext.principal) 
-</code> 
- 
-==== conf/metadata-providers.xml ==== 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/metadata-providers.xml 
-</code> 
- 
-<code xml> 
-<?xml version="1.0" encoding="UTF-8"?> 
-<!-- This file is an EXAMPLE metadata configuration file. --> 
- 
-<MetadataProvider id="ShibbolethMetadata" xsi:type="ChainingMetadataProvider" 
-    xmlns="urn:mace:shibboleth:2.0:metadata" 
-    xmlns:resource="urn:mace:shibboleth:2.0:resource" 
-    xmlns:security="urn:mace:shibboleth:2.0:security" 
-    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" 
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-    xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd 
-                        urn:mace:shibboleth:2.0:resource http://shibboleth.net/schema/idp/shibboleth-resource.xsd 
-                        urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd 
-                        urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd"> 
-   
-    <!-- safeID --> 
-    <MetadataProvider 
-        id="safeid-metadata" 
-        xsi:type="FileBackedHTTPMetadataProvider" 
-        backingFile="%{idp.home}/metadata/safeid.xml" 
-        metadataURL="https://www.safeid.sk/metadata/metadata.safeid.sk.xml" 
-        maxRefreshDelay="PT2H"> 
-        <MetadataFilter xsi:type="SignatureValidation" requireSignedRoot="true" 
-            certificateFile="%{idp.home}/credentials/SAFEID_metadata_signer.pem" /> 
-    </MetadataProvider> 
-</MetadataProvider> 
-</code> 
- 
-Stiahnuť verejný kľúč pre kontrolu podpisu metadát: 
- 
-<code> 
-cd /opt/shibboleth-idp/credentials 
-wget https://www.safeid.sk/metadata/cert/SAFEID_metadata_signer.pem 
-</code> 
- 
-Reštart služby pre načítanie metadát: 
- 
-<code> 
-JAVA_HOME=/usr/java/latest /opt/shibboleth-idp/bin/reload-service.sh -id shibboleth.MetadataResolverService 
-</code> 
- 
-Kontrola, či sa metadata stiahli: 
- 
-<code> 
-ls -l /opt/shibboleth-idp/metadata/ 
-</code> 
- 
-Vo výpise by sa mal nachádzať súbor ''safeid.xml'' s aktuálnym časom vytvorenia. 
- 
-==== conf/attribute-resolver.xml ==== 
- 
-<code> 
-cd /opt/shibboleth-idp/conf 
-mv attribute-resolver-ldap.xml attribute-resolver.xml 
-</code> 
- 
-> TODO: Doplnit alebo nalinkovat obsah suboru attribute-resolver.xml 
- 
-==== conf/attribute-filter.xml ==== 
- 
-Tu definujeme, ktoré atribúty budeme uvolnovať a komu. 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/attribute-filter.xml 
-</code> 
- 
-> TODO: Doplnit alebo nalinkovat obsah suboru attribute-filter.xml 
- 
-==== metadata/idp-metadata.xml ==== 
- 
-Tu treba doplniť metadata. 
- 
-<code> 
-vim /opt/shibboleth-idp/metadata/idp-metadata.xml 
-</code> 
- 
-> TODO: Doplnit alebo nalinkovat obsah suboru idp-metadata.xml 
- 
-Po reštarte jetty budú metadata dostupné na adrese https://demoisp.sanet.sk/idp/shibboleth. Metadata je potrebné validovať vo validátore: https://mdr.safeid.sk/saml-validator/ 
- 
-===== Persistentný identifikátor / eduPersonTargetedID ===== 
- 
-Identifikátor sa generuje pre každý pár používateľ-služba a slúži na ochranu súkromia používatela (služba zároveň vie, že sa jedná o rovnakého používateľa). Kedže sa pre každú sluzbu generuje iný identifikátor a tento identifikátor je nahodny reťazec, nie je jednoducho možne pre prevádzkovateľa služby používateľa identifikovať ale zároven to umožäuje zo strany služby ukladať rôzne personalizované nastavenia atď. V tom je hlavný rozdiel oproti identifikátoru ''eduPersonPrinciaplName'', ktorý má spravidla hodnotu ''login@domena''. 
- 
-Podpora pre túto funkcionalitu nie je povinná, ale je doporučovaná. Podobný efekt je možné dosiahnuť používaním generovaného čísla namiesto loginu používateľa v ''eduPersonPrinciaplName''. Samorejme to stráca zmysel ak spolu s týmto identifikátorom posielame ďalšie údaje ako meno, mail atď. 
- 
-Navyše niektoré z konfigurašnych krokov, ktoré budú potrebné pre jeho spravádzkovanie bude potrebné aj tak urobiž kvôli ukladaniu súhlasov s poskytovaním atribútov. 
- 
-Pre ukladanie údajov je odporúčané použiť databázu MySQL (nie MariaDB). 
- 
-==== MySQL ==== 
- 
-Nainštalovať repozitár od Oracle - MySQL server: 
- 
-<code> 
-yum install https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm 
-yum update 
-yum install mysql-community-server 
-</code> 
- 
-Spustiť server: 
- 
-<code> 
-systemctl enable mysqld 
-systemctl startmysqld 
-</code> 
- 
-Po spustení server vygeneruje heslo pre roota, ktoré sa nachádza v logu: 
- 
-<code> 
-cat /var/log/mysqld.log | grep password 
-</code> 
- 
-Spustíme procedúru pre zabezpečenie databazy, v rámci ktorej zmeníme heslo pre roota (pozor, mysql8 má štandardne aktívne dosť prísne požiadavky na zložitosť hesla). 
- 
-Aby sa nám s DB ľahšie pracovalo môžeme uložiť prihlasovacie údaje do súboru ''.my.cnf'': 
- 
-<code> 
-vim /root/.my.cnf 
-</code> 
- 
-obsah súboru: 
- 
-<code> 
-[client] 
-user=root 
-password="4T............1I" 
-</code> 
- 
-Nastavíme oprávnenia pre súbor: 
- 
-<code> 
-chmod go-rwx .my.cnf 
-</code> 
- 
-Prihlásime sa do cmd clienta a spustíme SQL príkazy pre vytvorenie databázy a používateľa (nezabudneme na silné heslo): 
- 
-<code> 
-mysql 
-</code> 
- 
-<code sql> 
-SET NAMES 'utf8'; 
-SET CHARACTER SET utf8; 
-CHARSET utf8; 
-CREATE DATABASE IF NOT EXISTS shibboleth CHARACTER SET=utf8; 
-CREATE USER 'shibboleth'@'localhost' IDENTIFIED BY 'jeGYjU....hFf7S'; 
-GRANT ALL ON shibboleth.* TO 'shibboleth'@'localhost'; 
-FLUSH PRIVILEGES; 
-</code> 
- 
-Vytvoríme novú tabuľku v datábaze shibboleth: 
- 
-<code sql> 
-USE shibboleth; 
-CREATE TABLE IF NOT EXISTS `shibpid` ( 
-  `localEntity` VARCHAR(255) NOT NULL, 
-  `peerEntity` VARCHAR(255) NOT NULL, 
-  `principalName` VARCHAR(255) NOT NULL DEFAULT '', 
-  `localId` VARCHAR(255) NOT NULL, 
-  `persistentId` VARCHAR(50) NOT NULL, 
-  `peerProvidedId` VARCHAR(255) DEFAULT NULL, 
-  `creationDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
-  `deactivationDate` TIMESTAMP NULL DEFAULT NULL, 
-  PRIMARY KEY (localEntity, peerEntity, persistentId) 
-) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
-</code> 
- 
-Doinštalujeme knižnice do Jetty: 
- 
-http://tux.rainside.sk/apache//commons/dbcp/binaries/commons-dbcp2-2.5.0-bin.tar.gz 
-http://tux.rainside.sk/apache//commons/pool/binaries/commons-pool2-2.6.0-bin.tar.gz 
-https://search.maven.org/remotecontent?filepath=commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar 
-https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-8.0.13.tar.gz 
- 
-> TODO: Momentalne to bezi so starsimi kniznicami:  
-https://search.maven.org/remotecontent?filepath=org/apache/commons/commons-dbcp2/2.1.1/commons-dbcp2-2.1.1.jar 
-https://search.maven.org/remotecontent?filepath=org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2.jar 
- 
-Keďže MySQL je v aktuálnej verzii 8, driver musí byť tieť "najnovší" ''mysql-connector-java-8.0.13.tar.gz''. 
- 
-Archívy treba porozbaľovať a potom skopírovať súbory: 
- 
-<code> 
-cp commons-dbcp2-2.5.0/commons-dbcp2-2.5.0.jar /opt/jetty/lib/ext/ 
-cp commons-pool2-2.6.0/commons-pool2-2.6.0.jar /opt/jetty/lib/ext/ 
-cp commons-logging-api-1.1.jar /opt/jetty/lib/ext/ 
-cp mysql-connector-java-8.0.13/mysql-connector-java-8.0.13.jar /opt/jetty/lib/ext/ 
-</code> 
- 
-<code> 
-chown idp:idp /opt/jetty/lib/ext/* 
-</code> 
- 
-==== Konfigurácia IdP ==== 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/attribute-resolver.xml 
-</code> 
- 
-Doplniť nový atribút: 
- 
-<code xml> 
-<AttributeDefinition id="eduPersonTargetedID" xsi:type="SAML2NameID" nameIdFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"> 
-    <InputDataConnector ref="myStoredId" attributeNames="storedId"/> 
-    <AttributeEncoder xsi:type="SAML1XMLObject" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" encodeType="false"/> 
-    <AttributeEncoder xsi:type="SAML2XMLObject" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" friendlyName="eduPersonTargetedID" encodeType="false"/> 
-</AttributeDefinition> 
-</code> 
- 
- 
-A nový data konektor: 
- 
-<code xml> 
-<DataConnector id="myStoredId" 
-    xsi:type="StoredId" 
-    sourceAttributeID="uid" 
-    generatedAttributeID="storedId" 
-    salt="<Zadat vygenerovany SALT>" 
-    queryTimeout="0"> 
-    <InputAttributeDefinition ref="uid"/> 
-    <BeanManagedConnection>shibboleth.MySQLDataSource</BeanManagedConnection> 
-</DataConnector> 
-</code> 
- 
-Konfiguračný súbor uložíme. 
- 
-Vygenerujeme salt pomocou príkazu: 
- 
-<code> 
-openssl rand -base64 36 2>/dev/null 
-</code> 
- 
-Vystup vyzerá napríklad takto: 
- 
-<code> 
-LdudV6JOJDzQOaF/4a75mApxsIFf7LVbjdgG3ME3hh7saPJw 
-</code> 
- 
-Dodefinujeme potrebné beany v ''global.xml'' 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/global.xml 
-</code> 
- 
-<code xml> 
-<bean id="shibboleth.MySQLDataSource" 
-    class="org.apache.commons.dbcp2.BasicDataSource" 
-    p:driverClassName="com.mysql.jdbc.Driver" 
-    p:url="jdbc:mysql://localhost:3306/shibboleth" 
-    p:username="shibboleth" 
-    p:password="<heslo pre MySQL pouzivatela shibboleth>" /> 
-  
-<bean id="shibboleth.JPAStorageService" 
-    class="org.opensaml.storage.impl.JPAStorageService" 
-    p:cleanupInterval="%{idp.storage.cleanupInterval:PT10M}" 
-    c:factory-ref="shibboleth.JPAStorageService.entityManagerFactory" /> 
-  
-<bean id="shibboleth.JPAStorageService.entityManagerFactory" 
-    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
-    <property name="packagesToScan" value="org.opensaml.storage.impl"/> 
-    <property name="dataSource" ref="shibboleth.MySQLDataSource"/> 
-    <property name="jpaVendorAdapter" ref="shibboleth.JPAStorageService.JPAVendorAdapter"/> 
-    <property name="jpaDialect"> 
-        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
-    </property> 
-</bean> 
-  
-<bean id="shibboleth.JPAStorageService.JPAVendorAdapter" 
-    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
-    p:generateDdl="true" 
-    p:database="MYSQL" 
-    p:databasePlatform="org.hibernate.dialect.MySQL5Dialect" /> 
-</code> 
- 
-Nový atribút zaradíme aj do konfigurácie filtrov ''attribute-filter.xml''. Keďže sa jedná o anonymný atribút, môžeme ho sprístupnovať všetkým. 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/attribute-filter.xml 
-</code> 
- 
-<code xml> 
-<AttributeRule attributeID="eduPersonTargetedID"> 
-  <PermitValueRule xsi:type="ANY" /> 
-</AttributeRule> 
-</code> 
- 
-Upravíme súbor ''saml-nameid.properties'': 
- 
-<code> 
-vi /opt/shibboleth-idp/conf/saml-nameid.properties 
-</code> 
- 
-Doplníme potrebné atribúty (odkazy na beany a salt): 
- 
-<code> 
-idp.persistentId.generator = shibboleth.StoredPersistentIdGenerator 
-idp.persistentId.dataSource = shibboleth.MySQLDataSource 
-idp.persistentId.sourceAttribute = uid 
-idp.persistentId.salt = LdudV6JOJDzQOaF/4a75mApxsIFf7LVbjdgG3ME3hh7saPJw 
-</code> 
- 
-Ďalej upravíme konfiguráciu v ''saml-nameid.xml'' 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/saml-nameid.xml 
-</code> 
- 
-V sôbore odkomentujeme tento riadok: 
- 
-<code xml> 
-<ref bean="shibboleth.SAML2PersistentGenerator" /> 
-</code> 
- 
-Ďalej upravíme súbor: 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/idp.properties 
-</code> 
- 
-V súbore doplníme riadok: 
- 
-<code> 
-idp.consent.StorageService = shibboleth.JPAStorageService 
-</code> 
- 
-Ešte ostáva upraviť súbor ''subject-c14n.xml'': 
- 
-<code> 
-vim /opt/shibboleth-idp/conf/c14n/subject-c14n.xml 
-</code> 
- 
-V súbore odkomentujeme riadok: 
- 
-<code xml> 
-<ref bean="c14n/SAML2Persistent" /> 
-</code> 
- 
-V metadatach budeme oznamovaž, že IdP podporuje persistentný identifikátor: 
- 
-<code> 
-vim /opt/shibboleth-idp/metadata/idp-metadata.xml 
-</code> 
- 
-Do elementu ''IDPSSODescriptor'' pridáme element (napríklad za element <ArtifactResolutionService ...>): 
- 
-<code xml> 
-<NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat> 
-</code> 
- 
-Vygenerujeme nový WAR súbor a reľtartujeme Jetty: 
- 
-<code> 
-/opt/shibboleth-idp/bin/build.sh 
- 
-systemctl restart jetty 
-</code> 
- 
-===== Úprava prihlasovacej stránky ===== 
- 
-> TODO 
  • install-idp.1563826555
  • Posledná úprava: 12. 10. 2020 15:24