Obsah

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ě 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:

  1. potvrdíme cílový instalační adresář,
  2. vyplníme hostname serveru (pokud není vyplněn správně),
  3. potvrdíme entityID,
  4. 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:

  1. jetty.ssl.host=0.0.0.0 z původní hodnoty 127.0.0.1,
  2. jetty.ssl.port=443 z původní hodnoty 8443,
  3. jetty.http.port=80 z původní hodnoty 8080,
  4. jetty.sslContext.keyStorePassword= heslo z předchozího kroku, když jste generovali keystore,
  5. jetty.sslContext.trustStorePassword= heslo z předchozího kroku, když jste generovali keystore,
  6. jetty.sslContext.keyManagerPassword= heslo z předchozího kroku, když jste generovali keystore,
  7. jetty.httpConfig.sendServerVersion=false tento řádek ve výchozí konfiguraci chybí,
  8. etc/tweak-ssl.xml tento řádek ve výchozí konfiguraci chybí.
shibboleth.ini
# 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.

shibboleth.mod
[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.

tweak-ssl.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">
 
    <!-- Exclude old and unsafe ciphers -->
    <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>
                <Item>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256</Item>
                <Item>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384</Item>
            </Array>
        </Arg>
    </Call>
 
    <!-- Exclude old and unsafe protocols -->
    <Call name="addExcludeProtocols">
        <Arg>
            <Array type="java.lang.String">
                <Item>SSL</Item>
                <Item>SSLv2</Item>
                <Item>SSLv2Hello</Item>
                <Item>SSLv3</Item>
            </Array>
        </Arg>
    </Call>
 
    <!-- Include modern protocols -->
    <Call name="setIncludeProtocols">
        <Arg>
            <Array type="java.lang.String">
                <Item>TLSv1.3</Item>
                <Item>TLSv1.2</Item>
            </Array>
        </Arg>
    </Call>
 
    <!-- Forward Secrecy -->
    <Set name="IncludeCipherSuites">
        <Array type="String">
            <Item>TLS_AES_128_GCM_SHA256</Item>
            <Item>TLS_AES_256_GCM_SHA384</Item>
            <Item>TLS_CHACHA20_POLY1305_SHA256</Item>
            <Item>TLS_ECDHE.*</Item>
        </Array>
    </Set>
 
</Configure>

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ší.

jetty-rewrite-rules.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://jetty.org/configure_10_0.dtd">
<Configure id="Rewrite" class="org.eclipse.jetty.rewrite.handler.RuleContainer">
 
<!-- Strict-Transport-Security -->
<Call name="addRule">
  <Arg>
    <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
      <Set name="pattern">*</Set>
      <Set name="headerName">Strict-Transport-Security</Set>
      <Set name="headerValue">Max-Age=15768000</Set>
    </New>
  </Arg>
</Call>
 
<!-- X-Content-Type-Options -->
<Call name="addRule">
  <Arg>
    <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
      <Set name="pattern">*</Set>
      <Set name="headerName">X-Content-Type-Options</Set>
      <Set name="headerValue">nosniff</Set>
    </New>
  </Arg>
</Call>
 
<!-- X-Xss-Protection -->
<Call name="addRule">
  <Arg>
    <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
      <Set name="pattern">*</Set>
      <Set name="headerName">X-Xss-Protection</Set>
      <Set name="headerValue">1; mode=block</Set>
    </New>
  </Arg>
</Call>
 
<!-- X-Frame-Options -->
<Call name="addRule">
  <Arg>
    <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
      <Set name="pattern">*</Set>
      <Set name="headerName">X-Frame-Options</Set>
      <Set name="headerValue">DENY</Set>
    </New>
  </Arg>
</Call>
 
<!-- Content-Security-Policy -->
<Call name="addRule">
  <Arg>
    <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
      <Set name="pattern">*</Set>
      <Set name="headerName">Content-Security-Policy</Set>
      <Set name="headerValue">default-src 'self'; style-src 'self'; script-src 'self' 'unsafe-inline'; img-src 'self'; font-src; frame-ancestors 'none'</Set>
    </New>
  </Arg>
</Call>
 
<!-- Referrer-Policy -->
<Call name="addRule">
  <Arg>
    <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
      <Set name="pattern">*</Set>
      <Set name="headerName">Referrer-Policy</Set>
      <Set name="headerValue">no-referrer-when-downgrade</Set>
    </New>
  </Arg>
</Call>
 
</Configure>

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

jetty.service
[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í dokumentaci.

Od Shibboleth IdP 4.0.0 se jako výchozí šifrovací algoritmus pro šifrování XML používá 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 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í 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
<!-- eduID.cz -->
<MetadataProvider
    id="eduidcz"
    xsi:type="FileBackedHTTPMetadataProvider"
    backingFile="%{idp.home}/metadata/eduidcz.xml"
    metadataURL="https://metadata.eduid.cz/entities/eduid+sp"
    maxRefreshDelay="PT30M">
 
    <MetadataFilter
        xsi:type="SignatureValidation"
        requireSignedRoot="true"
        certificateFile="%{idp.home}/credentials/metadata.eduid.cz.crt.pem" />
 
    <MetadataFilter
        xsi:type="RequiredValidUntil"
        maxValidityInterval="P30D" />
 
</MetadataProvider>
 
<!-- eduGAIN -->
<MetadataProvider
    id="edugain"
    xsi:type="FileBackedHTTPMetadataProvider"
    backingFile="%{idp.home}/metadata/edugain.xml"
    metadataURL="https://metadata.eduid.cz/entities/edugain+sp"
    maxRefreshDelay="PT30M">
 
    <MetadataFilter
        xsi:type="SignatureValidation"
        requireSignedRoot="true"
        certificateFile="%{idp.home}/credentials/metadata.eduid.cz.crt.pem" />
 
    <MetadataFilter
        xsi:type="RequiredValidUntil"
        maxValidityInterval="P30D" />
 
</MetadataProvider>

Blok kódu výše, tedy element <MetadataProvider> se všemi atributy a potomky, je nutné umístit do kořenového elementu <MetadataProvider> 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 <MetadataProvider>, naleznete vše v oficiální dokumentaci. Vše okolo <MetadataFilter> elementu naleznete také v oficiální dokumentaci.

Pokud jsme se v sekci 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.

<!-- eduID.cz -->
<MetadataProvider
    id="eduidcz"
    xsi:type="FileBackedHTTPMetadataProvider"
    backingFile="%{idp.home}/metadata/eduidcz.xml"
    metadataURL="https://metadata.eduid.cz/entities/eduid+sp"
    maxRefreshDelay="PT30M">
 
    <MetadataFilter
        xsi:type="SignatureValidation"
        requireSignedRoot="true"
        certificateFile="%{idp.home}/credentials/metadata.eduid.cz.crt.pem" />
 
    <MetadataFilter
        xsi:type="RequiredValidUntil"
        maxValidityInterval="P30D" />
 
    <MetadataFilter
        xsi:type="Algorithm">
 
        <md:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc" />
        <Entity>ccm.net.cvut.cz</Entity>
        <Entity>https://adfs-ext.w2lan.cesnet.cz/adfs/services/trust</Entity>
        <Entity>https://adfs.w2lan.cesnet.cz/adfs/services/trust</Entity>
        <Entity>https://auth.eidas.cesnet.cz/sp</Entity>
        <Entity>https://camelot.lf2.cuni.cz/shibboleth</Entity>
        <Entity>https://cawi.fsv.cuni.cz/simplesaml/module.php/saml/sp/metadata.php/default-sp</Entity>
        <Entity>https://collector-metacentrum.liberouter.org/simplesaml/module.php/saml/sp/metadata.php/collector</Entity>
        <Entity>https://cz-online.aliveplatform.com/simplesaml/module.php/saml/sp/metadata.php/cz-online.aliveplatform.com</Entity>
        <Entity>https://digi.law.muni.cz</Entity>
        <Entity>https://digitool.is.cuni.cz/shibboleth</Entity>
        <Entity>https://dspace.vsb.cz/sp/shibboleth</Entity>
        <Entity>https://edu.ista.tacr.cz/ISTA</Entity>
        <Entity>https://filesender.cesnet.cz/saml/sp</Entity>
        <Entity>https://index.bbmri.cz/shibboleth</Entity>
        <Entity>https://ista.tacr.cz/ISTA</Entity>
        <Entity>https://itmulti.cz/simplesaml/module.php/saml/sp/metadata.php/portal4</Entity>
        <Entity>https://journals.bmj.com/shibboleth</Entity>
        <Entity>https://login.bbmri-eric.eu/proxy/</Entity>
        <Entity>https://login.ceitec.cz/proxy/</Entity>
        <Entity>https://login.ezproxy.is.cuni.cz/sp/shibboleth</Entity>
        <Entity>https://login.ezproxy.uochb.cas.cz:2443/sp/shibboleth</Entity>
        <Entity>https://login.ezproxy.vscht.cz/sp/shibboleth</Entity>
        <Entity>https://mefanet-motol.cuni.cz/sp/shibboleth</Entity>
        <Entity>https://meta.cesnet.cz/sp/shibboleth</Entity>
        <Entity>https://mooc.cuni.cz/sp/shibboleth</Entity>
        <Entity>https://nfsmon.ics.muni.cz/</Entity>
        <Entity>https://odevzdej.cz/shibboleth/</Entity>
        <Entity>https://orca.ruk.cuni.cz/shibboleth</Entity>
        <Entity>https://pentest.cesnet.cz/sp/shibboleth</Entity>
        <Entity>https://portal.lf3.cuni.cz/shibboleth/sp</Entity>
        <Entity>https://postudium.cz/auth/saml2/sp/metadata.php</Entity>
        <Entity>https://repozitar.cz/shibboleth/</Entity>
        <Entity>https://seth.ics.muni.cz/shibboleth</Entity>
        <Entity>https://softweco.cz/shibboleth-sp</Entity>
        <Entity>https://su-dev.fit.vutbr.cz/kis</Entity>
        <Entity>https://su-int.fit.vutbr.cz/kis</Entity>
        <Entity>https://teleinform.cz/simplesaml/module.php/saml/sp/metadata.php/portal1</Entity>
        <Entity>https://telekomunikace-tit.cz/simplesaml/module.php/saml/sp/metadata.php/portal3</Entity>
        <Entity>https://test.ista.tacr.cz/ISTA</Entity>
        <Entity>https://thalamoss-data.ics.muni.cz/shibboleth</Entity>
        <Entity>https://theses.cz/shibboleth/</Entity>
        <Entity>https://vut-vsb.cz/simplesaml/module.php/saml/sp/metadata.php/portal2</Entity>
        <Entity>https://wikisofia.cz/shibboleth</Entity>
        <Entity>https://www.bookport.cz/</Entity>
        <Entity>https://www.citacepro.com/simplesaml/module.php/saml/sp/metadata.php/eduid-sp</Entity>
        <Entity>https://www.eunis.cz/simplesamlphp/module.php/saml/sp/metadata.php/eunis</Entity>
        <Entity>https://www.jib.cz/shibboleth</Entity>
        <Entity>https://www.levna-knihovna.cz/simplesamlphp/module.php/saml/sp/metadata.php/default-sp</Entity>
        <Entity>https://www.liberouter.org/simplesamlphp/module.php/saml/sp/metadata.php/liberouter</Entity>
        <Entity>https://www.mecenat.eu/sp</Entity>
        <Entity>https://www.vutbr.cz/SSO/saml2/sp</Entity>
 
    </MetadataFilter>
 
</MetadataProvider>
 
<!-- eduGAIN -->
<MetadataProvider
    id="edugain"
    xsi:type="FileBackedHTTPMetadataProvider"
    backingFile="%{idp.home}/metadata/edugain.xml"
    metadataURL="https://metadata.eduid.cz/entities/edugain+sp"
    maxRefreshDelay="PT30M">
 
    <MetadataFilter
        xsi:type="SignatureValidation"
        requireSignedRoot="true"
        certificateFile="%{idp.home}/credentials/metadata.eduid.cz.crt.pem" />
 
    <MetadataFilter
        xsi:type="RequiredValidUntil"
        maxValidityInterval="P30D" />
 
    <MetadataFilter
        xsi:type="Algorithm">
 
        <md:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
        <ConditionRef>shibboleth.Conditions.TRUE</ConditionRef>
 
    </MetadataFilter>
 
</MetadataProvider>

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. Atributy 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 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:

<import resource="cesnetAttributes.xml" />

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 Research & Scholarship, Code of Conduct a dále do federací eduID.cz a 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 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 <UIInfo>, který se zapisuje do "rozšíření" (element <Extensions>), např. za <Scope>:

# Otevřeme konfigurační soubor idp-metadata.xml
vim /opt/shibboleth-idp/metadata/idp-metadata.xml
<md:Extensions>
    <shibmd:Scope regexp="false">example.org</shibmd:Scope>
    <mdui:UIInfo>
        <mdui:DisplayName xml:lang="en">EXAMPLE</mdui:DisplayName>
        <mdui:DisplayName xml:lang="cs">EXAMPLE</mdui:DisplayName>
        <mdui:Description xml:lang="en">EXAMPLE's Identity Provider.</mdui:Description>
        <mdui:Description xml:lang="cs">Poskytovatel identity pro EXAMPLE.</mdui:Description>
        <mdui:InformationURL xml:lang="en">http://www.example.org/en/</mdui:InformationURL>
        <mdui:InformationURL xml:lang="cs">http://www.example.org/cs/</mdui:InformationURL>
        <mdui:Logo height="200" width="200">https://img.example.org/logo-200.gif</mdui:Logo>
    </mdui:UIInfo>
</md:Extensions>

Dále je nutno doplnit název organizace v elementu <md:Organization> (patří do elementu <EntityDescriptor> za element </IDPSSODescriptor>):

<md:Organization>
    <md:OrganizationName xml:lang="en">EXAMPLE, a. l. e.</md:OrganizationName>
    <md:OrganizationName xml:lang="cs">EXAMPLE, z. s. p. o.</md:OrganizationName>
    <md:OrganizationDisplayName xml:lang="en">EXAMPLE</md:OrganizationDisplayName>
    <md:OrganizationDisplayName xml:lang="cs">EXAMPLE</md:OrganizationDisplayName>
    <md:OrganizationURL xml:lang="en">http://www.example.org/en/</md:OrganizationURL>
    <md:OrganizationURL xml:lang="cs">http://www.example.org/cs/</md:OrganizationURL>
</md:Organization>

Chybět nesmí ani kontaktní osoby v elementu <md:ContactPerson> (opět v elementu <EntityDescriptor> za element </md:Organization>):

<md:ContactPerson contactType="technical">
    <md:GivenName>Kryštof</md:GivenName>
    <md:SurName>Šáteček</md:SurName>
    <md:EmailAddress>mailto:krystof.satecek@example.org</md:EmailAddress>
</md:ContactPerson>

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é "<bean>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.

<bean id="shibboleth.MySQLDataSource"
    class="org.apache.commons.dbcp2.BasicDataSource"
    p:driverClassName="org.mariadb.jdbc.Driver"
    p:url="jdbc:mysql://localhost:3306/shibboleth"
    p:username="shibboleth"
    p:password="___SILNE_HESLO___" />
 
    <bean id="JDBCStorageService" parent="shibboleth.JDBCStorageService"
          p:dataSource-ref="shibboleth.MySQLDataSource"
          p:transactionIsolation="4"
          p:retryableErrors="40001"
     />
 
    <bean id="shibboleth.JPAStorageService"
        parent="shibboleth.JDBCStorageService"
        p:cleanupInterval="%{idp.storage.cleanupInterval:PT10M}"
        p:dataSource-ref="shibboleth.MySQLDataSource"/>

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é "<bean>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ý.

<ref bean="shibboleth.SAML2PersistentGenerator" />

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:

<ref bean="c14n/SAML2Persistent" />

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 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 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):

<entry key="AccessByAdminUser">
  <bean parent="shibboleth.PredicateAccessControl">
    <constructor-arg>
      <bean parent="shibboleth.Conditions.SubjectName" c:collection="#{'jdoe'}" />
    </constructor-arg>
  </bean>
</entry>

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 Pokročilá konfigurace Shibboleth IdP 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:

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 publikací metadat.