cs:tech:idp:shibboleth:advanced

Pokročilá konfigurace Shibboleth IdP

Složení atributu "cn" z "givenName" a "sn"

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

commonNameASCII

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

Prodloužení doby platnosti přihlášení

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

Zapnutí

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

Na řádku 40 je potřeba doplnit XML atribut p:postAuthenticationFlows=„attribute-release“, čili

<bean parent="SAML2.SSO" p:postAuthenticationFlows="attribute-release" />

Pak je nutné restartovat Jetty:

# Restart Jetty
systemctl restart jetty9

Seřazení atributů

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

Schování atributů

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

Expirace hesla

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 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" class="net.shibboleth.idp.profile.logic.DateAttributePredicate"
    c:attribute="passwordExpiration" c:formatString="yyyyMMddHHmmssX"
    p:resultIfMissing="true" p:offset="-P14D" />

Pak ještě zbývá upravit soubor relying-party.xml a 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
Last modified:: 2021/06/25 16:38