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:shibidp:config-storage [2021/08/17 11:44] Wolfgang Pempede:shibidp:config-storage [2023/07/31 12:10] (aktuell) – [Generierung und Speicherung] klarerer Hinweise auf randomness des Salt Silke Meyer
Zeile 18: Zeile 18:
  
 ==== Installation ==== ==== Installation ====
 +Im einfachsten Fall installieren Sie auf dem IdP einen lokalen Datenbank-Server. Sie können natürlich auch entfernte Datenbanken über das Netzwerk einbinden.
  
 <code bash> <code bash>
Zeile 32: Zeile 33:
 root@idp:~# systemctl restart tomcat9 root@idp:~# systemctl restart tomcat9
 </code> </code>
 +
 +Installieren Sie schließlich im IdP (ab Version 4.2!) das JDBC-Plugin:<code bash>root@idp:~# /opt/shibboleth-idp/bin/plugin.sh -I net.shibboleth.plugin.storage.jdbc</code>
  
 ==== Datenbank und Tabellen anlegen ==== ==== Datenbank und Tabellen anlegen ====
  
 Die Datenbank und der Datenbank-Benutzeraccount müssen manuell erstellt werden. Dann werden noch zwei Tabellen angelegt:  Die Datenbank und der Datenbank-Benutzeraccount müssen manuell erstellt werden. Dann werden noch zwei Tabellen angelegt: 
-  * ''StorageRecords'' für Sessions und User Consent-Informationen+  * ''StorageRecords'' für Sessions und User Consent-Informationen (die COLLATION muss case-sensitive sein, hier utf8_bin)
   * ''shibpid'' für die persistentIds   * ''shibpid'' für die persistentIds
  
Zeile 53: Zeile 56:
   version bigint(20) NOT NULL,   version bigint(20) NOT NULL,
   PRIMARY KEY (context, id)   PRIMARY KEY (context, id)
