Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
de:shibidp3consent_dsgvo [2019/01/21 16:30]
Wolfgang Pempe [Attribute Release]
de:shibidp3consent_dsgvo [2019/04/17 17:11]
Wolfgang Pempe [Attribute Query und User Consent]
Zeile 30: Zeile 30:
  
 ==== Attribute Release ==== ==== Attribute Release ====
-Sofern die Übertragung von Attributen freiwillig, aufgrund einer Einwilligung der EndnutzerInnen erfolgt (DSGVO Art. 6.1 lit a), muss kein separater Flow definiert werden. ​+Sofern die Übertragung von Attributen ​ausschließlich ​freiwillig, aufgrund einer Einwilligung der EndnutzerInnen erfolgt (DSGVO Art. 6.1 lit a), muss kein separater Flow definiert werden. ​
  
 Hier ein Beispiel für ein entsprechendes Velocity Template: **[[de:​shibidp3consent_dsgvo_attribute_release|./​views/​intercept/​attribute-release.vm]] (Variante 1)**. \\ Hier ein Beispiel für ein entsprechendes Velocity Template: **[[de:​shibidp3consent_dsgvo_attribute_release|./​views/​intercept/​attribute-release.vm]] (Variante 1)**. \\
 {{:​de:​01_user_consent.png?​200|}} {{:​de:​01_user_consent.png?​200|}}
  
