Toto je starší verze dokumentu!
Na této stránce se nachází návod, jak do linuxové distribuce Debian nainstalovat Shibboleth IdP. Před instalací musíme zprovoznit Jetty.
Podpora pro Shibboleth IdP řady 3 bude ukončena k 31. 12. 2020. Tento návod se tedy týká již nové řady 4.
Zdrojové kódy stáhneme ze stránky projektu a umístíme do adresáře /opt
anebo pomocí programu wget následujícím způsobem. 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/4.0.0/shibboleth-identity-provider-4.0.0.tar.gz \ https://shibboleth.net/downloads/identity-provider/4.0.0/shibboleth-identity-provider-4.0.0.tar.gz.asc \ https://shibboleth.net/downloads/identity-provider/4.0.0/shibboleth-identity-provider-4.0.0.tar.gz.sha256 # Přepnutí do adresáře /opt cd /opt # Kontrola SHA256 otisku sha256sum -c shibboleth-identity-provider-4.0.0.tar.gz.sha256 # Kontrola GPG podpisu gpg --verify shibboleth-identity-provider-4.0.0.tar.gz.asc
Nyní přistoupíme k samotné instalaci.
# Instalace Shibboleth IdP tar -xzf shibboleth-identity-provider-4.0.0.tar.gz cd shibboleth-identity-provider-4.0.0/ ./bin/install.sh
Po spuštění instalačního skriptu:
openssl rand -hex 20
,
Zde je vyobrazen průběh instalačního skriptu install.sh
.
Buildfile: /opt/shibboleth-identity-provider-4.0.0/bin/build.xml install: Source (Distribution) Directory (press <enter> to accept default): [/opt/shibboleth-identity-provider-4.0.0] ? Installation Directory: [/opt/shibboleth-idp] ? INFO [net.shibboleth.idp.installer.V4Install:151] - New Install. Version: 4.0.0 Host Name: [idp.example.org] ? INFO [net.shibboleth.idp.installer.V4Install:549] - Creating idp-signing, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 INFO [net.shibboleth.idp.installer.V4Install:549] - Creating idp-encryption, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 Backchannel PKCS12 Password: Re-enter password: INFO [net.shibboleth.idp.installer.V4Install:592] - Creating backchannel keystore, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 Cookie Encryption Key Password: Re-enter password: INFO [net.shibboleth.idp.installer.V4Install:633] - Creating backchannel keystore, CN = idp.example.org URI = https://idp.example.org/idp/shibboleth, keySize=3072 INFO [net.shibboleth.utilities.java.support.security.BasicKeystoreKeyStrategyTool:166] - No existing versioning property, initializing... SAML EntityID: [https://idp.example.org/idp/shibboleth] ? Attribute Scope: [example.org] ? INFO [net.shibboleth.idp.installer.V4Install:433] - Creating Metadata to /opt/shibboleth-idp/metadata/idp-metadata.xml INFO [net.shibboleth.idp.installer.BuildWar:71] - Rebuilding /opt/shibboleth-idp/war/idp.war, Version 4.0.0 INFO [net.shibboleth.idp.installer.BuildWar:80] - Initial populate from /opt/shibboleth-idp/dist/webapp to /opt/shibboleth-idp/webpapp.tmp INFO [net.shibboleth.idp.installer.BuildWar:89] - Overlay from /opt/shibboleth-idp/edit-webapp to /opt/shibboleth-idp/webpapp.tmp INFO [net.shibboleth.idp.installer.BuildWar:94] - Creating war file /opt/shibboleth-idp/war/idp.war BUILD SUCCESSFUL Total time: 37 seconds
Tím je instalace hotová a zbývá tedy IdP ještě nakonfigurovat.
Konfigurace může být dost různorodá a vše závisí na tom, zda-li chcete IdP používat pouze pro přístup ke službám federace anebo se rozhodnete používat ho i pro přístup k vašim interním službám.
Zde uvedená ukázka konfigurace slouží jako naprostý základ.
V souboru /opt/shibboleth-idp/conf/idp.properties
nastavíme podporu pro 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.
IdP řady 2 uměla využívat pouze cookies. IdP řady 3 přinesla možnost používání lokálního úložiště, ale tato volba byla standardně vypnuta. V IdP řady 4 je tato volba standardně zapnuta, takže pokud instalujete novou verzi (myšleno neaktualizujete stávající IdP V3 na novou verzi), bude povoleno použití lokálního úložiště, pokud ho prohlížeč podporuje.
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. Nicméně ostatní implementace SAML protokolu, např. SimpleSAMLphp a další, 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
V souboru /opt/shibboleth-idp/conf/ldap.properties
se nastavuje 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.useSSL = true 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 idp.ldaptive.provider = org.ldaptive.provider.unboundid.UnboundIDProvider
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ě. Pokud však chcete, 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
.
Poznámka k ldapURL: 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í volby idp.authn.LDAP.useStartTLS
a idp.authn.LDAP.useSSL
říkají, že namísto TLS budeme používat SSL. 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 tento soubor 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ů.
Volba na posledním řádku (idp.ldaptive.provider
) je důležitá pro fungování LDAPu při použití vyšší verze Javy než 8 (náš případ). Bez přidání této volby se Shibboleth IdP k LDAPu nepřípojí! Bližší informace naleznete v oficiální dokumentaci.
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.
idp.authn.LDAP.bindDNCredential = ___NEJAKE_HESLO___ idp.persistentId.salt = ___NEJAKA_SUL___
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 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>http://fastwiki.vutbr.cz/simplesaml/module.php/saml/sp/metadata.php/fastwiki</Entity> <Entity>http://www.stawiki.cz/simplesaml/module.php/saml/sp/metadata.php/stawiki</Entity> <Entity>https://adfs-4t.w2lan.cesnet.cz/adfs/services/trust</Entity> <Entity>https://adm.hostel.eduid.cz/shibboleth</Entity> <Entity>https://auth.eidas.cesnet.cz/sp</Entity> <Entity>https://auth.services.bmj.com/auth</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://devnull.cesnet.cz/simplesamlphp</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://dspace2.zcu.cz/dspace</Entity> <Entity>https://edu.ista.tacr.cz/ISTA</Entity> <Entity>https://fedra.cesnet-ca.cz/</Entity> <Entity>https://fedra.cesnet-ca.cz/force</Entity> <Entity>https://fedra2.cesnet.cz/sp</Entity> <Entity>https://filesender.cesnet.cz/saml/sp</Entity> <Entity>https://gc3.cesnet.cz/shibboleth</Entity> <Entity>https://index.bbmri.cz/shibboleth</Entity> <Entity>https://iptel.cesnet.cz/shibboleth/cesnet-internal/sp</Entity> <Entity>https://iptelix.cesnet.cz/</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.elixir-czech.org/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://onlineca.cesnet-ca.cz/</Entity> <Entity>https://onlineca.cesnet-ca.cz/force</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://proxy.lifescienceid.org/metadata/backend.xml</Entity> <Entity>https://repozitar.cz/shibboleth/</Entity> <Entity>https://saint.cesnet.cz/shibboleth</Entity> <Entity>https://seth.ics.muni.cz/shibboleth</Entity> <Entity>https://shib-test.cup.cam.ac.uk/shibboleth-sp</Entity> <Entity>https://shibmon.eduid.cz/shibboleth</Entity> <Entity>https://sip.cesnet.cz/sp/shibboleth</Entity> <Entity>https://sip.cesnet.cz/sp/shibboleth/cesnet</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://tcs-dev.cesnet.cz/simplesaml/</Entity> <Entity>https://tcs.cesnet.cz/simplesaml/</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://vnweb.hwwilsonweb.com/shibboleth</Entity> <Entity>https://vut-vsb.cz/simplesaml/module.php/saml/sp/metadata.php/portal2</Entity> <Entity>https://vvvd.vsb.cz/shibboleth</Entity> <Entity>https://wikisofia.cz/shibboleth</Entity> <Entity>https://www.bookport.cz/</Entity> <Entity>https://www.cistbrno.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> <Entity>https://xploreuat.ieee.org/shibboleth-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áhněte ho a uložte 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
Chcete-li si konfigurační soubor /opt/shibboleth-idp/conf/attribute-resolver.xml
nakonfigurovat od začátku a naprosto sami, využijte k tomu soubor /opt/shibboleth-idp/conf/attribute-resolver-ldap.xml
, který v sobě zahrnuje i konektor do LDAP serveru.
Doporučuji však usnadnit si práci a 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
upravte.
Návod v následujících krocích předpokládá, že jste 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řebujete-li si definovat své atributy, pak bližší informace ke konfiguraci naleznete v oficiální dokumentaci.
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.
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
<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> </Extensions>
Dále je nutno doplnit název organizace v elementu <Organization>
(patří do elementu <EntityDescriptor>
za element </AttributeAuthorityDescriptor>
):
<Organization> <OrganizationName xml:lang="en">EXAMPLE, a. l. e.</OrganizationName> <OrganizationName xml:lang="cs">EXAMPLE, z. s. p. o.</OrganizationName> <OrganizationDisplayName xml:lang="en">EXAMPLE</OrganizationDisplayName> <OrganizationDisplayName xml:lang="cs">EXAMPLE</OrganizationDisplayName> <OrganizationURL xml:lang="en">http://www.example.org/en/</OrganizationURL> <OrganizationURL xml:lang="cs">http://www.example.org/cs/</OrganizationURL> </Organization>
Chybět nesmí ani kontaktní osoby v elementu <ContactPerson>
(opět v elementu <EntityDescriptor>
za element <Organization>
):
<ContactPerson contactType="technical"> <GivenName>Kryštof</GivenName> <SurName>Šáteček</SurName> <EmailAddress>mailto:krystof.satecek@example.org</EmailAddress> </ContactPerson>
V metadatech ještě doplníme podporu pro persistentní identifikátor.
Přidáme do elementu <IDPSSODescriptor>
následující řádek těsně před ukončovací element </IDPSSODescriptor>
.
<NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat>
Kromě služeb ve federaci eduID.cz je možné zpřístupnit uživatelům i služby mezinárodní federace eduGAIN. K tomu je potřeba, aby bylo IdP exportováno do metadat eduGAINu, což se zajistí následující úpravou souboru /opt/shibboleth-idp/metadata/idp-metadata.xml
.
Pozor! Následující kód je třeba umístit přesně tímto způsobem! Nejprve je element <EntityDescriptor>
, pak následuje element <Extensions>
a v něm jsou elementy <RepublishRequest>
a <RepublishTarget>
! Nepatří tedy do elementu <Extensions>
umístěného v elementu <IDPSSODescriptor>
!
<EntityDescriptor> <Extensions> <!-- eduGAIN --> <eduidmd:RepublishRequest xmlns:eduidmd="http://eduid.cz/schema/metadata/1.0"> <eduidmd:RepublishTarget>http://edugain.org/</eduidmd:RepublishTarget> </eduidmd:RepublishRequest> <!-- --> <!-- Zde následují element Scope a UIInfo --> <!-- --> </Extensions> </EntityDescriptor>
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="shibboleth.JPAStorageService" class="org.opensaml.storage.impl.JPAStorageService" p:cleanupInterval="%{idp.storage.cleanupInterval:PT10M}" c:factory-ref="shibboleth.JPAStorageService.entityManagerFactory" /> <bean id="shibboleth.JPAStorageService.entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="packagesToScan" value="org.opensaml.storage.impl"/> <property name="dataSource" ref="shibboleth.MySQLDataSource"/> <property name="jpaVendorAdapter" ref="shibboleth.JPAStorageService.JPAVendorAdapter"/> <property name="jpaDialect"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> </property> </bean> <bean id="shibboleth.JPAStorageService.JPAVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" p:generateDdl="true" p:database="MYSQL" p:databasePlatform="org.hibernate.dialect.MariaDBDialect" />
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
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" />
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" />
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/{logs,metadata} chgrp -R jetty /opt/shibboleth-idp/{conf,credentials} chmod -R g+r /opt/shibboleth-idp/conf chmod 750 /opt/shibboleth-idp/credentials chmod 640 /opt/shibboleth-idp/credentials/*
V systemd musíme Jetty povolit přístup pro zápis do adresářů s logy a metadaty.
# Úprava služby jetty9 v systemd
systemctl edit jetty9
Nastavení práv pro záspis do adresářů /opt/shibboleth-idp/{logs,metadata}
:
[Service] ReadWritePaths=/opt/shibboleth-idp/logs/ ReadWritePaths=/opt/shibboleth-idp/metadata/
Zbývá jen znovu načíst konfiguraci pro službu Jetty a tu následně restartovat:
# Restart Jetty
systemctl daemon-reload
systemctl restart jetty9
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: 4.19.0-8-amd64 operating_system_architecture: amd64 jdk_version: 11.0.6 available_cores: 1 used_memory: 260 MB maximum_memory: 1500 MB ### Identity Provider Information idp_version: 4.0.0 start_time: 2020-03-27T11:58:27.546Z current_time: 2020-03-27T11:58:29.415454Z uptime: 1869 ms service: shibboleth.LoggingService last successful reload attempt: 2020-03-27T11:48:53.362422Z last reload attempt: 2020-03-27T11:48:53.362422Z service: shibboleth.AttributeFilterService last successful reload attempt: 2020-03-27T11:48:57.202556Z last reload attempt: 2020-03-27T11:48:57.202556Z service: shibboleth.AttributeResolverService last successful reload attempt: 2020-03-27T11:48:57.531585Z last reload attempt: 2020-03-27T11:48:57.531585Z No Data Connector has ever failed service: shibboleth.AttributeRegistryService last successful reload attempt: 2020-03-27T11:49:00.195848Z last reload attempt: 2020-03-27T11:49:00.195848Z service: shibboleth.NameIdentifierGenerationService last successful reload attempt: 2020-03-27T11:49:00.673174Z last reload attempt: 2020-03-27T11:49:00.673174Z service: shibboleth.RelyingPartyResolverService last successful reload attempt: 2020-03-27T11:49:00.877735Z last reload attempt: 2020-03-27T11:49:00.877735Z service: shibboleth.MetadataResolverService last successful reload attempt: 2020-03-27T11:49:01.654211Z last reload attempt: 2020-03-27T11:49:01.654211Z metadata source: ShibbolethMetadata last refresh attempt: 2020-03-27T11:49:16.181118Z last successful refresh: 2020-03-27T11:49:16.181118Z last update: 2020-03-27T11:49:16.181118Z metadata source: eduidcz last refresh attempt: 2020-03-27T11:49:08.331577Z last successful refresh: 2020-03-27T11:49:08.331577Z last update: 2020-03-27T11:49:08.331577Z root validUntil: 2020-04-22T23:53:01Z metadata source: edugain last refresh attempt: 2020-03-27T11:49:16.181118Z last successful refresh: 2020-03-27T11:49:16.181118Z last update: 2020-03-27T11:49:16.181118Z root validUntil: 2020-04-23T12:03:02Z service: shibboleth.ReloadableAccessControlService last successful reload attempt: 2020-03-27T11:49:11.405929Z last reload attempt: 2020-03-27T11:49:11.405929Z service: shibboleth.ReloadableCASServiceRegistry last successful reload attempt: 2020-03-27T11:49:11.484428Z last reload attempt: 2020-03-27T11:49:11.484428Z service: shibboleth.ManagedBeanService last successful reload attempt: 2020-03-27T11:49:11.554208Z last reload attempt: 2020-03-27T11:49:11.554208Z
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.
Výchozí přihlašovací stránka vypadá následujícím způsobem:
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/edit-webapp/
, jehož obsah se při aktualizaci Shibboleth IdP, narozdíl od adresáře /opt/shibboleth-idp/webapp/
, nepřepisuje.
Po úpravách v adresáři /opt/shibboleth-idp/edit-webapp/
je nutné přegenerovat idp.war
. Po zadání následujících příkazů je třeba potvrdit cílový adresář s instalací Shibboleth IdP.
# Přegenerování idp.war cd /opt/shibboleth-idp ./bin/build.sh
# Průběh generování nového idp.war Installation Directory: [/opt/shibboleth-idp] Rebuilding /opt/shibboleth-idp/war/idp.war ... ...done BUILD SUCCESSFUL Total time: 3 seconds
Pak je ještě nutné restartovat Jetty:
# Restart Jetty
systemctl restart jetty9
Máme-li nainstalován Shibboleth IdP, můžeme pokračovat publikací metadat.
CESNET, z. s. p. o.
Generála Píky 26
16000 Praha 6
info@cesnet.cz
Tel: +420 234 680 222
GSM: +420 602 252 531
support@cesnet.cz