-);+COLLATE utf8_bin;
  
 mysql> CREATE TABLE IF NOT EXISTS shibpid ( mysql> CREATE TABLE IF NOT EXISTS shibpid (
Zeile 74: Zeile 77:
 </code> </code>
  
-==== JPAStorageService konfigurieren ====+==== JDBCStorageService konfigurieren ====
  
-Der DB-Zugriff wird über den [[https://wiki.shibboleth.net/confluence/display/IDP4/StorageConfiguration#StorageConfiguration-JPAStorageService|JPAStorageService]] gekapselt. Dieser wird in ''./conf/global.xml'' definiert. Diese Datei ist im Auslieferungszustand leer (bis auf Kommentare). Füllen Sie sie wie folgt:+Der DB-Zugriff wird über den [[https://shibboleth.atlassian.net/wiki/spaces/IDPPLUGINS/pages/2989096970/JDBCStorageService|JDBCStorageService]] hergestellt. Dieser wird in ''./conf/global.xml'' definiert. Diese Datei ist im Auslieferungszustand leer (bis auf Kommentare). Füllen Sie sie wie folgt:
  
 <file xml ./conf/global.xml> <file xml ./conf/global.xml>
Zeile 114: Zeile 117:
               p:validationQueryTimeout="5" />               p:validationQueryTimeout="5" />
  
-        <bean id="shibboleth.JPAStorageService+        <bean id="JDBCStorageService
-              class="org.opensaml.storage.impl.JPAStorageService"+              parent="shibboleth.JDBCStorageService"
               p:cleanupInterval="%{idp.storage.cleanupInterval:PT10M}"               p:cleanupInterval="%{idp.storage.cleanupInterval:PT10M}"
-              c:factory-ref="shibboleth.JPAStorageService.EntityManagerFactory" /> +              p:dataSource-ref="shibboleth.MySQLDataSource" />
- +
-        <bean id="shibboleth.JPAStorageService.EntityManagerFactory" +
-              class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> +
-            <property name="packagesToScan" value="org.opensaml.storage.impl"/> +
-            <property name="dataSource" ref="shibboleth.MySQLDataSource"/> +
-            <property name="jpaVendorAdapter" ref="shibboleth.JPAStorageService.JPAVendorAdapter"/> +
-            <property name="jpaDialect"> +
-                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> +
-            </property> +
-        </bean> +
- +
-        <bean id="shibboleth.JPAStorageService.JPAVendorAdapter" +
-              class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" +
-              p:generateDdl="true" +
-              p:database="MYSQL" +
-              p:databasePlatform="org.hibernate.dialect.MySQL5Dialect" /> +
 </beans> </beans>
 </file> </file>
Zeile 177: Zeile 163:
 <file properties /opt/shibboleth-idp/conf/saml-nameid.properties> <file properties /opt/shibboleth-idp/conf/saml-nameid.properties>
 idp.persistentId.sourceAttribute = uid idp.persistentId.sourceAttribute = uid
-# idp.persistentId.useUnfilteredAttributes true+BASE64 will match V2 values, we recommend BASE32 encoding for new installs. 
 +idp.persistentId.encoding BASE32
  
 # To use a database, use shibboleth.StoredPersistentIdGenerator # To use a database, use shibboleth.StoredPersistentIdGenerator
Zeile 186: Zeile 173:
 </file> </file>
  
-Der Salt-Hash, mit dem die persistentIds generiert werden, wird aus Sicherheitsgründen in der zugriffsbeschränkten Passwortdatei ''./credentials/secrets.properties'' hinterlegt. Er sollte möglichst lang und beliebig sein und mit niemandem geteilt werden.+Der Salt-Hash, mit dem die persistentIds generiert werden, wird aus Sicherheitsgründen in der zugriffsbeschränkten Passwortdatei ''./credentials/secrets.properties'' hinterlegt. Er sollte möglichst beliebig, also zufällig generiert, und möglichst lang sein und mit niemandem geteilt werden.
  
 <file properties /opt/shibboleth-idp/credentials/secrets.properties> <file properties /opt/shibboleth-idp/credentials/secrets.properties>
 +# Bitte durch einen zufällig generierten Salt ersetzen!
 idp.persistentId.salt = my-very-very-long-hash idp.persistentId.salt = my-very-very-long-hash
  
Zeile 263: Zeile 251:
 ===== Session-Informationen und User Consent ===== ===== Session-Informationen und User Consent =====
  
-Nachdem Datenbankverbindung und persistentId aktiviert sind, können diese nun für die Speicherung von Session- und User Consent-Informationen genutzt werden. Dadurch wird als netter Nebeneffekt auch [[:de:shibidp3slo|SingleLogout-Unterstützung]] im IdP ermöglicht.+Nachdem Datenbankverbindung und persistentId aktiviert sind, können diese nun für die Speicherung von Session- und User Consent-Informationen genutzt werden. Dadurch wird als netter Nebeneffekt auch [[de:shibidp:config-slo|SingleLogout-Unterstützung]] im IdP ermöglicht.
  
 <file properties /opt/shibboleth-idp/conf/idp.properties> <file properties /opt/shibboleth-idp/conf/idp.properties>
 ... ...
 # Set to "shibboleth.StorageService" for server-side storage of user sessions # Set to "shibboleth.StorageService" for server-side storage of user sessions
-idp.session.StorageService = shibboleth.JPAStorageService+idp.session.StorageService = JDBCStorageService
  
 # Set to "shibboleth.StorageService" or custom bean for alternate storage of consent # Set to "shibboleth.StorageService" or custom bean for alternate storage of consent
-idp.consent.StorageService = shibboleth.JPAStorageService+idp.consent.StorageService = JDBCStorageService
  
 # Set to "shibboleth.consent.AttributeConsentStorageKey" to use an attribute # Set to "shibboleth.consent.AttributeConsentStorageKey" to use an attribute
Zeile 345: Zeile 333:
  
 Falls die persistentId nur an ausgewählte SPs übertragen werden soll, so finden sich [[de:shibidp:config-pidspecials|hier einige Beispiele]]. Falls die persistentId nur an ausgewählte SPs übertragen werden soll, so finden sich [[de:shibidp:config-pidspecials|hier einige Beispiele]].
 +
 +===== Umstellung auf SAML pairwise-id =====
 +Die persistentID und das funktionsanaloge, als deprecated geltende Attribut [[de:common_attributes#a11|eduPersonTargetedID]] sollen in Zukunft von der [[de:common_attributes#a17|SAML pairwise-id]] ([[de:shibidp:config-attributes-aaiplus|Konfigurationsbeispiel]]) abgelöst werden. Die erlaubten Werte der pairwise-id unterscheiden sich allerdings von denen der persistentID (siehe die [[https://docs.oasis-open.org/security/saml-subject-id-attr/v1.0/saml-subject-id-attr-v1.0.html|Spezifikation]]):
 +  * Die pairwise-id hat einen Scope.
 +  * Die Werte werden mit BASE32 statt mit BASE64 kodiert. Sie dürfen also weniger Zeichen enthalten als alte persistentIDs und sind case-insensitive zu behandeln.
 +
 +Für die Umstellung der persistentID auf die pairwise-id gibt es keinen perfekten Weg. Wir empfehlen folgendes Vorgehen, mit dem Sie vermeiden, alle Service Provider die persistentIDs bestehender Accounts umschreiben zu lassen:
 +  * Ändern Sie im IdP das Encoding der persistentIDs auf BASE32. Damit erreichen Sie, dass **//neu generierte// persistentIDs** so kodiert werden, dass sie als Basis für standardkonforme pairwise-ids verwendet werden können.<file properties /opt/shibboleth-idp/conf/saml-nameid.properties>
 +# BASE64 will match V2 values, we recommend BASE32 encoding for new installs.
 +idp.persistentId.encoding = BASE32</file>
 +  * Setzen Sie auch beim entsprechenden Data Connector in ''conf/attribute-resolver.xml'' das Encoding auf BASE32 wie in diesem Beispiel (siehe auch [[https://shibboleth.atlassian.net/wiki/spaces/IDP4/pages/1265631589/StoredIdConnector|StoredIdConnector im Shibboleth-Wiki]]):<file xml /opt/shibboleth-idp/conf/attribute-resolver.xml>
 +    <DataConnector id="StoredId"
 +        xsi:type="StoredId"
 +        generatedAttributeID="persistentID"
 +        salt="%{idp.persistentId.salt}"
 +        encoding="BASE32"
 +        queryTimeout="0">
 +        <InputAttributeDefinition ref="%{idp.persistentId.sourceAttribute}" />
 +        <BeanManagedConnection>shibboleth.MySQLDataSource</BeanManagedConnection>
 +    </DataConnector></file>
 +  * Bereits **bestehende persistentIDs** lassen Sie in der Datenbank bestehen, wie sie sind. Aus diesen persistentIDs werden dann zwar nicht standardkonforme SAML pairwise-ids gebildet. Wir gehen allerdings nicht davon aus, dass Service Provider, die die pairwise-id entgegennehmen, prüfen, ob der Wert vor dem Scope standardkonform ist.
 +  * Übermitteln Sie für die pairwise-id den Wert, der persistentID **mit Scope**.
  
 {{tag>idp4 tutorial persistentid storage datenbank session included-in-ansible}} {{tag>idp4 tutorial persistentid storage datenbank session included-in-ansible}}
  • Zuletzt geändert: vor 3 Jahren