cs:tech:idp:shibboleth:advanced

Pokročilá konfigurace Shibboleth IdP

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

Jestliže Váš 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ůžete 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>

Následně je třeba ještě povolit uvolňování výše definovaného atributu v konfiguračním souboru conf/attribute-filter.xml. Např. pro uvolňování cn v rámci federace eduID.cz dle groupID by to vypadalo takto:

<!-- eduID.cz federation -->
<AttributeFilterPolicy id="eduidcz">
 
    <!-- Restriction by group -->
    <PolicyRequirementRule
        xsi:type="InEntityGroup"
        groupID="https://eduid.cz/metadata"/>
 
    <AttributeRule attributeID="cn" permitAny="true"/>
 
</AttributeFilterPolicy>

Teď je potřeba restartovat AttributeResolverService a AttributeFilterService anebo rovnou Jetty:

# Restart AttributeResolverService a AttributeFilterService
cd /opt/shibboleth-idp/
./bin/reload-service.sh -id shibboleth.AttributeResolverService
./bin/reload-service.sh -id shibboleth.AttributeFilterService
 
# Případně restart Jetty
systemctl restart jetty9

commonNameASCII

Atribut commonNameASCII je vyžadován službou TCS pro vydávání osobních certifikátů.

Pokud takový atribut nemáte v LDAP/AD serveru, můžete si ho v Shibboleth IdP snadno složit. 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"/>
    <DisplayName xml:lang="cs">Celé jméno bez diakritiky</DisplayName>
    <DisplayName xml:lang="en">Full name without diacritics</DisplayName>
    <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>

Nyní zbývá tento atribut ještě uvolňovat. Pro jeho uvolňování službám ve federaci eduID.cz, tedy včetně portálu pro osobní TCS certifikáty, můžeme použít následující groupID pravidlo do konfiguračního souboru conf/attribute-filter.xml:

<!-- eduID.cz federation -->
<AttributeFilterPolicy id="eduidcz">
 
    <!-- Restriction by group -->
    <PolicyRequirementRule
        xsi:type="InEntityGroup"
        groupID="https://eduid.cz/metadata"/>
 
    <AttributeRule attributeID="commonNameASCII" permitAny="true"/>
 
</AttributeFilterPolicy>

Zbývá jen restartovat AttributeResolverService a AttributeFilterService anebo rovnou Jetty:

# Restart AttributeResolverService a AttributeFilterService
cd /opt/shibboleth-idp/
./bin/reload-service.sh -id shibboleth.AttributeResolverService
./bin/reload-service.sh -id shibboleth.AttributeFilterService
 
# Případně restart Jetty
systemctl restart jetty9

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ím souboru /opt/shibboleth-idp/conf/idp.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:

idp.session.timeout           = PT12H
idp.session.defaultSPlifetime = PT12H
idp.authn.defaultLifetime     = PT12H
idp.authn.defaultTimeout      = PT12H

Restartujeme Jetty:

# Restart Jetty
systemctl restart jetty9

Seřazení atributů v uApprove

Chcete-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ůžete toho dosáhnout v konfiguračním souboru conf/intercept/consent-intercept-config.xml od řádku 71. Element <util:list id=„shibboleth.consent.attribute-release.AttributeDisplayOrder“> musíte 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ů v uApprove

Některé atributy je vhodné v uApprove uživatelům nezobrazovat, jelikož jejich hodnoty mohou 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čuji schovávat i eduPersonEntitlement.

Nastavení se provádí v conf/intercept/consent-intercept-config.xml v elementu <util:list id=„shibboleth.consent.attribute-release.BlacklistedAttributeIDs“>.

<util:list id="shibboleth.consent.attribute-release.BlacklistedAttributeIDs">
    <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

Vypnutí uApprove

Pokud chcete vypnout tzv. uApprove – vlastnost, 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 provést úpravu v konfiguračním souboru /opt/shibboleth-idp/conf/relying-party.xml.

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

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

změnit na

<bean parent="SAML2.SSO" />

Pak musíme restartovat Jetty:

# Restart Jetty
systemctl restart jetty9
Last modified:: 2020/03/27 15:34