Attribute Authority
Bei Attribute Authorities handelt es sich um externe Attributquellen, anhand derer ein Service Provider zusätzliche, i.d.R. projektspezifische Nutzerdaten abrufen kann, die nicht von der Heimateinrichtung gepflegt werden (sollen). In der Regel geht es hierbei um Projekt- oder Infrastruktur-spezifische Berechtigungen (Entitlements), die vom Projekt bzw. der Forschungsinfrastruktur festgelegt und gepflegt werden. Grundsätzlich kann auch die hinter dem jeweiligen SP liegende Anwendung eine entsprechende Datenbank anbinden. Falls die betreffende Anwendung dies nicht von Haus aus unterstützt oder die Betreiber den damit verbundenen Aufwand vermeiden wollen, ist es einfacher, dem SP die Aufgabe der Sammlung der Autorisierungsdaten zu übertragen - der diese standardkonform (SAML2) wahrnimmt, indem er Attribute Queries an eine oder mehrere Attribute Authorities richtet.
Technisch gesehen handelt es sich bei einer Attribute Authority um einen üblicherweise funktionsreduzierten IdP, der als einziges Profil Attribute Queries unterstützen muss. Hierzu ist es erforderlich, dass der IdP der Heimateinrichtung ein Attribut liefert (z.B. E-Mail, eduPersonPrincipialName, eduPersonUniqueId, Subject-Id), das den / die jeweilige(n) Nutzer(in) eindeutig identifiziert und anhand dessen die Attribute Query bei einer oder mehreren Attribute Authorities erfolgt.
Weiterführende Informationen finden Sie unter:
- "Mit verteilten Rollen: Attribute Authorities in der DFN-AAI" (Gerrit Gragert + Wolfgang Pempe in: DFN-Mitteilungen 87)
Shibboleth IdP als Stand-alone Attribute Authority
Metadaten
Im Gegensatz zu einem 'normalen' IdP wird der <IdPSSODescriptor>
nicht benötigt, relevant ist lediglich der <AttributeAuthorityDescriptor>
. In der DFN-AAI Metadatenverwaltung werden Attribute Authorities als eigener Entity-Typ unterstützt.
Relying Party Konfiguration
Einzig benötigtes Profil ist Attribute Query. Dieses darf nur für berechtigte SPs freigegeben werden.
Beispiel:
- /opt/shibboleth-idp/conf/relying-party.xml
<!--...--> <bean id="shibboleth.UnverifiedRelyingParty" parent="RelyingParty"> <property name="profileConfigurations"> <list> <!-- hier sollte grundsätzlich kein Profil aktiviert werden /> --> </list> </property> </bean> <bean id="shibboleth.DefaultRelyingParty" parent="RelyingParty"> <property name="profileConfigurations"> <list> <!-- auch hier geben wir kein Profil frei --> </list> </property> </bean> <!-- In den Overrides wird nun das Attribute Query Profile für ausgewählte SP aktiviert --> <util:list id="shibboleth.RelyingPartyOverrides"> <bean parent="RelyingPartyByName" c:relyingPartyIds="#{{'https://trusted-sp1.example.org/shibboleth','https://trusted-sp2.example.org/shibboleth'}}"> <property name="profileConfigurations"> <list> <ref bean="SAML2.AttributeQuery" /> </list> </property> </bean> </util:list>
Attribute Resolver
Ein anfragender SP verwendet ein Attribut, anhand dessen ein*e Nutzer*in eindeutig identifiziert werden kann. Der SP verlangt vom Heimat-IdP z.B. das Attribut eduPersonUniqueId
oder Subject-Id
und richtet mit diesem Attribut als Identifier eine Attribute Query gegen die Attribute Authority. Der IdP muss in der Lage sein, dieses Attribut aufzulösen, d.h. auf einen „Principal“ abzubilden (siehe dazu weiter unten, c14n) und die für dieses Identität hinterlegten Attribute abzurufen und an den anfragenden SP zu senden. Hierbei handelt es sich i.d.R. um eduPersonEntitlement mit Community-spezifischen Werten. Diese Informationen werden meistens in einer SQL-Datenbank abgelegt und von hierzu berechtigten Angehörigen der betreffenden Forschungscommunity gepflegt.
Im Attribute Resolver sieht dies dann ungefähr wie folgt aus:
- /opt/shibboleth-idp/conf/attribute-resolver.xml
<!-- ... --> <AttributeDefinition id="eduPersonEntitlement" xsi:type="Simple"> <InputDataConnector ref="myDatabase" attributeNames="name" /> <!-- NB: bei Shibboleth IdP 4.x sind die AttributeEncoder ausgelagert! --> <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" friendlyName="myEduPersonEntitlement" encodeType="false"/> </AttributeDefinition> <!-- ... --> <DataConnector id="myDatabase" xsi:type="RelationalDatabase"> <BeanManagedConnection>shibboleth.MySQLDataSource</BeanManagedConnection> <QueryTemplate> <![CDATA[ SELECT entitlement from user u where u.subjectid='$resolutionContext.principal'; ]]> </QueryTemplate> <ResultCache expireAfterAccess="PT10S"/> </DataConnector> <!-- ... -->
Subject Canonicalization (c14n)
Wie oben bereits erwähnt, muss das zum Zweck einer Attribute Query verwendete Attribut vom IdP als Identifier definiert sein, da ansonsten ein Attribute Resolving nicht möglich ist. Die betreffenden Angaben werden in der folgenden Konfigurationsdatei gemacht. Wir ergänzen hier nur den URN für die SAML2 Subject-Id
.
- /opt/shibboleth-idp/conf/c14n/subject-c14n.xml
<!-- ... --> <!-- What SAML NameID formats do you want to support direct transformations for? --> <util:list id="shibboleth.NameTransformFormats"> <value>urn:oasis:names:tc:SAML:attribute:subject-id</value> <value>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</value> <value>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</value> <value>urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName</value> <value>urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName</value> <value>urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos</value> </util:list> <!-- hier lässt sich noch eine Whitelist von SPs definieren, für die die o.g. Einstellungen gelten sollen --> <bean id="shibboleth.NameTransformPredicate" parent="shibboleth.Conditions.RelyingPartyId"> <constructor-arg name="candidates"> <list> <value>https://trusted-sp1.example.org/shibboleth</value> <value>https://trusted-sp2.example.org/shibboleth</value> </list> </constructor-arg> </bean>
Konfiguration am Shibboleth SP
Damit ein Shibboleth SP Attribute Queries gegen eine bestimmte Attribute Authority ausführt, muss in der Konfiguration das Element <AttributeResolver>
gesetzt werden:
- /etc/shibboleth/shibboleth2.xml
<!-- ... --> <AttributeResolver type="SimpleAggregation" attributeId="subject-id" format="urn:oasis:names:tc:SAML:attribute:subject-id"> <Entity>https://trusted-attribute-authority.example.org/idp/shibboleth</Entity> <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" FriendlyName="eduPersonEntitlement"/> </AttributeResolver> <!-- ... -->
Über eine SP-seitige Attribute Filter Policy lässt sich festlegen, dass (z.B.) eduPersonEntitlement nur von der gewünschten Attribute Authority akzeptiert wird - und nicht von irgendwelchen anderen IdPs:
Alte Syntax:
- /etc/shibboleth/attribute-policy.xml
<!-- ... --> <afp:AttributeRule attributeID="eduPersonEntitlement"> <afp:PermitValueRule xsi:type="basic:AttributeIssuerString" value="https://trusted-attribute-authority.example.org/idp/shibboleth"/> </afp:AttributeRule> <!-- ... -->
Neue Syntax:
- /etc/shibboleth/attribute-policy.xml
<!-- ... --> <AttributeRule attributeID="eduPersonEntitlement"> <PermitValueRule xsi:type="Issuer" value="https://trusted-attribute-authority.example.org/idp/shibboleth"/> <AttributeRule> <!-- ... -->