====== Shibboleth Identity Provider 5 ====== **Na této stránce se nachází návod, jak do linuxové distribuce Debian nainstalovat Shibboleth IdP. Před instalací musíme zprovoznit [[mariadb]].** V případě potíží nebo nejasností se neváhejte obrátit na [[info@eduid.cz]]. ---- ====== Instalace ====== Instalace je rozdělena do třech kroků. Nejprve nainstalujeme Javu, následně Shibboleth IdP a poté Jetty formou rozšíření (plug-inu) v Shibbolethu samotném. ===== Java ===== Potřebujeme nainstalovat Javu a nastavit proměnnou //JAVA_HOME// pro současnou i budoucí relace: # Instalace Javy apt install default-jre # Nastavení proměnné JAVA_HOME eval $(echo "export JAVA_HOME=/usr" | tee -a /root/.bashrc) ===== Shibboleth IdP ===== Zdrojové kódy stáhneme ručně [[https://shibboleth.net/downloads/identity-provider/archive/5.1.6/|ze stránky projektu]] a nahrajeme na server do adresáře ''/opt'' anebo použijeme program //wget// následujícím způsobem. __Následně nezapomeneme ověřit SHA256 otisk a GPG podpis!__ # Stažení zdrojového kódu Shibboleth IdP wget -P /opt \ https://shibboleth.net/downloads/identity-provider/archive/5.1.6/shibboleth-identity-provider-5.1.6.tar.gz \ https://shibboleth.net/downloads/identity-provider/archive/5.1.6/shibboleth-identity-provider-5.1.6.tar.gz.asc \ https://shibboleth.net/downloads/identity-provider/archive/5.1.6/shibboleth-identity-provider-5.1.6.tar.gz.sha256 # Přepnutí do adresáře /opt cd /opt # Kontrola SHA256 otisku sha256sum -c shibboleth-identity-provider-5.1.6.tar.gz.sha256 # Kontrola GPG podpisu gpg --verify shibboleth-identity-provider-5.1.6.tar.gz.asc Nyní přistoupíme k samotné instalaci. # Instalace Shibboleth IdP tar -xzf shibboleth-identity-provider-5.1.6.tar.gz cd shibboleth-identity-provider-5.1.6/ ./bin/install.sh Po spuštění instalačního skriptu: - potvrdíme cílový instalační adresář, - vyplníme hostname serveru (pokud není vyplněn správně), - potvrdíme entityID, - zadáme scope organizace (pokud není vyplněn správně). Zde je vyobrazen průběh instalačního skriptu ''install.sh''. Installation Directory: [/opt/shibboleth-idp] ? INFO - New Install. Version: 5.1.6 Host Name: [idp.example.org] ? INFO - Creating idp-signing, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 INFO - Creating idp-encryption, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 INFO - Creating backchannel keystore, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 INFO - Creating Sealer KeyStore INFO - No existing versioning property, initializing... SAML EntityID: [https://idp.example.org/idp/shibboleth] ? Attribute Scope: [example.org] ? INFO - Initializing OpenSAML using the Java Services API INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2001/04/xmlenc#ripemd160 INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2001/04/xmldsig-more#hmac-ripemd160 INFO - Algorithm failed runtime support check, will not be usable: http://www.w3.org/2001/04/xmldsig-more#rsa-ripemd160 INFO - Including auto-located properties in /opt/shibboleth-idp/conf/admin/admin.properties INFO - Including auto-located properties in /opt/shibboleth-idp/conf/saml-nameid.properties INFO - Including auto-located properties in /opt/shibboleth-idp/conf/ldap.properties INFO - Including auto-located properties in /opt/shibboleth-idp/conf/authn/authn.properties INFO - Including auto-located properties in /opt/shibboleth-idp/conf/c14n/subject-c14n.properties INFO - Including auto-located properties in /opt/shibboleth-idp/conf/services.properties INFO - Creating Metadata to /opt/shibboleth-idp/metadata/idp-metadata.xml INFO - Rebuilding /opt/shibboleth-idp/war/idp.war, Version 5.1.6 INFO - Initial populate from /opt/shibboleth-idp/dist/webapp to /opt/shibboleth-idp/webpapp.tmp INFO - Overlay from /opt/shibboleth-idp/edit-webapp to /opt/shibboleth-idp/webpapp.tmp INFO - Creating war file /opt/shibboleth-idp/war/idp.war ===== Jetty ===== Vývojáři z Konsorcia Shibboleth zjednodušili provoz Shibbolethu, pokud se rozhodnete používat jimi doporučený webový server Jetty. Nyní se Jetty instaluje pomocí skriptů dodaných Shibbolehtem. # Přepnutí do adresáře /opt/shibboleth-idp cd /opt/shibboleth-idp # Instalace pluginu Jetty ./bin/plugin.sh -I net.shibboleth.idp.plugin.jetty # Stažení Jetty verze 12.1.6 ./bin/downloadjetty.sh 12.1.6 # Použití Jetty verze 12.1.6 ./bin/setjettyversion.sh 12.1.6 # Nastavení Jetty na major verzi 12 (pro konfiguraci) ./bin/setjettybase.sh 12 Tím je instalace hotová a přesuneme se ke konfiguraci. ====== Konfigurace ====== Konfigurace může být dost různorodá a vše závisí na tom, zda-li chceme IdP používat pouze pro přístup ke službám federace anebo ho chceme používat i pro přístup k našim interním službám. **Konfigurace uvedená v tomto návodu slouží jako naprostý základ, na kterém lze do budoucna stavět. Není možné sepsat specifičtější návod, protože Shibboleth IdP je velmi komplexní software s nepředstavitelnou škálou možností.** Nejprve nakonfigurujeme Jetty. Následně budeme konfigurovat Shibboleth IdP. ===== Jetty ===== Jetty je nově výrazně jednodušší na konfiguraci a to díky možnosti použít rozšíření pro Shibboleth IdP. Celé je to navržené tak, že následující aktualizace budou výrazně jednodušší než doposud. ==== Neprivilegovaný uživatel ==== Pro běh Jetty budeme využívat neprivilegovaného uživatele ''jetty''. # Vytvoření neprivilegovaného uživatele "jetty" useradd -s /bin/false -d /opt/shibboleth-idp/ jetty ==== Keystore ==== Keystore je úložiště pro TLS certifikát používaný pro šifrování webové komunikace pomocí protokolu HTTPS. Zde se předpokládá, že ''cert.pem'' obsahuje TLS certifikát, ''key.pem'' obsahuje privátní klíč a ''chain.pem'' obsahuje certifikát mezilehlé certifikační autority bez certifikátu kořenového. Po zavolání příkazu ''openssl pkcs12 ...'' budete vyzváni k opakovanému zadání hesla, které si zapamatujte, protože ho budete potřebovat následně doplnit do konfiguračního souboru ''shibboleth.ini''. # Smažeme vygenerovaný self-sign idp-userfacing.crt (a idp-userfacing.p12) rm /opt/shibboleth-idp/credentials/idp-userfacing.{crt,p12} # Spojení koncového a mezilehlého certifikátu cat cert.pem chain.pem > jetty.txt # Převod certifikátu do formátu PKCS#12 openssl pkcs12 \ -export \ -inkey key.pem \ -in jetty.txt \ -out /opt/shibboleth-idp/credentials/idp-userfacing.p12 # Nastavení práv ke keystoru chown jetty /opt/shibboleth-idp/credentials/idp-userfacing.p12 chmod 600 /opt/shibboleth-idp/credentials/idp-userfacing.p12 ==== shibboleth.ini ==== Konfigurační soubor ''/opt/shibboleth-idp/jetty-base/start.d/shibboleth.ini'' je víceméně připravený, stačí v něm provést několik změn: - ''jetty.ssl.host=0.0.0.0'' z původní hodnoty ''127.0.0.1'', - ''jetty.ssl.port=443'' z původní hodnoty ''8443'', - ''jetty.http.port=80'' z původní hodnoty ''8080'', - ''jetty.sslContext.keyStorePassword='' heslo z předchozího kroku, když jste generovali keystore, - ''jetty.sslContext.trustStorePassword='' heslo z předchozího kroku, když jste generovali keystore, - ''jetty.sslContext.keyManagerPassword='' heslo z předchozího kroku, když jste generovali keystore, - ''jetty.httpConfig.sendServerVersion=false'' tento řádek ve výchozí konfiguraci chybí, - ''etc/tweak-ssl.xml'' tento řádek ve výchozí konfiguraci chybí. # Setup common for running an IdP or a Hub (for SP4) # Enable our "comprehensive" module --module=shibboleth # Route access logging through standard SLF4J logging API etc/jetty-requestlog.xml # Do not expose contexts to web. jetty.server.default.showContexts=false ################################## ## Network/Host/Port configuration ################################## ## TLS host and port to bind to jetty.ssl.host=0.0.0.0 jetty.ssl.port=443 # Non-TLS host and port to bind to jetty.http.host=127.0.0.1 jetty.http.port=80 ###################################### ## Keystore properties for TLS support ###################################### # Keystore file path (relative to $jetty.base) jetty.sslContext.keyStorePath=../credentials/idp-userfacing.p12 jetty.sslContext.trustStorePath=../credentials/idp-userfacing.p12 # Keystore type #jetty.sslContext.keyStoreType=PKCS12 #jetty.sslContext.trustStoreType=PKCS12 # Keystore passwords jetty.sslContext.keyStorePassword=changeit jetty.sslContext.trustStorePassword=changeit jetty.sslContext.keyManagerPassword=changeit # Deny SSL renegotiation jetty.sslContext.renegotiationAllowed=false # Skip SNI hostcheck jetty.ssl.sniHostCheck=false # Suppress node name in JSESSIONID values # This assumes a non-clustered Jetty deploy jetty.sessionIdManager.workerName= jetty.httpConfig.sendServerVersion=false etc/tweak-ssl.xml Předpřipravený soubor ''shibboleth.ini'' pro Jetty můžete stáhnout od nás. # Stažení připraveného souboru shibboleth.ini wget -O /opt/shibboleth-idp/jetty-base/start.d/shibboleth.ini \ 'https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=7' ==== shibboleth.mod ==== Do souboru ''/opt/shibboleth-idp/jetty-base/modules/shibboleth.mod'' přidáme podporu pro HTTP2 a modul rewrite starající se o posílání dodatečných hlaviček definovaných v ''jetty-rewrite-rules.xml'' níže. [description] Configure Jetty for use as a Shibboleth IdP and/or SP Hub container. [tags] shibboleth [depend] ee11-annotations ee11-deploy ee11-jsp ee11-jstl ee11-plus ee11-servlets ee11-webapp resources server ext http https ssl rewrite http2 [files] tmp/ Hotový soubor ''shibboleth.mod'' můžete stáhnout od nás. # Stažení připraveného souboru shibboleth.mod wget -O /opt/shibboleth-idp/jetty-base/modules/shibboleth.mod \ https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=9 ==== tweak-ssl.xml ==== Konfiguračním souborem ''/opt/shibboleth-idp/jetty-base/etc/tweak-ssl.xml'' nastavíme moderní šifrování pro Jetty. .*DES.* .*DSS.* .*MD5.* .*NULL.* .*RC4.* .*_RSA_.*MD5$ .*_RSA_.*SHA$ .*_RSA_.*SHA1$ TLS_DHE_RSA_WITH_AES_128.* TLS_DHE_RSA_WITH_AES_256.* TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 SSL SSLv2 SSLv2Hello SSLv3 TLSv1.3 TLSv1.2 TLS_AES_128_GCM_SHA256 TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_ECDHE.* Soubor ''tweak-ssl.xml'' pro jednoduchost stáhněte od nás. # Stažení připraveného souboru tweak-ssl.xml wget -O /opt/shibboleth-idp/jetty-base/etc/tweak-ssl.xml \ 'https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=11' ==== jetty-rewrite-rules.xml ==== V souboru ''/opt/shibboleth-idp/jetty-base/etc/jetty-rewrite-rules.xml'' nastavíme bezpečnostní hlavičky jako HSTS a další. * Strict-Transport-Security Max-Age=15768000 * X-Content-Type-Options nosniff * X-Xss-Protection 1; mode=block * X-Frame-Options DENY * Content-Security-Policy default-src 'self'; style-src 'self'; script-src 'self' 'unsafe-inline'; img-src 'self'; font-src; frame-ancestors 'none' * Referrer-Policy no-referrer-when-downgrade Soubor ''jetty-rewrite-rules.xml'' je k dispozici u nás. # Stažení připraveného souboru jetty-rewrite-rules.xml wget -O /opt/shibboleth-idp/jetty-base/etc/jetty-rewrite-rules.xml \ https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=13 ==== index.jsp ==== Vytvoříme adresář ''/opt/shibboleth-idp/jetty-base/webapps/root/'' a v něm soubor ''index.jsp'' s přesměrováním na hlavní stránku naší organizace. # Vytvoříme adresář webapps/root/ mkdir -p /opt/shibboleth-idp/jetty-base/webapps/root/ # Vytvořime soubor index.jsp echo '<% response.sendRedirect("https://www.example.org/"); %>' \ > /opt/shibboleth-idp/jetty-base/webapps/root/index.jsp ==== mariadb-java-client.jar ==== V Jetty musíme vytvořit symbolický odkaz na knihovnu pro komunikaci s databází MariaDB. # Vytvoření adresáře pro externí knihovny mkdir /opt/shibboleth-idp/jetty-base/lib/ext # Vytvoření symbolického odkazu na knihovnu pro databázi MariaDB ln -s /usr/share/java/mariadb-java-client.jar \ /opt/shibboleth-idp/jetty-base/lib/ext/ ==== jetty.service ==== Součástí rozšíření IdP pro Jetty je i soubor ''/opt/shibboleth-idp/jetty-base/jetty.service'' pro systemd, který je nutné drobně upravit. Musíme změnit skupinu na ''jetty'' a přidat sekci ''[Install]''. [Unit] Documentation=https://www.eclipse.org/jetty/documentation/ Description=Jetty Server After=network-online.target Wants=network-online.target [Service] Type=forking # Set to your chosen values. User=jetty Group=jetty # Allow binding to port 80/443. AmbientCapabilities=CAP_NET_BIND_SERVICE Restart=no TimeoutSec=45 KillMode=process WorkingDirectory=/opt/shibboleth-idp/jetty-base ExecStart=/opt/shibboleth-idp/bin/runjetty.sh start ExecStop=/bin/kill ${MAINPID} SuccessExitStatus=130 143 [Install] WantedBy=multi-user.target Případně můžete soubor ''jetty.service'' stáhnout následujícím příkazem. # Stažení jetty.service wget -O /opt/shibboleth-idp/jetty-base/jetty.service \ 'https://www.eduid.cz/_export/code/cs/tech/idp/5/shibboleth-new?codeblock=17' Nyní je nutné vytvořit symbolický odkaz do systemd. # Vytvoření symbolického odkazu do systemd ln -s /opt/shibboleth-idp/jetty-base/jetty.service \ /etc/systemd/system/ ==== Práva ==== Nyní vytvoříme pracovní adresář a nastavíme odpovídající práva. # Vytvoření pracovního adresáře pro Jetty mkdir /opt/shibboleth-idp/jetty-dist/jetty-tmp # Nastavení práv k pracovnímu adresáři pro Jetty chown jetty /opt/shibboleth-idp/jetty-dist/jetty-tmp # Nastavení práv k runjetty.sh chown jetty /opt/shibboleth-idp/bin/runjetty.sh # Nastavení práv k adresáři s logy chown jetty /opt/shibboleth-idp/logs/ ==== Spuštění ==== Nyní můžeme spustit Jetty. # Znovunačtení systemd konfigurace systemctl daemon-reload # Spouštět Jetty po startu operačního systému systemctl enable jetty # Spuštění Jetty systemctl start jetty Přesvědčíme se, že vše funguje: # Kontrola síťových spojení ss -tlpn | fgrep java Měli bychom vidět, že port ''80'' poslouchá pouze na adrese ''127.0.0.1'' a port ''443'' na všech adresách: # Kontrola síťových spojení LISTEN 0 50 [::ffff:127.0.0.1]:80 *:* users:(("java",pid=15630,fd=61)) LISTEN 0 50 *:443 *:* users:(("java",pid=15630,fd=55)) ===== Shibboleth IdP ===== Máme-li hotovou konfiguraci Jetty, můžeme přistoupit ke konfiguraci samotného IdP. ==== idp.properties ==== V souboru ''/opt/shibboleth-idp/conf/idp.properties'' nastavíme podporu pro tzv. //consent//, což je ukládání souhlasů s vydáváním uživatelských informací (atributů) do databáze. Dále zde máme možnost ovlivnit, zda se budou používat cookies anebo lokální úložiště HTML ("HTML Local Storage"). A v neposlední řadě zde můžeme ovlivnit výchozí šifrovací algoritmus pro šifrování XML. **Povolení lokálního HTML úložiště s sebou nese dopad na vzhled během přihlašování (probliknutí stránky) a vyžaduje v prohlížeči zapnutý JavaScript!** Chcete-li zachovat chování jako v předchozích verzích IdP, musíte volbu //idp.storage.htmlLocalStorage// nastavit na hodnotu //false//. Bližší informace naleznete v oficiální [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199509576/StorageConfiguration#StorageConfiguration-ClientStorageService|dokumentaci]]. Od Shibboleth IdP 4.0.0 se jako výchozí šifrovací algoritmus pro šifrování XML používá [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199501202/GCMEncryption|AES-GCM]]. Starší verze IdP používaly AES-CBC. Nový algoritmus AES-GCM podporují aktuální operační systémy, na kterých je provozována aktuální verze Shibboleth SP anebo SimpleSAMLphp 1.19.0+. Nicméně ostatní implementace SAML protokolu tento protokol nepodporují a nebudou tedy fungovat. Existuje více způsobů, jak k tomuto problému přistoupit v závislosti na potřebách konkrétního IdP. Ten nejvhodnější je samozřejmě tlačit na ostatní služby (a jimi používané implementace), aby podporu pro nový algoritmus zařadili. Nejjednodušší způsob je zakomentovat volbu //idp.encryption.config//, ale **správné řešení naleznete v [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199501202/GCMEncryption|dokumentaci]] po jejím přečtení a pochopení**. # Otevřeme konfigurační soubor idp.properties vim /opt/shibboleth-idp/conf/idp.properties Nastavíme ''idp.consent.StorageService'' na hodnotu ''shibboleth.JPAStorageService'' a případně i ''idp.storage.htmlLocalStorage'' na ''false''. V případě, že potřebujeme, aby IdP komunikovalo i se službami nepodporující šifrovací algoritmus AES-GCM, můžeme **po přečtení a pochopení [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199501202/GCMEncryption|dokumentace]]** zakomentovat ''idp.encryption.config'', **pokud opravdu chceme vypnout a zakázat nový způsob bezpečného šifrování**: idp.consent.StorageService = shibboleth.JPAStorageService idp.storage.htmlLocalStorage = false #idp.encryption.config=shibboleth.EncryptionConfiguration.GCM ==== ldap.properties ==== V souboru ''/opt/shibboleth-idp/conf/ldap.properties'' nastavíme konektor do LDAP serveru, pomocí něhož budeme získávat uživatelské atributy. # Otevřeme konfigurační soubor ldap.properties vim /opt/shibboleth-idp/conf/ldap.properties Důležité jsou především následující volby: idp.authn.LDAP.authenticator = bindSearchAuthenticator idp.authn.LDAP.ldapURL = ldaps://ldap.example.org:636 idp.authn.LDAP.useStartTLS = false idp.authn.LDAP.sslConfig = certificateTrust idp.authn.LDAP.trustCertificates = %{idp.home}/credentials/ldap-server.crt idp.authn.LDAP.baseDN = ou=people,dc=example,dc=org idp.authn.LDAP.subtreeSearch = true idp.authn.LDAP.bindDN = uid=shibboleth,ou=users,dc=example,dc=org První konfigurační parametr ''idp.authn.LDAP.authenticator'' určuje, jak se bude přistupovat k LDAP serveru. Výchozí (zakomentovaná) hodnota je //anonSearchAuthenticator//, takže se k LDAPu přistupuje anonymně. My však chceme, aby se dotazování LDAP serveru provádělo až po přihlášení, je potřeba nastavit volbu na hodnotu //bindSearchAuthenticator//. Volba ''idp.authn.LDAP.ldapURL'' určuje, ke kterému LDAP serveru se bude Shibboleth připojovat. Ve výše uvedeném příkladu se připojuje pomocí zabezpečeného SSL (ldaps://) na stadardním portu ''636''. **V ldapURL nesmíme uvést koncové lomítko, např. ''[[ldaps://ldap.example.org:636/]]'', jinak nebude Shibboleth fungovat a v logu najdeme ''java.lang.NumberFormatException: For input string: "636/"''.** Konfigurační volba ''idp.authn.LDAP.useStartTLS'' určuje, jestli budeme používat StartTLS. Následující volba ''idp.authn.LDAP.trustCertificates'' udává cestu ke kořenovému certifikátu CA, která vydala SSL certifikát pro LDAP server ''ldap.example.org''. **Je nutné nezapomenout nakopírovat soubor ''ldap-server.crt'' na odpovídající místo!** Volba ''idp.authn.LDAP.baseDN'' určuje tzv. "base DN" v LDAPu. Volby ''idp.authn.LDAP.bindDN'' určuje uživatelské jméno, které se použije při přístupu k LDAP serveru pro získání uživatelských atributů. ==== secrets.properties ==== V souboru ''/opt/shibboleth-idp/credentials/secrets.properties'', který nově existuje v Shibboleth IdP od verze 4.0.0, nastavíme heslo k LDAP serveru a sůl pro //persistentní NameID identifikátor// / atribut //eduPersonTargetedID//, kterou si vygenerujeme. # Vygenerování soli openssl rand -base64 36 # Otevřeme konfigurační soubor secrets.properties vim /opt/shibboleth-idp/credentials/secrets.properties Volba ''idp.authn.LDAP.bindDNCredential'' obsahuje heslo, které se použije při přístupu k LDAPu. Heslo je pro uživatelský účet definovaný v ''idp.authn.LDAP.bindDN'' v ''/opt/shibboleth-idp/conf/ldap.properties'' souboru. Volba ''idp.persistentId.salt'' definuje sůl pro persistentní NameID identifikátor, kterou jsme si právě vygenerovali. Nikdy neměňte hodnotu v ''idp.persistentId.salt'', pokud již máte v současné produkční verzi IdP nějakou sůl vygenerovanou. idp.authn.LDAP.bindDNCredential = ___HESLO_PRO_BIND_K_LDAP_SERVERU___ idp.persistentId.salt = ___SŮL_PRO_GENEROVÁNÍ_IDENTIFIKÁTORŮ___ ==== metadata-providers.xml ==== V konfiguračním souboru ''/opt/shibboleth-idp/conf/metadata-providers.xml'' se nastavují zdroje metadat. V následujícím příkladu je jako zdroj metadat použita federace //eduID.cz// i mezinárodní federace //eduGAIN//. Metadata se stáhnou a lokálně uloží. # Otevřeme konfigurační soubor metadata-providers.xml vim /opt/shibboleth-idp/conf/metadata-providers.xml Blok kódu výše, tedy element ____ se všemi atributy a potomky, je nutné umístit do //kořenového// elementu ____ v konfiguračním souboru //metadata-providers.xml//! Sice to působí podivně, ale bez toho nebude XML dokument validní a konfigurace nebude fungovat. Pokud by vás zajímal význam atributů v elementu '''', naleznete vše [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199506865/FileBackedHTTPMetadataProvider|v oficiální dokumentaci]]. Vše okolo '''' elementu naleznete také [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199507005/MetadataFilterConfiguration|v oficiální dokumentaci]]. Pokud jsme se v sekci [[#idpproperties|idp.properties]] správně rozhodli využívat primárně nový bezpečnější způsob šifrování pomocí AES-GCM, je velice vhodné vytvořit sekci pro služby, které toto šifrování nepodporují a povolit u nich starší způsob šifrování pomocí AES-CBC, jinak nebude možné se k nim přihlásit. Níže uvedený seznam výjimek (složený z entityID služeb podporujících pouze AES-CBC) zajistí, že IdP bude primárně používat nové šifrování a staré pouze pro vyjmenované služby. Seznam níže uvedených služeb by měl být kompletní. Pokud byste narazili na problém, oznamte ho, prosím, na [[info@eduid.cz]]. Jelikož je z kapacitních důvodů velice komplikované otestovat podporu pro AES-GCM, tak pro eduGAIN je zvolen jiný přístup. Primárně se používá AES-CBC, pokud služba v metadatech sama neuvádí podporu pro AES-GCM. Bližší vysvětlení je nad rámec tohoto návodu, proto je zde uvedeno pouze aktuálně nejvhodnější řešení k 12. 5. 2020. ccm.net.cvut.cz https://adfs-ext.w2lan.cesnet.cz/adfs/services/trust https://adfs.w2lan.cesnet.cz/adfs/services/trust https://auth.eidas.cesnet.cz/sp https://camelot.lf2.cuni.cz/shibboleth https://cawi.fsv.cuni.cz/simplesaml/module.php/saml/sp/metadata.php/default-sp https://collector-metacentrum.liberouter.org/simplesaml/module.php/saml/sp/metadata.php/collector https://cz-online.aliveplatform.com/simplesaml/module.php/saml/sp/metadata.php/cz-online.aliveplatform.com https://digi.law.muni.cz https://digitool.is.cuni.cz/shibboleth https://dspace.vsb.cz/sp/shibboleth https://edu.ista.tacr.cz/ISTA https://filesender.cesnet.cz/saml/sp https://index.bbmri.cz/shibboleth https://ista.tacr.cz/ISTA https://itmulti.cz/simplesaml/module.php/saml/sp/metadata.php/portal4 https://journals.bmj.com/shibboleth https://login.bbmri-eric.eu/proxy/ https://login.ceitec.cz/proxy/ https://login.ezproxy.is.cuni.cz/sp/shibboleth https://login.ezproxy.uochb.cas.cz:2443/sp/shibboleth https://login.ezproxy.vscht.cz/sp/shibboleth https://mefanet-motol.cuni.cz/sp/shibboleth https://meta.cesnet.cz/sp/shibboleth https://mooc.cuni.cz/sp/shibboleth https://nfsmon.ics.muni.cz/ https://odevzdej.cz/shibboleth/ https://orca.ruk.cuni.cz/shibboleth https://pentest.cesnet.cz/sp/shibboleth https://portal.lf3.cuni.cz/shibboleth/sp https://postudium.cz/auth/saml2/sp/metadata.php https://repozitar.cz/shibboleth/ https://seth.ics.muni.cz/shibboleth https://softweco.cz/shibboleth-sp https://su-dev.fit.vutbr.cz/kis https://su-int.fit.vutbr.cz/kis https://teleinform.cz/simplesaml/module.php/saml/sp/metadata.php/portal1 https://telekomunikace-tit.cz/simplesaml/module.php/saml/sp/metadata.php/portal3 https://test.ista.tacr.cz/ISTA https://thalamoss-data.ics.muni.cz/shibboleth https://theses.cz/shibboleth/ https://vut-vsb.cz/simplesaml/module.php/saml/sp/metadata.php/portal2 https://wikisofia.cz/shibboleth https://www.bookport.cz/ https://www.citacepro.com/simplesaml/module.php/saml/sp/metadata.php/eduid-sp https://www.eunis.cz/simplesamlphp/module.php/saml/sp/metadata.php/eunis https://www.jib.cz/shibboleth https://www.levna-knihovna.cz/simplesamlphp/module.php/saml/sp/metadata.php/default-sp https://www.liberouter.org/simplesamlphp/module.php/saml/sp/metadata.php/liberouter https://www.mecenat.eu/sp https://www.vutbr.cz/SSO/saml2/sp shibboleth.Conditions.TRUE Metadata federací //eduID.cz// i //eduGAIN// jsou podepsána. **Důrazně doporučujeme tedy jejich autenticitu ověřovat pomocí kontroly podpisu!** Veřejný klíč je k dispozici na adrese https://www.eduid.cz/docs/eduid/metadata/metadata.eduid.cz.crt.pem. Stáhneme si ho a uložíme do adresáře ''/opt/shibboleth-idp/credentials''. # Stažení veřejného klíče metadata.eduid.cz.crt.pem wget -P /opt/shibboleth-idp/credentials \ https://www.eduid.cz/docs/eduid/metadata/metadata.eduid.cz.crt.pem ==== attribute-resolver.xml ==== Chceme-li si konfigurační soubor ''/opt/shibboleth-idp/conf/attribute-resolver.xml'' nakonfigurovat od začátku a naprosto sami, využijeme k tomu soubor ''/opt/shibboleth-idp/conf/examples/attribute-resolver-ldap.xml'', který v sobě zahrnuje i konektor do LDAP serveru. Doporučujeme však vyjít z připraveného souboru na adrese [[https://www.eduid.cz/shibboleth-idp/attribute-resolver.xml]]. [[cs:tech:attributes]] naleznete v dokumentaci. Podle tohoto seznamu si ''attribute-resolver.xml'' můžeme upravit. **Návod v následujících krocích předpokládá, že jsme použili připravenou šablonu!** Navíc se předpokládá, že pro generování persistentního NameID identifikátoru používáte atribut ''uid''. Tento SAML atribut nesmí mít v ''attribute-resolver.xml'' XML atribut //dependencyOnly="true"//, jinak nebude pro generování persistentního NameID k dispozici a persistentní NameID se nevygeneruje. **Některé služby bez persistentního NameID nebudou fungovat!** # Stažení attribute-resolver.xml wget -O /opt/shibboleth-idp/conf/attribute-resolver.xml \ https://www.eduid.cz/shibboleth-idp/attribute-resolver.xml Potřebujeme-li si definovat své vlastní atributy, pak bližší informace ke konfiguraci nalezneme [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199502864/AttributeResolverConfiguration|v oficiální dokumentaci]]. Budete-li sledovat logy (//idp-process.log// a //idp-warn.log//), objevíte tam varování týkající se zastaralého "SAML2NameID". To můžete ignorovat. ==== cesnetAttributes.xml ==== Sdružení CESNET definuje pro federaci eduID.cz několik atributů, které jsou definovány právě v souboru ''cesnetAttributes.xml'', čímž se zjednoduší konfigurační soubor ''attribute-resolver.xml''. Doporučujeme tedy tento soubor stáhnout z našeho weby. # Stažení cesnetAttributes.xml wget -O /opt/shibboleth-idp/conf/attributes/cesnetAttributes.xml \ https://www.eduid.cz/shibboleth-idp/cesnetAttributes.xml ==== default-rules.xml ==== Aby si Shibboleth IdP načetl soubor ''cesnetAttributes.xml'', který obsahuje definice atributů pro federaci eduID.cz (vizte výše), je nutné přidat jeho načtení do souboru ''default-rules.xml'' ideálně ihned za import ostatních konfiguračních souborů s atributy: Pro jednoduchost je možné tento konfigurační soubor stáhnout z našeho webu. # Stažení default-rules.xml wget -O /opt/shibboleth-idp/conf/attributes/default-rules.xml \ https://www.eduid.cz/shibboleth-idp/default-rules.xml ==== eduPerson.xml ==== Aby se v českém prostředí (závisí na nastavení webového prohlížeče) v přehledu uvolňovaných atributů zobrazovaly české popisy atributů z rodiny "eduPerson", je nutné doplnit překlady do souboru ''eduPerson.xml''. To lze nejsnadněji udělat tak, že si tento soubor stáhnete z našeho webu. # Stažení eduPerson.xml wget -O /opt/shibboleth-idp/conf/attributes/eduPerson.xml \ https://www.eduid.cz/shibboleth-idp/eduPerson.xml ==== inetOrgPerson.xml ==== Aby se v českém prostředí (závisí na nastavení webového prohlížeče) v přehledu uvolňovaných atributů zobrazovaly české popisy atributů z rodiny "inetOrgPerson", je nutné doplnit překlady do souboru ''inetOrgPerson.xml''. To lze nejsnadněji udělat tak, že si tento soubor stáhnete z našeho webu. # Stažení inetOrgPerson.xml wget -O /opt/shibboleth-idp/conf/attributes/inetOrgPerson.xml \ https://www.eduid.cz/shibboleth-idp/inetOrgPerson.xml ==== attribute-filter.xml ==== Mít definované atributy z předchozího kroku nestačí. Ještě je potřeba nadefinovat, které atributy budeme vydávat a komu je budeme vydávat. To se nastavuje v konfiguračním souboru ''/opt/shibboleth-idp/conf/attribute-filter.xml''. Z důvodu zjednodušení doporučujeme uvolňovat atributy dle našeho doporučení na adrese [[https://www.eduid.cz/shibboleth-idp/attribute-filter.xml]]. Filtr uvolňuje atributy podle kategorií entit [[cs:tech:categories:rs]], [[cs:tech:categories:coco]] a dále do federací [[cs:tech:summary|eduID.cz]] a [[cs:tech:edugain|eduGAIN]]. wget -O /opt/shibboleth-idp/conf/attribute-filter.xml \ https://www.eduid.cz/shibboleth-idp/attribute-filter.xml Chcete-li si nastavit uvolňování atributů dle svého, tak bližší informace naleznete [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199501794/AttributeFilterConfiguration|v oficiální dokumentaci]]. ==== idp-metadata.xml ==== Soubor ''/opt/shibboleth-idp/metadata/idp-metadata.xml'' obsahuje metadata IdP, která je potřeba po instalaci doplnit o další informace jako například element '''', který se zapisuje do "rozšíření" (element ''''), např. za '''': # Otevřeme konfigurační soubor idp-metadata.xml vim /opt/shibboleth-idp/metadata/idp-metadata.xml example.org EXAMPLE EXAMPLE EXAMPLE's Identity Provider. Poskytovatel identity pro EXAMPLE. http://www.example.org/en/ http://www.example.org/cs/ https://img.example.org/logo-200.gif Dále je nutno doplnit název organizace v elementu '''' (patří do elementu '''' za element ''''): EXAMPLE, a. l. e. EXAMPLE, z. s. p. o. EXAMPLE EXAMPLE http://www.example.org/en/ http://www.example.org/cs/ Chybět nesmí ani kontaktní osoby v elementu '''' (opět v elementu '''' za element ''''): Kryštof Šáteček mailto:krystof.satecek@example.org Pokud jste nainstalovali verzi 5.1.3, pravděpodobně narazíte na chybu, která způsobí, že v elementu ''EntityDescriptor'' chybí mezera před atributem ''entityID'' v souboru ''metadata/idp-metadata.xml'', prosím, opravte si to, děkuji. (Předpokládám, že v pozdější verzi IdP bude tato chyba opravena.) ==== global.xml ==== Nyní je potřeba v souboru ''global.xml'' definovat některé "y". Tato konfigurace zajistí správnou konektivitu na //MariaDB// databázi pro ukládání persistentních identifikátorů a zároveň pro ukládání souhlasů s vydáváním atributů (tzv. uApprove). # Úpravy v konfiguračním souboru global.xml vim /opt/shibboleth-idp/conf/global.xml V prvním bloku kódu nahradíme ''___SILNE_HESLO___'' heslem pro uživatele //shibboleth// k databázi //shibboleth//. ==== saml-nameid.properties ==== Dále musíme provést úpravy v konfiguračním souboru ''saml-nameid.properties''. # Úpravy v konfiguračním souboru saml-nameid.properties vim /opt/shibboleth-idp/conf/saml-nameid.properties Zde definujeme odkazy na výše definované "y", dále atribut, který se bude pro výpočet persistentního identifikátoru používat (''uid''). idp.persistentId.sourceAttribute = uid # Nové IdP (BASE32) idp.persistentId.encoding = BASE32 # Migrované IdP (BASE64) #idp.persistentId.encoding = BASE64 idp.persistentId.generator = shibboleth.StoredPersistentIdGenerator idp.persistentId.dataSource = shibboleth.MySQLDataSource ==== saml-nameid.xml ==== Podpora persistentních identifikátorů je ještě potřeba zapnout v konfiguračním souboru ''saml-nameid.xml''. # Úpravy v konfiguračním souboru saml-nameid.xml vim /opt/shibboleth-idp/conf/saml-nameid.xml Stačí odkomentovat následující řádek, který je ve výchozí konfiguraci po instalaci IdP zakomentovaný. ==== subject-c14n.xml ==== Teď ještě zbývá úprava v souboru ''subject-c14n.xml''. # Úpravy v konfiguračním souboru subject-c14n.xml vim /opt/shibboleth-idp/conf/c14n/subject-c14n.xml Odkomentujeme tedy následující řádek: ==== messages_cs.properties ==== Ve výchozím nastavení IdP s uživatelem přes webový prohlížeč komunikuje v angličtině. Pokud chceme, aby texty na stránkách IdP byly v češtině, musíme do IdP dodat české překlady. Ty jsou dostupné na webu [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199501275/MessagesTranslation|Shibbolethu]] a jsou pravidelně udržovány. (Pokud byste našli chybu nebo uměli dodat lepší překlad, na stránce najdete i postup, jak k překladům přispět.) Jazyk, který bude použit, se určuje na základě nastavení webového prohlížeče. Takže pokud má uživatel v prohlížeči preferovaný jazyk angličtinu, IdP bude všechny texty vypisovat v angličtině. # Stažení českých překladů wget https://shibboleth.atlassian.net/wiki/download/attachments/1265631751/messages_cs.properties \ -O /opt/shibboleth-idp/messages/messages_cs.properties ===== Spuštění ===== Nyní, když máme IdP nakonfigurováno, opravíme práva v adresáři ''/opt/shibboleth-idp'': # Úprava práv chown jetty /opt/shibboleth-idp/credentials/* chown jetty /opt/shibboleth-idp/metadata V systemd musíme Jetty povolit přístup pro zápis do adresářů s logy a metadaty. # Úprava služby Jetty v systemd systemctl edit jetty Přidání doplňků a potvrdíme dvakrát pomocí y a enter. cd /opt/shibboleth-idp ./bin/plugin.sh -I net.shibboleth.plugin.storage.jdbc ./bin/plugin.sh -I net.shibboleth.idp.plugin.nashorn Zbývá jen znovu načíst konfiguraci pro službu Jetty a tu následně restartovat: # Restart Jetty systemctl daemon-reload systemctl restart jetty Nyní, jakmile Jetty po chvilce nastartuje, můžeme vyzkoušet, zda IdP v pořádku běží: # Zobrazení stavu IdP /opt/shibboleth-idp/bin/status.sh Pokud IdP korektně běží, uvidíte následující: ### Operating Environment Information operating_system: Linux operating_system_version: 6.1.0-43-amd64 operating_system_architecture: amd64 jdk_version: 17.0.18 available_cores: 1 used_memory: 139 MB maximum_memory: 492 MB ### Identity Provider Information idp_version: 5.1.6 start_time: 2026-02-19T15:21:11.585Z current_time: 2026-02-19T15:21:14.400507219Z uptime: PT2.815S enabled modules: idp.Core (Core IdP Functions (Required)) idp.CommandLine (Command Line Scripts) idp.EditWebApp (Overlay Tree for WAR Build) idp.authn.Password (Password Authentication) idp.admin.Hello (Hello World) jetty.Core (Jetty Core Module) installed plugins: net.shibboleth.idp.plugin.nashorn Version 2.0.0 net.shibboleth.plugin.storage.jdbc Version 2.1.0 net.shibboleth.idp.plugin.jetty Version 1.0.0 service: shibboleth.LoggingService last successful reload attempt: 2026-02-19T15:20:02.803397147Z last reload attempt: 2026-02-19T15:20:02.803397147Z service: shibboleth.AttributeFilterService last successful reload attempt: 2026-02-19T15:20:13.325351505Z last reload attempt: 2026-02-19T15:20:13.325351505Z service: shibboleth.AttributeResolverService last successful reload attempt: 2026-02-19T15:20:13.489132397Z last reload attempt: 2026-02-19T15:20:13.489132397Z No Data Connector has ever failed service: shibboleth.AttributeRegistryService last successful reload attempt: 2026-02-19T15:20:06.888429166Z last reload attempt: 2026-02-19T15:20:06.888429166Z service: shibboleth.NameIdentifierGenerationService last successful reload attempt: 2026-02-19T15:20:15.162798749Z last reload attempt: 2026-02-19T15:20:15.162798749Z service: shibboleth.RelyingPartyResolverService last successful reload attempt: 2026-02-19T15:20:15.272258756Z last reload attempt: 2026-02-19T15:20:15.272258756Z service: shibboleth.MetadataResolverService last successful reload attempt: 2026-02-19T15:20:07.499272449Z last reload attempt: 2026-02-19T15:20:07.499272449Z metadata source: eduidcz last refresh attempt: 2026-02-19T15:20:08.035699290Z last successful refresh: 2026-02-19T15:20:08.035699290Z last update: 2026-02-19T15:20:08.035699290Z root validUntil: 2026-03-17T23:53:01Z service: shibboleth.ReloadableAccessControlService last successful reload attempt: 2026-02-19T15:20:16.331058673Z last reload attempt: 2026-02-19T15:20:16.331058673Z service: shibboleth.ReloadableCASServiceRegistry last successful reload attempt: 2026-02-19T15:20:16.385176535Z last reload attempt: 2026-02-19T15:20:16.385176535Z service: shibboleth.ManagedBeanService last successful reload attempt: 2026-02-19T15:20:16.420438192Z last reload attempt: 2026-02-19T15:20:16.420438192Z ===== Testování ===== Od verze 4.1.2 existuje modul [[https://shibboleth.atlassian.net/wiki/spaces/IDP5/pages/3199510241/HelloWorldConfiguration|Hello]], pomocí kterého je možné IdP testovat i bez napojení na federaci. Tento modul je po instalaci zapnutý. Pokud by však zapnutý náhodou nebyl, zapnete ho jednoduše: # Zapnutí modulu Hello /opt/shibboleth-idp/bin/module.sh -e idp.admin.Hello Nyní zbývá nastavit uživatele, který se bude moci k tomuto diagnostickému modulu přihlásit. To se konfiguruje v souboru ''conf/access-control.xml'' ve volbě //AccessByAdminUser//, kde je ve výchozím nastavení hodnota ''jdoe'' (tato hodnota odpovídá přihlašovacímu jménu): Následně na adrese ''/idp/profile/admin/hello'' našeho IdP můžeme přistoupit k modulu a po úspěšném přihlášení vidět seznam atributů a jejich hodnot, které bude umět IdP uvolnit službám ve federaci. Po otestování je možné modul //Hello// vypnout a restartovat Jetty: # Vypnutí modulu Hello /opt/shibboleth-idp/bin/module.sh -d idp.admin.Hello # Restartování Jetty systemctl restart jetty ===== Tipy ===== Na stránce [[cs:tech:idp:shibboleth:advanced]] naleznete některé zajímavé konfigurační tipy, které by vás mohly zajímat, proto se na stránku určitě podívejte. ===== Vzhled ===== Výchozí přihlašovací stránka vypadá následujícím způsobem: {{:cs:tech:idp:shib-loginpage-default-new2.png|Výchozí vzhled přihlašovací stránky.}} Její vzhled je možno upravit do vzhledu podobnému stránkám naší organizace. Veškeré úpravy se provádí v adresáři ''/opt/shibboleth-idp/views/''. Výchozí nastavení je možné najít v ''/opt/shibboleth-idp/dist/views/'', kde se můžete inspirovat. Změny provedené v souborech s koncovkou ve ''views/*.vm'' se projeví okamžitě a není potřeba generovat nový ''idp.war'' ani restartovat Jetty. ---- ====== Publikace metadat ====== **Máme-li nainstalován Shibboleth IdP, můžeme pokračovat [[cs:tech:metadata-publication|publikací metadat]].**