====== 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]].**