Jestliže náš LDAP/AD server neobsahuje atribut cn obsahující celé jméno bez titulů včetně diakritiky, tedy křestní jméno a příjmení (jak je uvedeno v požadavcích na atributy v eduID.cz), můžeme tento atribut jednoduše složit z křestního jména (givenName) a příjmení (sn).
Následující blok kódu z konfiguračního souboru conf/attribute-resolver.xml předpokládá:
myLDAP
je identifikátor konektoru do LDAP/AD serveru,givenName
je název atributu obsahující křesní jméno uživatele (včetně diakritiky),sn
je název atributu obsahující příjmení uživatele (včetně diakritiky).Následující kód předpokládá, že máte Shibboleth IdP verze 4.0.0 a novější.
<!-- cn (givenName + sn) --> <AttributeDefinition xsi:type="Template" id="cn"> <InputAttributeDefinition ref="givenName"/> <InputAttributeDefinition ref="sn"/> <Template>${givenName} ${sn}</Template> </AttributeDefinition>
Teď je potřeba restartovat AttributeResolverService
:
# Restart AttributeResolverService /opt/shibboleth-idp/bin/reload-service.sh -id shibboleth.AttributeResolverService
Atribut commonNameASCII je vyžadován službou TCS pro vydávání osobních certifikátů.
Pokud takový atribut nemáme v LDAP/AD serveru, můžeme si ho v Shibboleth IdP snadno vyrobit. K jeho generování v následující ukázce s výhodou využijeme výše definovaného atributu cn, který jsme složili z křestního jména givenName a příjmení sn.
Definice atributu commonNameASCII v konfiguračním souboru conf/attribute-resolver.xml vypadá následovně (skript předpokládá, že jméno a příjmení včetně diakritiky je v atributu cn, přesně jako je to uvedeno výše):
Následující kód předpokládá, že máte Shibboleth IdP verze 4.0.0 a novější.
<!-- commonNameASCII --> <AttributeDefinition xsi:type="ScriptedAttribute" id="commonNameASCII"> <InputAttributeDefinition ref="cn"/> <AttributeEncoder xsi:type="SAML2String" name="http://eduid.cz/attributes/commonName#ASCII" friendlyName="commonNameASCII"/> <Script> <![CDATA[ load("nashorn:mozilla_compat.js"); importPackage(Packages.edu.internet2.middleware.shibboleth.common.attribute.provider); importPackage(Packages.java.lang); importPackage(Packages.java.text); if(cn.getValues().size() > 0) { originalValue = cn.getValues().get(0); asciiValue = Normalizer.normalize(originalValue, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); commonNameASCII.getValues().add(asciiValue); } ]]> </Script> </AttributeDefinition>
Zbývá jen restartovat AttributeResolverService
:
# Restart AttributeResolverService /opt/shibboleth-idp/bin/reload-service.sh -id shibboleth.AttributeResolverService
Výchozí nastavení Shibboleth IdP způsobuje, že se uživatelé musí každou hodinu přihlašovat ke službám z důvodu vypršení platnosti přihlášení (sezení, session, …). Úpravou v konfiguračních souborech /opt/shibboleth-idp/conf/idp.properties
a /opt/shibboleth-idp/conf/authn/authn.properties
lze dobu platnosti přihlášení prodloužit.
Následující konfigurace způsobí, že se uživatelé musí znovu přihlásit až po uplynutí 12 hodin:
# conf/idp.properties idp.session.timeout = PT12H idp.session.defaultSPlifetime = PT12H # conf/authn/authn.properties idp.authn.defaultLifetime = PT12H idp.authn.defaultTimeout = PT12H
Restartujeme Jetty:
# Restart Jetty
systemctl restart jetty9
Pokud chceme zapnout tzv. „consent“ neboli uApprove – funkci, která po úspěšném přihlášení uživatele zobrazí seznam uživatelských atributů a jejich hodnot, které budou službě uvolněny – je potřeba zapnout modul idp.intercept.Consent
a provést úpravu v konfiguračním souboru /opt/shibboleth-idp/conf/relying-party.xml
.
Zapnutí modulu:
# Zapnutí modulu idp.intercept.Consent /opt/shibboleth-idp/bin/module.sh -e idp.intercept.Consent
Řádek 46 je potřeba změnit z:
<ref bean="SAML2.SSO" />
na
<bean parent="SAML2.SSO" p:postAuthenticationFlows="attribute-release" />
Pak je nutné restartovat Jetty:
# Restart Jetty
systemctl restart jetty9
Chceme-li, aby se v uApprove při potvrzování uvolňovaných atributů, zobrazovaly atributy v nějakém specifickém pořadí tak, aby byl přehled pro uživatele snáze srozumitelný, můžeme toho dosáhnout v konfiguračním souboru conf/intercept/consent-intercept-config.xml
. Element <util:list id=„shibboleth.consent.attribute-release.AttributeDisplayOrder“>
musíme nejprve odkomentovat.
Následující kód způsobí, že atributy v uApprove budou seřazeny následovně (odshora dolů): givenName, sn, cn, commonNameASCII, displayName, telephoneNumber, authMail, mail, eduPersonPrincipalName, unstructuredName, eduPersonUniqueId, o, ou, schacHomeOrganization.
<util:list id="shibboleth.consent.attribute-release.AttributeDisplayOrder"> <value>givenName</value> <value>sn</value> <value>cn</value> <value>commonNameASCII</value> <value>displayName</value> <value>telephoneNumber</value> <value>authMail</value> <value>mail</value> <value>eduPersonPrincipalName</value> <value>unstructuredName</value> <value>eduPersonUniqueId</value> <value>o</value> <value>ou</value> <value>schacHomeOrganization</value> </util:list>
Restartujeme Jetty:
# Restart Jetty
systemctl restart jetty9
Některé atributy je vhodné v uApprove uživatelům nezobrazovat, jelikož jejich obsah může nabývat dosti matoucích hodnot. Mezi tyto atributy, které se ve výchozím nastavení v uApprove nezobrazují, patří transientId
, persistentId
a eduPersonTargetedID
. Osobně doporučujeme schovávat i eduPersonEntitlement
.
Nastavení se provádí v conf/intercept/consent-intercept-config.xml
v elementu <util:list id=„shibboleth.consent.attribute-release.IgnoredAttributeIDs“>
.
<util:list id="shibboleth.consent.attribute-release.IgnoredAttributeIDs"> <value>transientId</value> <value>persistentId</value> <value>eduPersonTargetedID</value> <value>eduPersonEntitlement</value> </util:list>
Teď je potřeba restartovat Jetty:
# Restart Jetty
systemctl restart jetty9
Chceme-li varovat uživatele před expirací hesla, musíme zapnout modul „ExpiringPassword“:
# Zapnutí modulu ExpiringPassword /opt/shibboleth-idp/bin/module.sh -e idp.intercept.ExpiringPassword
Do ldap.properties
doplníme (třeba nakonec souboru) následující volbu:
idp.authn.LDAP.usePasswordExpiration = true
Do attribute-resolver.xml
doplníme atribut passwordExpiration a přidáme element ReturnAttributes
do LDAP konektoru:
<!-- passwordExpiration --> <AttributeDefinition xsi:type="Simple" id="passwordExpiration"> <InputDataConnector ref="myLDAP" attributeNames="passwordExpirationTime"/> </AttributeDefinition>
<DataConnector id="myLDAP" xsi:type="LDAPDirectory" ldapURL="%{idp.attribute.resolver.LDAP.ldapURL}" baseDN="%{idp.attribute.resolver.LDAP.baseDN}" principal="%{idp.attribute.resolver.LDAP.bindDN}" principalCredential="%{idp.attribute.resolver.LDAP.bindDNCredential}" useStartTLS="%{idp.attribute.resolver.LDAP.useStartTLS:true}" connectTimeout="%{idp.attribute.resolver.LDAP.connectTimeout}" trustFile="%{idp.attribute.resolver.LDAP.trustCertificates}" responseTimeout="%{idp.attribute.resolver.LDAP.responseTimeout}" connectionStrategy="%{idp.attribute.resolver.LDAP.connectionStrategy}" noResultIsError="true" multipleResultsIsError="true" excludeResolutionPhases="c14n/attribute"> <FilterTemplate> <![CDATA[ %{idp.attribute.resolver.LDAP.searchFilter} ]]> </FilterTemplate> <ReturnAttributes>* passwordExpirationTime</ReturnAttributes> <ConnectionPool minPoolSize="%{idp.pool.LDAP.minSize:3}" maxPoolSize="%{idp.pool.LDAP.maxSize:10}" blockWaitTime="%{idp.pool.LDAP.blockWaitTime:PT3S}" validatePeriodically="%{idp.pool.LDAP.validatePeriodically:true}" validateTimerPeriod="%{idp.pool.LDAP.validatePeriod:PT5M}" validateDN="%{idp.pool.LDAP.validateDN:}" validateFilter="%{idp.pool.LDAP.validateFilter:(objectClass=*)}" expirationTime="%{idp.pool.LDAP.idleTime:PT10M}"/> </DataConnector>
Následně musíme v souboru /opt/shibboleth-idp/conf/intercept/expiring-password-intercept-config.xml
nastavit, jak moc dopředu chceme uživatele před expirací varovat. Shibboleth IdP má standardně nastaveno 14 dní. Doporučujeme ale provést změnu alespoň na 30 dní, změnit tedy p:offset=„-P14D“ na p:offset=„-P30D“. Ostatní parametry by měly být v pořádku.
<bean id="shibboleth.expiring-password.Condition" parent="shibboleth.Conditions.DateAttribute" c:attribute="passwordExpiration" c:formatString="yyyyMMddHHmmssX" p:resultIfMissing="true" p:offset="-P30D" />
Pak ještě zbývá upravit soubor relying-party.xml
na řádku 46 z:
<ref bean="SAML2.SSO" />
a následujícím způsobem přidat expiring-password
do autentizačního toku pro SAML2.SSO:
<!-- Zapnutí varování před expirací hesla --> <bean parent="SAML2.SSO" p:postAuthenticationFlows="expiring-password" /> <!-- Zapnutí varování před expirací hesla, pokud zároveň máme zapnutý "consent" (uApprove) --> <bean parent="SAML2.SSO" p:postAuthenticationFlows="#{{'attribute-release', 'expiring-password' }}" />
Zbývá restartovat Jetty:
# Restartování Jetty
systemctl restart jetty9
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