Installation Shibboleth IdP 4.x

Laden Sie den Shibboleth IdP herunter, prüfen Sie die Signatur und entpacken Sie das Archiv. Die aktuelle IdP-Version findet sich stets unter https://shibboleth.net/downloads/identity-provider/latest/. Es empfiehlt sich, die Release Notes zu studieren.

root@idp:~# mkdir /opt/install
root@idp:~# wget -P /opt/install https://shibboleth.net/downloads/identity-provider/latest/shibboleth-identity-provider-4.0.0.tar.gz
root@idp:~# wget -P /opt/install https://shibboleth.net/downloads/identity-provider/latest/shibboleth-identity-provider-4.0.0.tar.gz.asc
root@idp:~# wget -P /opt/install https://shibboleth.net/downloads/PGP_KEYS
root@idp:~# gpg --import /opt/install/PGP_KEYS
root@idp:~# gpg --verify /opt/install/shibboleth-identity-provider-4.0.0.tar.gz.asc /opt/install/shibboleth-identity-provider-4.0.0.tar.gz
root@idp:~# tar -xzf /opt/install/shibboleth-identity-provider-4.0.0.tar.gz -C /opt/install

Das Installationsskript findet sich unter /opt/install/shibboleth-identity-provider-4.0.0/bin/install.sh. Beim Ausführen werden die wichtigsten Angaben zum IdP abgefragt, wie der FQDN und das Zielverzeichnis, in das der IdP installiert werden soll. Der Default hierfür ist /opt/shibboleth-idp.

root@idp:~# JAVA_HOME=/usr /opt/install/shibboleth-identity-provider-4.0.0/bin/install.sh 
Buildfile: /opt/install/shibboleth-identity-provider-4.0.0/bin/build.xml
 
install:
Source (Distribution) Directory (press <enter> to accept default): [/opt/install/shibboleth-identity-provider-4.0.0] ? 
 
Installation Directory: [/opt/shibboleth-idp] ? 
 
