====== Inštalácia a nastavenie Shibboleth IdP ====== Pred inštaláciou Shibboleth musí byť nastavené a funkčné Jetty. > Shibboleth Identity Provider >> https://shibboleth.net/downloads/identity-provider/ Zo stránky projektu stiahneme zdrojové kódy do adresára /opt. wget -P /opt \ https://shibboleth.net/downloads/identity-provider/4.0.1/shibboleth-identity-provider-4.0.1.tar.gz \ https://shibboleth.net/downloads/identity-provider/4.0.1/shibboleth-identity-provider-4.0.1.tar.gz.asc \ https://shibboleth.net/downloads/identity-provider/4.0.1/shibboleth-identity-provider-4.0.1.tar.gz.sha256 Skontrolujeme SHA256 hash a GPG podpis: cd /opt sha256sum -c shibboleth-identity-provider-4.0.1.tar.gz.sha256 gpg --verify shibboleth-identity-provider-4.0.1.tar.gz.asc **Postup inštalácie Shibboleth IdP** tar -xzf shibboleth-identity-provider-4.0.1.tar.gz cd shibboleth-identity-provider-4.0.1/ Pripravíme si heslá pre Backchannel PKCS12 a Cookie Encryption, ktoré budeme potrebovať po spustení inštalačného skriptu. Pomocou prikazu: openssl rand -hex 20 vygenerujeme dve nové heslá a poznačíme si ich napriklad spôsobom: 1) Backchannel PKCS12 = vygenerované heslo 1 2) Cookie Encryption = vygenerované heslo 2 Spustenie inštalačného skriptu z umiestnenia v adresári /opt/shibboleth-identity-provider-4.0.1/: ./bin/install.sh Proces inštalácie prebieha nasledovne: Pre demonštráciu je idp.example.org použitý iba ako príklad. Buildfile: /opt/shibboleth-identity-provider-4.0.1/bin/build.xml install: Source (Distribution) Directory (press to accept default): [/opt/shibboleth-identity-provider-4.0.1] ? Installation Directory: [/opt/shibboleth-idp] ? INFO [net.shibboleth.idp.installer.V4Install:151] - New Install. Version: 4.0.1 Host Name: [1.2.3.4] ? 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: vygenerované heslo 1 Re-enter password: vygenerované heslo 1 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: vygenerované heslo 2 Re-enter password: vygenerované heslo 2 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:72] - Rebuilding /opt/shibboleth-idp/war/idp.war, Version 4.0.1 INFO [net.shibboleth.idp.installer.BuildWar:81] - Initial populate from /opt/shibboleth-idp/dist/webapp to /opt/shibboleth-idp/webpapp.tmp INFO [net.shibboleth.idp.installer.BuildWar:90] - Overlay from /opt/shibboleth-idp/edit-webapp to /opt/shibboleth-idp/webpapp.tmp INFO [net.shibboleth.idp.installer.BuildWar:99] - Creating war file /opt/shibboleth-idp/war/idp.war BUILD SUCCESSFUL Total time: **Postup konfigurácie Shibboleth IdP** Základné nastavenie. Konfigurácia môže byť veľmi rôznorodá. ''idp.properties'' V súbore /opt/shibboleth-idp/conf/idp.properties nastavíme podporu pre ukladanie súhlasov s poskytovaním užívateľských informácií (atribútov) do databázy. Ďalej vieme rozhodovať či sa majú používať cookies alebo lokálne úložidká HTML. Možeme nastaviť aj predvolený šifrovací algoritmus pre šifrovanie XML. Od Shibboleth IdP verzie 4.0.0 sa používa novší, bezpečnejší, predvolený šifrovací algoritmus AES-GCM. Staršie verzie IdP používali AES-CBC. Nový algoritmus AES-GCM podporujú aktuálne operačné systémy, na ktorých je používaná aktuálna verzia Shibboleth SP. Ostatné implementácie SAML protokolu, ako napríklad SimpleSAMLphp a dalšie tento protokol nepodporujú, nebudú fungovať. Upravíme konfiguračný súbor idp.properties: nano /opt/shibboleth-idp/conf/idp.properties V konfigurácii upravíme nasledovné položky: # General cookie properties (maxAge only applies to persistent cookies) idp.cookie.secure = true #idp.cookie.httpOnly = true #idp.cookie.domain = #idp.cookie.path = #idp.cookie.maxAge = 31536000 # These control operation of the SameSite filter, which is off by default. #idp.cookie.sameSite = None #idp.cookie.sameSiteCondition = shibboleth.Conditions.FALSE # Set to "shibboleth.StorageService" or custom bean for alternate storage of consent #idp.consent.StorageService = shibboleth.ClientPersistentStorageService idp.consent.StorageService = shibboleth.JPAStorageService idp.storage.htmlLocalStorage = true Pre zachovanie kompatibility s implementáciami protokolu SAML necháme zakomentovanú položku: #idp.encryption.config=shibboleth.EncryptionConfiguration.GCM **Nastavenia LDAP** Budeme nastavovat šifrované spojenie na LDAP server. Najskôr si stiahneme SSL certifikát z LDAP servera do potrebného umiestnenia: openssl s_client -showcerts -connect náš.ldap.sk:636 /dev/null|openssl x509 -outform PEM > /opt/shibboleth-idp/credentials/ldap-server.crt ''ldap.properties'' Následne môžeme pokračovať konfiguráciou ldap.properties. nano /opt/shibboleth-idp/conf/ldap.properties Dôležité su najmä položky: 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 idp.ldaptive.provider = org.ldaptive.provider.unboundid.UnboundIDProvider Príklad konfigurácie: # LDAP authentication configuration, see authn/ldap-authn-config.xml # Note, this doesn't apply to the use of JAAS ## Authenticator strategy, either anonSearchAuthenticator, bindSearchAuthenticator, directAuthenticator, adAuthenticator idp.authn.LDAP.authenticator = bindSearchAuthenticator ## Connection properties ## idp.authn.LDAP.ldapURL = ldaps://náš.ldap.sk:636 idp.authn.LDAP.useStartTLS = false idp.authn.LDAP.useSSL = true # Time in milliseconds that connects will block idp.authn.LDAP.connectTimeout = PT3S # Time in milliseconds to wait for responses idp.authn.LDAP.responseTimeout = PT3S ## SSL configuration, either jvmTrust, certificateTrust, or keyStoreTrust idp.authn.LDAP.sslConfig = certificateTrust ## If using certificateTrust above, set to the trusted certificate's path idp.authn.LDAP.trustCertificates = %{idp.home}/credentials/ldap-server.crt ## If using keyStoreTrust above, set to the truststore path #idp.authn.LDAP.trustStore = %{idp.home}/credentials/ldap-server.truststore ## Return attributes during authentication #idp.authn.LDAP.returnAttributes = passwordExpirationTime,loginGraceRemaining ## DN resolution properties ## # Search DN resolution, used by anonSearchAuthenticator, bindSearchAuthenticator # for AD: CN=Users,DC=example,DC=org idp.authn.LDAP.baseDN = ou=idp,dc=náš,dc=ldap,dc=sk idp.authn.LDAP.subtreeSearch = true idp.authn.LDAP.userFilter = (uid={user}) # bind search configuration # for AD: idp.authn.LDAP.bindDN=adminuser@domain.com idp.authn.LDAP.bindDN = cn=idp,ou=example,dc=náš,dc=ldap,dc=sk idp.ldaptive.provider = org.ldaptive.provider.unboundid.UnboundIDProvider # Format DN resolution, used by directAuthenticator, adAuthenticator # for AD use idp.authn.LDAP.dnFormat=%s@domain.com #idp.authn.LDAP.dnFormat = uid=%s,ou=people,dc=example,dc=org # pool passivator, either none, bind or anonymousBind #idp.authn.LDAP.bindPoolPassivator = none # LDAP attribute configuration, see attribute-resolver.xml # Note, this likely won't apply to the use of legacy V2 resolver configurations idp.attribute.resolver.LDAP.ldapURL = %{idp.authn.LDAP.ldapURL} idp.attribute.resolver.LDAP.connectTimeout = %{idp.authn.LDAP.connectTimeout:PT3S} idp.attribute.resolver.LDAP.responseTimeout = %{idp.authn.LDAP.responseTimeout:PT3S} idp.attribute.resolver.LDAP.baseDN = %{idp.authn.LDAP.baseDN:undefined} idp.attribute.resolver.LDAP.bindDN = %{idp.authn.LDAP.bindDN:undefined} idp.attribute.resolver.LDAP.useStartTLS = %{idp.authn.LDAP.useStartTLS:true} idp.attribute.resolver.LDAP.trustCertificates = %{idp.authn.LDAP.trustCertificates:undefined} idp.attribute.resolver.LDAP.searchFilter = (uid=$resolutionContext.principal) # LDAP pool configuration, used for both authn and DN resolution #idp.pool.LDAP.minSize = 3 #idp.pool.LDAP.maxSize = 10 #idp.pool.LDAP.validateOnCheckout = false #idp.pool.LDAP.validatePeriodically = true #idp.pool.LDAP.validatePeriod = PT5M #idp.pool.LDAP.validateDN = #idp.pool.LDAP.validateFilter = (objectClass=*) #idp.pool.LDAP.prunePeriod = PT5M #idp.pool.LDAP.idleTime = PT10M #idp.pool.LDAP.blockWaitTime = PT3S ''secrets.properties'' V súbore (tento nový súbor existuje od verzie Shibboleth IdP 4.0.0) /opt/shibboleth-idp/credentials/secrets.properties, nastavujeme heslo k serveru LDAP a "salt" pre perzistentný NameID identifikátor (atribút eduPersonTargetedID). Na začiatok si vygenerujeme "salt": openssl rand -base64 36 2>/dev/null Potom môžeme pristúpiť k úprave súboru: nano /opt/shibboleth-idp/credentials/secrets.properties Konfiguráciu upravíme nalsedovne: # Default access to LDAP authn and attribute stores. idp.authn.LDAP.bindDNCredential = Tu vložíme heslo, ktoré máme definované pre bind konto v LDAP idp.persistentId.salt = Tu vložíme vygenerovaný salt idp.attribute.resolver.LDAP.bindDNCredential = %{idp.authn.LDAP.bindDNCredential:undefined} Vloženú vygenerovanú hodnotu v "idp.persistentId.salt" nikdy nemeníme! Obmedzenie prístupu IP adries k stránkam so špecifickou funkcionalitou: ''access-control.xml'' nano /opt/shibboleth-idp/conf/access-control.xml V konfiguračnom súbore /opt/shibboleth-idp/conf/metadata-providers.xml sa nastavujú zdroje metadát. ''metadata-providers.xml'' Otvoríme konfiguračný súbor metadata-providers.xml: nano /opt/shibboleth-idp/conf/metadata-providers.xml Budeme doň vkladať blok kódu s údajmi nášho poskytovateľa metadát napríklad: shibboleth.Conditions.TRUE Blok kódu musíme vložiť tak, že ho umiestnime do elementu v konfiguračnom súbore metadata-providers.xml. V prípade, že nebude súčasťou spomínaného už existujúceho elementu v konfigurácii, nebude fungovať. "safeID test metadata" slúžia iba ako príklad! **Pre Vaše IdP potrebujete nastaviť** [[install:idp:metadata|safeID.sk metadáta]]. Na stránke nájdete aj **aktuálny verejný kľúč** pre kontrolu podpisu metadát. Ďalej si potrebujeme stiahnuť verejný kľúč pre kontrolu podpisu metadát a správne ho umiestniť (v návode pokračujeme s príkladom - safeID test metadata): wget -P /opt/shibboleth-idp/credentials \ https://metadata.safeid.sk/keys/safeid-metadata-signing.pem ''attribute-resolver.xml'' Otvoríme konfiguráciu: nano /opt/shibboleth-idp/conf/attribute-resolver.xml Do konfigurácie doplníme nový atribút a nový konektor, do ktorého doplníme "salt", ktorý už máme vygenerovaný - nevytvárame nový: shibboleth.MySQLDataSource [[install:idp:idp:attribute-reslover|Príklad konfigurácie attribute-resolver.xml]] Doplníme atribút aj do konfigurácie filtrov "attribute-filter.xml": ''attribute-filter.xml'' nano /opt/shibboleth-idp/conf/attribute-filter.xml [[install:idp:idp:attribute-filter|Príklad konfigurácie attribute-filter.xml]] ''idp-metadata.xml'' V metadátach sa bude oznamovať, že IdP podporuje perzistentný identifikátor. Otvoríme konfiguráciu /opt/shibboleth-idp/metadata/idp-metadata.xml: nano /opt/shibboleth-idp/metadata/idp-metadata.xml A doplníme element: urn:oasis:names:tc:SAML:2.0:nameid-format:persistent Napríklad za uvedený element: urn:oasis:names:tc:SAML:2.0:nameid-format:persistent Budeme pokračovať v súbore global.xml definovaním niektorých "ov". ''global.xml'' Táto konfigurácia zabezpečí správnu konektivitu na databázu (MariaDB) pre ukladanie perzistentných identifikátorov a pre ukladanie súhlasov s vydávaním atribútov. nano /opt/shibboleth-idp/conf/global.xml Musíme upraviť konfiguračný súbor saml-nameid.properties, v ktorom definujeme odkazy na vyššie uvedené "y" a atribút pre výpočet perzistentného identifikátora. ''saml-nameid.properties'' Otvoríme súbor: nano /opt/shibboleth-idp/conf/saml-nameid.properties A upravíme ho nasledovne: # For computed IDs, set a source attribute, and a secret salt in secrets.properties idp.persistentId.sourceAttribute = uid #idp.persistentId.useUnfilteredAttributes = true #idp.persistentId.algorithm = SHA # BASE64 will match V2 values, we recommend BASE32 encoding for new installs. # Nové IdP (BASE32) idp.persistentId.encoding = BASE32 # Migrované IdP (BASE64) #idp.persistentId.encoding = BASE64 # To use a database, use shibboleth.StoredPersistentIdGenerator idp.persistentId.generator = shibboleth.StoredPersistentIdGenerator # For basic use, set this to a JDBC DataSource bean name: idp.persistentId.dataSource = shibboleth.MySQLDataSource # For advanced use, set to a bean inherited from shibboleth.JDBCPersistentIdStore #idp.persistentId.store = MyPersistentIdStore # Set to an empty property to skip hash-based generation of first stored ID #idp.persistentId.computed = shibboleth.ComputedPersistentIdGenerator Podporu perzistentných identifikátorov musíme aktivovať v konfiguračnom súbore saml-nameid.xml. ''saml-nameid.xml'' Otvoríme konfiguračný súbor: nano /opt/shibboleth-idp/conf/saml-nameid.xml A odkomentujeme v ňom riadok: Finalizujeme konfiguráciu upravením súboru subject-c14n.xml. ''subject-c14n.xml'' Otvoríme konfiguračný súbor: nano /opt/shibboleth-idp/conf/c14n/subject-c14n.xml A odkomentujeme v ňom riadok: **Finálna príprava a spustenie** 1) Nastavenie oprávnení v adresári /opt/shibboleth-idp: 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/* 2) Upravenie služby jetty9 v systemd: systemctl edit jetty9 V pípade distribúcie Debian 11 bullseye môžete nastavenia doplniť do konfigurácie služby pomocou: nano /etc/systemd/system/multi-user.target.wants/jetty9.service Nastavenie oprávnení pre zápis do adresárov /opt/shibboleth-idp/{logs,metadata}: [Service] ReadWritePaths=/opt/shibboleth-idp/logs/ ReadWritePaths=/opt/shibboleth-idp/metadata/ 3) Posledným krokom je aktualizácia konfigurácie pre službu Jetty a jej reštart: systemctl daemon-reload systemctl restart jetty9 Stav IdP môžeme skontrolovať príkazom: /opt/shibboleth-idp/bin/status.sh V prípade správnej konfigurácie a funkčnosti služieb sa može zobraziť podobný výstup ako je uvedený v príklade: ### Operating Environment Information operating_system: Linux operating_system_version: 4.19.0-13-amd64 operating_system_architecture: amd64 jdk_version: 11.0.9.1 available_cores: 4 used_memory: 226 MB maximum_memory: 1500 MB ### Identity Provider Information idp_version: 4.0.1 start_time: 2021-01-27T13:41:24.161Z current_time: 2021-01-27T13:41:25.463251Z uptime: 1302 ms service: shibboleth.LoggingService last successful reload attempt: 2021-01-27T13:30:27.829470Z last reload attempt: 2021-01-27T13:30:27.829470Z service: shibboleth.AttributeFilterService last successful reload attempt: 2021-01-27T13:30:30.431247Z last reload attempt: 2021-01-27T13:30:30.431247Z service: shibboleth.AttributeResolverService last successful reload attempt: 2021-01-27T13:30:30.563391Z last reload attempt: 2021-01-27T13:30:30.563391Z No Data Connector has ever failed service: shibboleth.AttributeRegistryService last successful reload attempt: 2021-01-27T13:30:30.790140Z last reload attempt: 2021-01-27T13:30:30.790140Z service: shibboleth.NameIdentifierGenerationService last successful reload attempt: 2021-01-27T13:30:31.094916Z last reload attempt: 2021-01-27T13:30:31.094916Z service: shibboleth.RelyingPartyResolverService last successful reload attempt: 2021-01-27T13:30:31.185237Z last reload attempt: 2021-01-27T13:30:31.185237Z service: shibboleth.MetadataResolverService last successful reload attempt: 2021-01-27T13:30:31.553387Z last reload attempt: 2021-01-27T13:30:31.553387Z metadata source: ShibbolethMetadata last refresh attempt: 2021-01-27T13:30:37.139408Z last successful refresh: 2021-01-27T13:30:37.139408Z last update: 2021-01-27T13:30:37.139408Z metadata source: safeid-metadata-test last refresh attempt: 2021-01-27T13:30:37.139408Z last successful refresh: 2021-01-27T13:30:37.139408Z last update: 2021-01-27T13:30:37.139408Z root validUntil: 2021-02-10T13:18:01Z service: shibboleth.ReloadableAccessControlService last successful reload attempt: 2021-01-27T13:30:32.250946Z last reload attempt: 2021-01-27T13:30:32.250946Z service: shibboleth.ReloadableCASServiceRegistry last successful reload attempt: 2021-01-27T13:30:32.310935Z last reload attempt: 2021-01-27T13:30:32.310935Z service: shibboleth.ManagedBeanService last successful reload attempt: 2021-01-27T13:30:32.341383Z last reload attempt: 2021-01-27T13:30:32.341383Z V prípade úprav v adresári /opt/shibboleth-idp/edit-webapp/ je potrebné aktualizovať idp.war a reštartovať Jetty. cd /opt/shibboleth-idp ./bin/build.sh systemctl restart jetty9 Testovanie funkčnosti môžeme realizovať pomocou: IdP Webová stránka https://idp.example.org/idp IdP Status https://idp.example.org/idp/status IdP Metadáta https://idp.example.org/idp/shibboleth