-[[https://​www.dfn.de/​fileadmin/​3Beratung/​Betriebstagungen/​bt69/​BT69_AAI_DS-AAI-Verfahren_Strobel_Moerike.pdf|Präsentation der FS Recht]]+==== Attribute Release aufgrund unterschiedlicher Rechtsgrundlagen ==== 
 +Wenn die Attributfreigabe fallweise aufgrund anderer Erlaubnisnormen erfolgt, bedarf es entsprechend angepasster [[https://​wiki.shibboleth.net/​confluence/​display/​IDP30/​ProfileInterceptConfiguration|Interceptor Flows]], die je nach anfragendem SP und ggf. Nutzergruppe aufgerufen werden. Siehe hierzu die Lösungsmodelle aus der Präsentation ​[[https://​www.dfn.de/​fileadmin/​3Beratung/​Betriebstagungen/​bt69/​BT69_AAI_DS-AAI-Verfahren_Strobel_Moerike.pdf|"​Datenschutzrechtliche Analyse das AAI-Verfahrens"​]] von der [[https://​www.dfn.de/​veranstaltungen/​bt/​vortraege/​69-betriebstagung-2509-bis-26092018/​|69. DFN-Betriebstagung]] und die Präsentation ​[[https://​download.aai.dfn.de/​ws/​2018_fub/​interceptor_dsgvo.pdf|"​Wir basteln einen Interceptor Flow"​]].  
 + 
 +Neben der angepassten Datei **[[de:​shibidp3consent_dsgvo_attribute_release|./​views/​intercept/​attribute-release.vm]]** (siehe oben) werden hierfür noch die Velocity Templates **attribute-info.vm** und **attribute-must.vm**,​ die von der selben **[[de:​shibidp3consent_dsgvo_attribute_release|Wiki Seite]]** heruntergeladen werden können (Varianten 2 und 3) und die ebenfalls in ''​./​views/​intercept''​ abgelegt werden.  
 + 
 +Weiterhin sind folgende Konfigurationsschritte erforderlich:​ 
 +\\ 
 + 
 +**1. Flow aus bestehendem Interceptor erstellen:​** 
 + 
 +.''/​system/​flows/​intercept/​attribute-release-beans.xml''​ und \\ 
 +''​./​system/​flows/​intercept/​attribute-release-flow.xml''​ \\ 
 +jeweils kopieren nach: \\ 
 +''​./​flows/​intercept/​attribute-info/​attribute-info-beans.xml''​ \\ 
 +''​./​flows/​intercept/​attribute-info/​attribute-info-flow.xml''​ \\ 
 +und \\ 
 +''​./​flows/​intercept/​attribute-must/​attribute-must-beans.xml''​ \\ 
 +''​./​flows/​intercept/​attribute-must/​attribute-must-flow.xml''​  
 + 
 +\\ 
 + 
 +**2. In den kopierten Dateien die Pfade anpassen:​** 
 + 
 +In den *-bean.xml Dateien die relativen Pfadangaben anpassen: 
 +   < ​    <​import resource="​../​../​conf/​audit-system.xml"​ /> 
 +   --- 
 +   > ​    <​import resource="​../​../​../​system/​conf/​audit-system.xml"​ /> 
 +Desgleichen in den *-flow.xml Dateien 
 +   < ​    <​bean-import resource="​attribute-release-beans.xml"​ /> 
 +   --- 
 +   > ​    <​bean-import resource="​attribute-info-beans.xml"​ /> 
 +bzw. 
 +   < ​    <​bean-import resource="​attribute-release-beans.xml"​ /> 
 +   --- 
 +   > ​    <​bean-import resource="​attribute-must-beans.xml"​ /> 
 + 
 +\\ 
 + 
 +**3. Dafür sorgen, dass Bezeichnung des Events im Log dem jeweils aufgerufenen Flow entspricht (--> Nachweispflichten)** 
 + 
 +<file xml ./​flows/​intercept/​attribute-info/​attribute-info-flow.xml>​  
 +     <​action-state id="​ExtractConsent">​ 
 +        <​evaluate expression="​ExtractConsent"​ /> 
 +        <​evaluate expression="'​AttributeReleaseInfo'"​ /> 
 +         
 +        <​transition on="​AttributeReleaseInfo"​ to="​AttributeReleaseInfo"​ /> 
 +    </​action-state>​ 
 + 
 +    <!-- Write '​AttributeReleaseInfo'​ event to consent audit log. --> 
 +    <​action-state id="​AttributeReleaseInfo">​ 
 +        <​evaluate expression="​PopulateConsentAuditContext"​ /> 
 +        <​evaluate expression="​WriteAttributeReleaseConsentAuditLog"​ /> 
 +        <​evaluate expression="'​proceed'"​ /> 
 +         
 +        <​transition on="​proceed"​ to="​TestForDoNotRememberConsent"​ /> 
 +    </​action-state>​ 
 +</​file>​ 
 + 
 +und 
 + 
 +<file xml ./​flows/​intercept/​attribute-must/​attribute-must-flow.xml>​ 
 +     <​action-state id="​ExtractConsent">​ 
 +        <​evaluate expression="​ExtractConsent"​ /> 
 +        <​evaluate expression="'​AttributeReleaseMust'"​ /> 
 +         
 +        <​transition on="​AttributeReleaseMust"​ to="​AttributeReleaseMust"​ /> 
 +    </​action-state>​ 
 + 
 +    <!-- Write '​AttributeReleaseMust'​ event to consent audit log. --> 
 +    <​action-state id="​AttributeReleaseMust">​ 
 +        <​evaluate expression="​PopulateConsentAuditContext"​ /> 
 +        <​evaluate expression="​WriteAttributeReleaseConsentAuditLog"​ /> 
 +        <​evaluate expression="'​proceed'"​ /> 
 +         
 +        <​transition on="​proceed"​ to="​TestForDoNotRememberConsent"​ /> 
 +    </​action-state>​ 
 +</​file>​ 
 + 
 +\\ 
 + 
 +**4. Neue Flows deklarieren und mit Activation Conditions verknüpfen** 
 + 
 +Dies geschieht am besten in **[[de:​shibidp3consent_dsgvo_profile-intercept|./​conf/​intercept/​profile-intercept.xml (Beispiel)]]**  
 + 
 +\\ 
 + 
 +**5. Neue Flows in der Relying Party Konfiguration dem SSO-Profil als Post Authentication Flows zuordnen** 
 + 
 +<file xml ./​conf/​relying-party.xml>​ 
 +    <bean id="​shibboleth.DefaultRelyingParty"​ parent="​RelyingParty">​ 
 +        <​property name="​profileConfigurations">​ 
 +            <​list>​ 
 +                <bean parent="​SAML2.SSO"​ p:​postAuthenticationFlows="#​{{'​terms-of-use',​ '​attribute-release',​ '​attribute-info',​ '​attribute-must'​}}"​ /> 
 +                <ref bean="​SAML2.ECP"​ /> 
 +                <ref bean="​SAML2.Logout"​ /> 
 +                <ref bean="​SAML2.AttributeQuery"​ /> 
 +                <ref bean="​SAML2.ArtifactResolution"​ /> 
 +            </​list>​ 
 +        </​property>​ 
 +    </​bean>​ 
 +</​file>​ 
 + 
 +\\ 
 + 
 +**HTML-Ansicht ''​attribute-info.vm''​**\\ 
 +{{:​de:​02_user_consent.png?​200|}} 
 + 
 +**HTML-Ansicht ''​attribute-must.vm''​**\\ 
 +{{:​de:​03_user_consent.png?​200|}} 
 + 
 +==== Attribute Query und User Consent ==== 
 +Ab Shibboleth IdP 3.4.3 kann bei Attribute Queries die jeweils letzte Entscheidung des Users zur Attributfreigabe berücksichtigt werden. Dies funktioniert natürlich nur, wenn die (virtuellen) Entscheidungen zur Attributfreigabe in einer IdP-seitigen Datenbank abgelegt werden und eine entsprechende Condition gesetzt ist. Siehe hierzu unter [[de:​shibidp3storage#​user_consent_zu_attributfreigabe_bei_attribute_queries_beruecksichtigen|Server-Side-Storage - User Consent]]. 
 + 
 +Damit Attribute Queries unter diesen Rahmenbedingungen auch im oben skizzierten Setup funktionieren,​ sind weitere Konfigurationsschritte erforderlich:​ 
 + 
 +Zunächst die Dateien \\ 
 +''​./​system/​flows/​intercept/​attribute-release-query-beans.xml''​ und \\ 
 +''​./​system/​flows/​intercept/​attribute-release-query-flow.xm''​ \\ 
 +in ein Verzeichnis namens \\ 
 +''​./​flows/​intercept/​attribute-release-query''​ \\ 
 +kopieren. 
 + 
 +Anschließend müssen diverse Anpassungen vorgenommen werden: 
 +<file xml ./​flows/​intercept/​attribute-release-query-beans.xml>​ 
 +    <!-- Use '​intercept/​attribute-release'​ as storage context. --> 
 + 
 +    <bean id="​AttributeReleaseStorageContextLookupStrategy"​ class="​com.google.common.base.Functions"​ 
 +        factory-method="​constant"​ c:​_0="​intercept/​attribute-release"​ /> 
 + 
 +    <bean id="​ReadAttributeReleaseConsentFromStorage"​ 
 +        class="​net.shibboleth.idp.consent.flow.storage.impl.ReadConsentFromStorage"​ scope="​prototype"​ 
 +        p:​storageKeyLookupStrategy-ref="​shibboleth.consent.UserAndRelyingPartyStorageKey"​ 
 +        p:​storageSerializer-ref="​shibboleth.consent.ConsentSerializer"​ 
 +        p:​storageContextLookupStrategy-ref="​AttributeReleaseStorageContextLookupStrategy"​ /> 
 +  
 +    <!-- Use '​intercept/​attribute-info'​ as storage context. --> 
 +    <bean id="​AttributeReleaseInfoStorageContextLookupStrategy"​ class="​com.google.common.base.Functions"​ 
 +        factory-method="​constant"​ c:​_0="​intercept/​attribute-info"​ /> 
 + 
 +    <bean id="​ReadAttributeReleaseInfoConsentFromStorage"​ 
 +        class="​net.shibboleth.idp.consent.flow.storage.impl.ReadConsentFromStorage"​ scope="​prototype"​ 
 +        p:​storageKeyLookupStrategy-ref="​shibboleth.consent.UserAndRelyingPartyStorageKey"​ 
 +        p:​storageSerializer-ref="​shibboleth.consent.ConsentSerializer"​ 
 +        p:​storageContextLookupStrategy-ref="​AttributeReleaseInfoStorageContextLookupStrategy"​ /> 
 + 
 +    <!-- Use '​intercept/​attribute-must'​ as storage context. --> 
 +    <bean id="​AttributeReleaseMustStorageContextLookupStrategy"​ class="​com.google.common.base.Functions"​ 
 +        factory-method="​constant"​ c:​_0="​intercept/​attribute-must"​ /> 
 + 
 +    <bean id="​ReadAttributeReleaseMustConsentFromStorage"​ 
 +        class="​net.shibboleth.idp.consent.flow.storage.impl.ReadConsentFromStorage"​ scope="​prototype"​ 
 +        p:​storageKeyLookupStrategy-ref="​shibboleth.consent.UserAndRelyingPartyStorageKey"​ 
 +        p:​storageSerializer-ref="​shibboleth.consent.ConsentSerializer"​ 
 +        p:​storageContextLookupStrategy-ref="​AttributeReleaseMustStorageContextLookupStrategy"​ /> 
 + 
 +</​file>​ 
 + 
 +In der Flow-Definition den Block nach ''<​!-- Read consent from storage -->''​ anpassen und erweitern:​ 
 +<file xml ./​flows/​intercept/​attribute-release-query-flow.xml>​ 
 +    <!-- Read consent from storage. --> 
 + 
 +    <​action-state id="​ReadConsentFromStorage">​ 
 +        <​evaluate expression="​ReadAttributeReleaseConsentFromStorage"​ /> 
 +        <​evaluate expression="'​proceed'"​ /> 
 + 
 +        <​transition on="​proceed"​ to="​ReadInfoConsentFromStorage"​ /> 
 +    </​action-state>​ 
 + 
 +    <​action-state id="​ReadInfoConsentFromStorage">​ 
 +        <​evaluate expression="​ReadAttributeReleaseInfoConsentFromStorage"​ /> 
 +        <​evaluate expression="'​proceed'"​ /> 
 + 
 +        <​transition on="​proceed"​ to="​ReadMustConsentFromStorage"​ /> 
 +    </​action-state>​ 
 + 
 +    <​action-state id="​ReadMustConsentFromStorage">​ 
 +        <​evaluate expression="​ReadAttributeReleaseMustConsentFromStorage"​ /> 
 +        <​evaluate expression="'​proceed'"​ /> 
 + 
 +        <​transition on="​proceed"​ to="​TestForReadGlobalAttributeConsentFromStorage"​ /> 
 +    </​action-state>​ 
 + 
 +    <​decision-state id="​TestForReadGlobalAttributeConsentFromStorage">​ 
 +        <if test="​attributeReleaseFlowDescriptor.globalConsentAllowed"​ 
 +            then="​ReadGlobalAttributeConsentFromStorage"​ else="​CheckPreviousConsents"​ /> 
 +    </​decision-state>​ 
 + 
 +    <​action-state id="​ReadGlobalAttributeConsentFromStorage">​ 
 +        <​evaluate expression="​ReadAttributeReleaseGlobalConsentFromStorage"​ /> 
 +        <​evaluate expression="'​proceed'"​ /> 
 + 
 +        <​transition on="​proceed"​ to="​TestForGlobalAttributeConsent"​ /> 
 +    </​action-state>​  
 +     
 +    <!-- hier noch der angepasste Pfad fürs Import-Statement der Attribute Release Bohne --> 
 +    <​bean-import resource="​../​../​../​system/​flows/​intercept/​attribute-release-beans.xml"​ /> 
 +</​file>​ 
 + 
 +Anschließend noch den flow in ''​./​conf/​intercept/​profile-intercept.xml''​ bekannt machen: 
 +<file xml ./​conf/​intercept/​profile-intercept.xml>​ 
 +    <bean id="​shibboleth.AvailableInterceptFlows"​ parent="​shibboleth.DefaultInterceptFlows"​ lazy-init="​true">​ 
 +        <​property name="​sourceList">​ 
 +            <list merge="​true">​ 
 +               <​!-- ... --> 
 +               <​bean id="​intercept/​attribute-release-query"​ parent="​shibboleth.consent.AttributeReleaseFlow"​ /> 
 +               <​!-- ... --> 
 +            </​list>​ 
 +        </​property>​ 
 +   </​bean>​ 
 +</​file>​
  • Zuletzt geändert: vor 7 Monaten