INFO [net.shibboleth.idp.installer.V4Install:151] - New Install.  Version: 4.0.0
Host Name: [192.168.0.5] ? 
idp-dev.hochschule-XY.de
INFO [net.shibboleth.idp.installer.V4Install:549] - Creating idp-signing, CN = idp-dev.hochschule-XY.de URI = https://idp-dev.hochschule-XY.de/idp/shibboleth, keySize=3072
INFO [net.shibboleth.idp.installer.V4Install:549] - Creating idp-encryption, CN = idp-dev.hochschule-XY.de URI = https://idp-dev.hochschule-XY.de/idp/shibboleth, keySize=3072
Backchannel PKCS12 Password:
Re-enter password: 
INFO [net.shibboleth.idp.installer.V4Install:592] - Creating backchannel keystore, CN = idp-dev.hochschule-XY.de URI = https://idp-dev.hochschule-XY.de/idp/shibboleth, keySize=3072
Cookie Encryption Key Password:
Re-enter password: 
INFO [net.shibboleth.idp.installer.V4Install:633] - Creating backchannel keystore, CN = idp-dev.hochschule-XY.de URI = https://idp-dev.hochschule-XY.de/idp/shibboleth, keySize=3072
INFO [net.shibboleth.utilities.java.support.security.BasicKeystoreKeyStrategyTool:166] - No existing versioning property, initializing...
SAML EntityID: [https://idp-dev.hochschule-XY.de/idp/shibboleth] ? 
 
Attribute Scope: [hochschule-XY.de] ? 
 
INFO [net.shibboleth.idp.installer.V4Install:433] - Creating Metadata to /opt/shibboleth-idp/metadata/idp-metadata.xml
INFO [net.shibboleth.idp.installer.BuildWar:71] - Rebuilding /opt/shibboleth-idp/war/idp.war, Version 4.0.0
INFO [net.shibboleth.idp.installer.BuildWar:80] - Initial populate from /opt/shibboleth-idp/dist/webapp to /opt/shibboleth-idp/webpapp.tmp
INFO [net.shibboleth.idp.installer.BuildWar:89] - Overlay from /opt/shibboleth-idp/edit-webapp to /opt/shibboleth-idp/webpapp.tmp
INFO [net.shibboleth.idp.installer.BuildWar:94] - Creating war file /opt/shibboleth-idp/war/idp.war
 
BUILD SUCCESSFUL
Total time: 52 seconds

Die beiden abgefragten Passwörter werden in die IdP-Config geschrieben, müssen also nicht notiert oder gemerkt werden. Wählen Sie daher möglichst starke Passwörter. Der IdP wird dann im angegebenen Zielverzeichnis installiert.

Nachdem die IdP-Files installiert sind, versucht der Tomcat, das Servlet automatisch zu starten (siehe Tomcat-Log). Das scheitert üblicherweise zunächst, da einige Dateien für den Tomcat-User nicht lesbar abgelegt wurden. Korrigieren Sie dies mit:

root@idp:~# chgrp -R $( getent group | grep ^tomcat | cut -d ":" -f1 ) /opt/shibboleth-idp/conf /opt/shibboleth-idp/credentials
root@idp:~# chmod -R g+r /opt/shibboleth-idp/conf /opt/shibboleth-idp/credentials

Außerdem müssen Log-Verzeichnis und Metadata-Verzeichnis für den Tomcat-User schreibbar gemacht werden:

root@idp:~# chown $( getent passwd | grep ^tomcat | cut -d ":" -f1 ):$( getent group | grep ^tomcat | cut -d ":" -f1 ) /opt/shibboleth-idp/logs /opt/shibboleth-idp/metadata

DFN-Monitoring

Das Monitoring-System des DFN-Vereins prüft standardmäßig die Status-Seite Ihres IdP und die Gültigkeitsdauer der SSL-Zertifikate im Webserver. Bitte geben Sie dafür die IdP-Status-Seite frei, wie hier beschrieben.

Zur Darstellung der Status-Seite muss

  • die Java Standard Tag Library (JSTL) im Tomcat bereit stehen (siehe Vorarbeiten).
  • die IdP Status URL für Ihr eigenes Netz und das Monitoring-Netz des DFN freigegeben werden. Damit das DFN-AAI-Monitoring nur auf die Status-Seite zugreifen kann, erstellen Sie eine separates <entry> Element mit der id StatusAccessByIPAddress:
/opt/shibboleth-idp/conf/access-control.xml
<beans ...>
   <!-- ... -->
    <util:map id="shibboleth.AccessControlPolicies">
        <entry key="AccessByIPAddress">
            <bean parent="shibboleth.IPRangeAccessControl"
                p:allowedRanges="#{ {'127.0.0.1/32', '::1/128', 'IHR-NETZ/IHRE-NETZMASKE'} }" />
        </entry>
        <entry key="StatusAccessByIPAddress">
            <bean parent="shibboleth.IPRangeAccessControl"
                p:allowedRanges="#{ {'127.0.0.1/32', '::1/128', 'IHR-NETZ/IHRE-NETZMASKE', '193.174.247.0/24', '2001:638:206:1::/64'} }" />
        </entry>
    </util:map>
   <!-- ... -->
</beans>

Dieser Eintrag muss dann noch in idp.properties der Status-Seite zugewiesen werden:

./conf/idp.properties
idp.status.accessPolicy=StatusAccessByIPAddress

Jetzt kann Tomcat neu gestartet werden:

root@idp:# systemctl restart tomcat9

Dabei lassen Sie am besten in drei Terminalfenstern den Tomcat- und die beiden relevanten IdP-Logs mitlaufen:

root@idp:# tail -f /var/log/tomcat9/catalina.DATUM.log
root@idp:# tail -f /opt/shibboleth-idp/logs/idp-process.log
root@idp:# tail -f /opt/shibboleth-idp/logs/idp-warn.log

Finden sich dort keine Fehler, ist der IdP erfolgreich gestartet. Überprüfen Sie, ob Sie die Status-Seite sehen können:

root@idp:# curl https://idp.hochschule-XY.de/idp/status

Vorbereitung der IdP-Metadaten

Einmalige Verwendung der idp-metadata.xml

Die Datei ./metadata/idp-metadata.xml wird in der DFN-AAI nicht verwendet. Sie wird später weder vom IdP aktualisiert, noch von anderen Teilnehmern benötigt. Sie wird hier ausschließlich für das initiale Einlesen in die Metadatenverwaltung editiert und verwendet!

Die Metadatenverwaltung der DFN-AAI kann die Metadaten Ihres IdP einlesen. Das verringert den Aufwand beim Eintragen der IdP-Metadaten. Wir empfehlen, vor dem initialen Registrieren des IdPs in ./metadata/idp-metadata.xml die fehlenden Einträge zu aktivieren, damit die Felder in der Metadatenverwaltung ausgefüllt werden können. Im Folgenden sind nur die relevanten Ausschnitte angegeben:

./metadata/idp-metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- In der folgenden Zeile muss das Ablaufdatum dieses Metadatensatz entfernt werden, z.B. validUntil="2020-04-06T13:35:26.645Z". -->
<EntityDescriptor  xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:shibmd="urn:mace:shibboleth:metadata:1.0" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:mdui="urn:oasis:names:tc:SAML:metadata:ui" xmlns:req-attr="urn:oasis:names:tc:SAML:protocol:ext:req-attr" entityID="https://web1.in.dfn.de/idp/shibboleth">
 
...
 
    <!-- Beschreibung und Logo aktivieren -->
        <Extensions>
            <shibmd:Scope regexp="false">hochschule-XY.de</shibmd:Scope>
            <mdui:UIInfo>
                <mdui:DisplayName xml:lang="en">XY University (Development)</mdui:DisplayName>
                <mdui:DisplayName xml:lang="de">Hochschule XY (Development)</mdui:DisplayName>
                <mdui:Description xml:lang="en">Identity Provider of XY University</mdui:Description>
                <mdui:Description xml:lang="de">Identity Provider der Hochschule XY</mdui:Description>
                <mdui:Logo height="16" width="16">https://idp-dev.hochschule-XY.de/favicon.ico</mdui:Logo>
                <mdui:Logo height="80" width="80">https://idp-dev.hochschule-XY.de/idp/images/logo.png</mdui:Logo>
            </mdui:UIInfo>
        </Extensions>
 
        ...
 
        <ArtifactResolutionService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="..."/>
 
        <!-- vier Single-Logout-Services aktiveren -->
        <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="..."/>
        <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="..."/>
        <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" Location="..."/>
        <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="..."/>
 
        <SingleSignOnService Binding="urn:mace:...
        <SingleSignOnService Binding="urn:oasis:...
        <SingleSignOnService Binding="urn:oasis:...
        <SingleSignOnService Binding="urn:oasis:...
 
        <!-- den fehlenden ECP-Endpoint hinzufügen -->
        <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://idp.hochschule-XY.de/idp/profile/SAML2/SOAP/ECP"/>
 
        <!-- die fehlenden NameID-Formate hinzufügen -->
        <NameIDFormat>urn:mace:shibboleth:1.0:nameIdentifier</NameIDFormat>
        <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
        <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat>
...
    </IDPSSODescriptor>
 
    <!-- Protocol-Support für SAML2-Queries im Attribute Authority-Descriptor aktivieren -->
    <AttributeAuthorityDescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
 
        ...
 
        <AttributeService Binding="urn:oasis:names:tc:SAML:1.0:bindings:SOAP-binding" Location="..."/>
        <!-- SAML2-Attribute-Service einkommentieren -->
        <AttributeService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="..."/>
 
        <!-- die fehlenden NameID-Formate hinzufügen -->
        <NameIDFormat>urn:mace:shibboleth:1.0:nameIdentifier</NameIDFormat>
        <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
        <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat>
 
    </AttributeAuthorityDescriptor>
 
</EntityDescriptor>
  • Zuletzt geändert: vor 5 Wochen