SAML2.0 - Atlassian Shibboleth Service Provider 3

Startseite > SAML2.0 - Atlassian Shibboleth Service Provider 3

Installation

Zur allgemeinen Installation befolgen Sie bitte die Service Provider Anweisungen des Shibboleth Consortium.

Am ZIH wird der Betrieb des Atlassian Service Provider unter Debian Linux aufgesetzt. Durch den Support des Shibboleth Consortium bieten die Debian Paketquellen das shibboleth-sp-common Paket an, mit dem die Installation ermöglicht wird.

Die Installation besteht aus dem Service Provider shibd und einen geeigneten Webserver z.B. Apache2 oder Nginx. Nehmen Sie die folgenden Umsetzungen als root vor.

shibd

Der shibd Service Provider ist die Voraussetzung zur Verarbeitung der Identity Provider Daten.

login@server:~$ apt update && apt install shibboleth-sp-utils

Prüfen Sie die erfolgte Installation mit:

login@server:~$ shibd -v
shibboleth 3.4.1

Apache2

Die Installation des Apache2 Webserver erfordert den Webserver selbst sowie das geeignete Shibboleth Modul.

login@server:~$ apt update && apt install apache2 libapache2-mod-shib

Nginx

Für die Installation des Nginx Webservers reicht das Hauptpaket zu.

login@server:~$ apt update && apt install nginx

Konfiguration

Zur Konfiguration des Service Providers sind folgende Punkte zu beachten:

  1. Festlegung einer weltweiten entityId als URI (siehe entityId)
  2. Besitz eines SAML Zertifikates für den Datenaustausch (siehe SAML Zertifikat oder SAML Zertifikat erstellen)
  3. Kenntnisse der SingleSignOn und SingleLogOut Endpunkte (siehe SingleSignOn und SingleLogOut)
  4. Einbinden des Service Providers in den Webserver

Die Punkte 1-3 werden in der shibd - shibboleth2.xml konfiguriert. Für den Punkt 4 bieten wir ein Beispiel für Apache2 oder Nginx an

shibd - shibboleth2.xml

Die Konfiguration des shibd erfolgt über die /etc/shibboleth/shibboleth2.xml Datei.

<SPConfig xmlns="urn:mace:shibboleth:3.0:native:sp:config"
    xmlns:conf="urn:mace:shibboleth:3.0:native:sp:config"
    clockSkew="180">

    <OutOfProcess tranLogFormat="%u|%s|%IDP|%i|%ac|%t|%attr|%n|%b|%E|%S|%SS|%L|%UA|%a" />

    <!--
    By default, in-memory StorageService, ReplayCache, ArtifactMap, and SessionCache
    are used. See example-shibboleth2.xml for samples of explicitly configuring them.
    -->

    <!-- The ApplicationDefaults element is where most of Shibboleth's SAML bits are defined. -->
    <ApplicationDefaults entityID="https://sp.example.org/shibboleth"
        REMOTE_USER="eppn subject-id pairwise-id persistent-id"
        cipherSuites="DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1">

        <!--
        Controls session lifetimes, address checks, cookie handling, and the protocol handlers.
        Each Application has an effectively unique handlerURL, which defaults to "/Shibboleth.sso"
        and should be a relative path, with the SP computing the full value based on the virtual
        host. Use of TLS is now assumed because browsers are enforcing it due to SameSite
        restrictions. Note that while we default checkAddress to "false", this makes an assertion
        stolen in transit easier for attackers to misuse.
        -->
       <Sessions lifetime="28800" timeout="3600" relayState="ss:mem"
                  checkAddress="false" handlerSSL="true" cookieProps="https"
                  redirectLimit="exact">

            <!--
            Configures SSO for a default IdP. To properly allow for >1 IdP, remove
            entityID property and adjust discoveryURL to point to discovery service.
            You can also override entityID on /Login query string, or in RequestMap/htaccess.
            -->
            <SSO entityID="https://idp.example.org/idp/shibboleth"
                 discoveryProtocol="SAMLDS" discoveryURL="https://ds.example.org/DS/WAYF">
              SAML2
            </SSO>

            <!-- SAML and local-only logout. -->
            <Logout>SAML2 Local</Logout>

            <!-- Administrative logout. -->
            <LogoutInitiator type="Admin" Location="/Logout/Admin" acl="127.0.0.1 ::1" />

            <!-- Extension service that generates "approximate" metadata based on SP configuration. -->
            <Handler type="MetadataGenerator" Location="/Metadata" signing="false"/>

            <!-- Status reporting service. -->
            <Handler type="Status" Location="/Status" acl="127.0.0.1 ::1"/>

            <!-- Session diagnostic service. -->
            <Handler type="Session" Location="/Session" showAttributeValues="false"/>

            <!-- JSON feed of discovery information. -->
            <Handler type="DiscoveryFeed" Location="/DiscoFeed"/>
        </Sessions>

        <!--
        Allows overriding of error template information/filenames. You can
        also add your own attributes with values that can be plugged into the
        templates, e.g., helpLocation below.
        -->
        <Errors supportContact="root@localhost"
            helpLocation="/about.html"
            styleSheet="/shibboleth-sp/main.css"/>

        <!-- Example of locally maintained metadata. -->
        <!--
        <MetadataProvider type="XML" validate="true" path="partner-metadata.xml"/>
        -->

        <!-- Example of remotely supplied batch of signed metadata. -->
        <!--
        <MetadataProvider type="XML" validate="true"
                    url="http://federation.org/federation-metadata.xml"
              backingFilePath="federation-metadata.xml" maxRefreshDelay="7200">
            <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/>
            <MetadataFilter type="Signature" certificate="fedsigner.pem" verifyBackup="false"/>
            <DiscoveryFilter type="Exclude" matcher="EntityAttributes" trimTags="true"
              attributeName="http://macedir.org/entity-category"
              attributeNameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
              attributeValue="http://refeds.org/category/hide-from-discovery" />
        </MetadataProvider>
        -->

        <!-- Example of remotely supplied "on-demand" signed metadata. -->
        <!--
        <MetadataProvider type="MDQ" validate="true" cacheDirectory="mdq"
                    baseUrl="http://mdq.federation.org" ignoreTransport="true">
            <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/>
            <MetadataFilter type="Signature" certificate="mdqsigner.pem" />
        </MetadataProvider>
        -->

        <!-- Map to extract attributes from SAML assertions. -->
        <AttributeExtractor type="XML" validate="true" reloadChanges="false" path="attribute-map.xml"/>

        <!-- Default filtering policy for recognized attributes, lets other data pass. -->
        <AttributeFilter type="XML" validate="true" path="attribute-policy.xml"/>

        <!-- Simple file-based resolvers for separate signing/encryption keys. -->
        <CredentialResolver type="File" use="signing"
            key="sp-key.pem" certificate="sp-cert.pem"/>
        <CredentialResolver type="File" use="encryption"
            key="sp-key.pem" certificate="sp-cert.pem"/>

    </ApplicationDefaults>

    <!-- Policies that determine how to process and authenticate runtime messages. -->
    <SecurityPolicyProvider type="XML" validate="true" path="security-policy.xml"/>

    <!-- Low-level configuration about protocols and bindings available for use. -->
    <ProtocolProvider type="XML" validate="true" reloadChanges="false" path="protocols.xml"/>

</SPConfig>

Passen Sie diese Datei entsprechend der nachfolgenden Punkte an. Im Anschluss ist es nötig den shibd erneut zu starten mit:

login@server:~$ systemctl restart shibd.service

Eine Prüfung der Konfiguration können Sie mit folgendem Befehl vornehmen:

login@server:~$ shibd -t

Setzen der entityId

Setzen Sie unter https://sp.example.org/shibboleth Ihre entityId, die zukünftig für Ihren Service Provider verwendet werden soll. Beachten Sie bitte auch die Hinweise zur entityId.

    <ApplicationDefaults entityID="https://sp.example.org/shibboleth"
        REMOTE_USER="eppn subject-id pairwise-id persistent-id"
        cipherSuites="DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1">

Sicherheitseinstellung für Shibboleth Session

Passen Sie die Shibboleth Session Angaben an Ihre Anwendung an. So erhöhen Sie die Sicherheit der Nutzer.

       <Sessions lifetime="28800" timeout="3600" relayState="ss:mem"
                  checkAddress="false" handlerSSL="true" cookieProps="https"
                  redirectLimit="exact">

Folgende Optionen wären denkbar:

Name Wert Beschreibung
consistentAddress [true false] IP-Adresse des Nutzers darf sich während der Session nicht ändern (Verhinderung von Man-In-The-Middle Attacken)
cookieProps [http https] Cookies sind nur via HTTPS zulässig
lifetime Integer Gültigkeit der Session in Sekunden
redirectLimit exact Redirect nur zum aufgerufenen Protokoll/Host/Port (Missbrauch des SPs für Phishing-Angriffe verhindern)
handlerSSL true Übertragung erfolgt per SSL
checkAddress [true false] Prüfe ob IP-Adresse identisch mit der SAML-Assertion des IdP ist

Festlegen der Identity Provider

Legen Sie den IdP mit https://idp.example.org/idp/shibboleth fest. Entfernen Sie die entityId="...", so wird die Discovery-Funktion wirksam. Diese erfolgt über den Endpunkt Ihres Service Providers. Setzen Sie für ds.example.org Ihre Domain ein.

Test https://idp3-test.tu-dresden.de/idp/shibboleth
Produktion https://idp.tu-dresden.de/idp/shibboleth
            <SSO entityID="https://idp.example.org/idp/shibboleth"
                 discoveryProtocol="SAMLDS" discoveryURL="https://ds.example.org/DS/WAYF">
              SAML2
            </SSO>

Single Logout (SLO)

            <Logout>SAML2 Local</Logout>

Die Reihenfolge gibt an, welches Verfahren vom SP beim Logout initiiert wird.

SAML2 beendet die lokale Session am SP und leitet die Nutzenden zum weiteren Logout-Vorgang an den IdP weiter
Local beendet "nur" die lokale Session am SP

Hinweis: Bei Local-Logout wird empfohlen dem Nutzer einen Hinweis zu geben, dass er womöglich bei weiteren Diensten eingeloggt sein könnte!

IdP Metadaten einbinden

Zum Aufbau der Vertrauensstellung ist es nötig die Metadaten des/der IdPs zu kennen. Die DFN-AAI hält unter https://doku.tid.dfn.de/de:metadata die föderierten IdPs bereit.

Test-IdPs http://www.aai.dfn.de/metadata/dfn-aai-test-metadata.xml
Produktive-IdPs http://www.aai.dfn.de/metadata/dfn-aai-idp-metadata.xml

Der manuelle Bezug zum Download der IdP Metadaten der Technischen Universität Dresden ist hier möglich:

Test https://idp3-test.tu-dresden.de/idp/shibboleth
Produktion https://idp.tu-dresden.de/idp/shibboleth

Folgende Anpassungen wären für produktive IdPs vorstellbar. Diese bezieht die föderierten IdPs der DFN-AAI. Diese Angaben sind signiert mit dem Zertifikat https://www.aai.dfn.de/metadata/dfn-aai.pem. Von allen föderierten IdPs wird ein Filter auf den IdP der Technischen Universität Dresden und der Hochschule für Technik und Wirtschaft Dresden verwendet.

        <!-- Example of locally maintained metadata. -->
        <!--
        <MetadataProvider type="XML" validate="true" path="partner-metadata.xml"/>
        -->

        <MetadataProvider type="XML" validate="true"
                    url="http://www.aai.dfn.de/metadata/dfn-aai-idp-metadata.xml"
              backingFilePath="dfn-aai-metadata.xml" maxRefreshDelay="7200">
            <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/>
            <MetadataFilter type="Signature" certificate="https://www.aai.dfn.de/metadata/dfn-aai.pem" verifyBackup="false"/>
            <MetadataFilter type="Include">
              <Include>https://idp.tu-dresden.de/idp/shibboleth</Include>
              <Include>https://idp.htw-dresden.de/idp/shibboleth</Include>
            </MetadataFilter>
        </MetadataProvider>

SAML Zertifikat festlegen

Die SAML Kommunikation mit dem IdP der Technischen Universität Dresden findet ausschließlich signiert (signing) und verschlüsselt (encryption) statt. Es wird empfohlen für beide Varianten dasselbe SAML Zertifikat zu verwenden. Mit sp-cert.pem und sp-key.pem legen Sie fest, wo der shibd die Zertifikate findet. Wichtig: Der shibd benötigt Leseberechtigungen auf diese Dateien!

        <!-- Simple file-based resolvers for separate signing/encryption keys. -->
        <CredentialResolver type="File" use="signing"
            key="sp-key.pem" certificate="sp-cert.pem"/>
        <CredentialResolver type="File" use="encryption"
            key="sp-key.pem" certificate="sp-cert.pem"/>

Hinweis: Das Debian Paket shibboleth-sp-utils besitzt ein Tool shib-keygen mit dem ein eigenes SAML Zertifikat erstellt werden kann. Möchten Sie die Konfiguration sp-cert.pem und sp-key.pem behalten, so können Sie Ihr SAML Zertifikat für ein Jahr mit folgendem Aufruf generieren:

login@server:~$ shib-keygen -e https://mein-sp.de/shibboleth -y 1 -h https://mein-sp.de -f

Zusätzliche Informationen in den Metadaten

Zur Ergänzung weiterer Informationen in den Metadaten kann der <Handler>-Tag vom Typ MetadataGenerator gesetzt werden. Erweitern Sie dazu das Tag SPConfig mit den Attributen xmlns:mdui="urn:oasis:names:tc:SAML:metadata:ui" und xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata".

<SPConfig xmlns="urn:mace:shibboleth:3.0:native:sp:config"
    xmlns:conf="urn:mace:shibboleth:3.0:native:sp:config"
    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
    xmlns:mdui="urn:oasis:names:tc:SAML:metadata:ui"
    clockSkew="180">

  <ApplicationDefaults ...>
    <Sessions ...>

			<!-- Extension service that generates "approximate" metadata based on SP configuration. -->
			<Handler type="MetadataGenerator" Location="/Metadata" signing="false">
				<mdui:UIInfo>
					<mdui:DisplayName xml:lang="de">Server ZIH</mdui:DisplayName>
					<mdui:DisplayName xml:lang="en">Server ZIH</mdui:DisplayName>
					<mdui:Description xml:lang="de">Portal für Angestellte ...</mdui:Description>
					<mdui:Description xml:lang="en">Portal for employees ...</mdui:Description>
					<mdui:Logo height="15" width="16">https://mein-sp.de/images/pic.png</mdui:Logo>
					<mdui:Logo height="140" width="146">https://mein-sp.de/images/big_pic.png</mdui:Logo>
					<mdui:InformationURL xml:lang="de">https://mein-sp.de/</mdui:InformationURL>
					<mdui:InformationURL xml:lang="en">https://mein-sp.de/</mdui:InformationURL>
					<mdui:PrivacyStatementURL xml:lang="de">https://mein-sp.de/impressum</mdui:PrivacyStatementURL>
					<mdui:PrivacyStatementURL xml:lang="en">https://mein-sp.de/impressum</mdui:PrivacyStatementURL>
				</mdui:UIInfo>

				<md:AttributeConsumingService index="1">
					<md:ServiceName xml:lang="de">Server ZIH</md:ServiceName>
					<md:ServiceName xml:lang="en">Server ZIH</md:ServiceName>
					<md:ServiceDescription xml:lang="de">Portal für Angestellte ...</md:ServiceDescription>
					<md:ServiceDescription xml:lang="en">Portal for employees ...</md:ServiceDescription>
					<md:RequestedAttribute FriendlyName="eduPersonScopedAffiliation" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
					<md:RequestedAttribute FriendlyName="mail" Name="urn:oid:0.9.2342.19200300.100.1.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
				</md:AttributeConsumingService>

				<md:Organization>
					<md:OrganizationName xml:lang="de">TU Dresden</md:OrganizationName>
					<md:OrganizationName xml:lang="en">TU Dresden</md:OrganizationName>
					<md:OrganizationDisplayName xml:lang="de">Technische Universität Dresden</md:OrganizationDisplayName>
					<md:OrganizationDisplayName xml:lang="en">Technische Universität Dresden</md:OrganizationDisplayName>
					<md:OrganizationURL xml:lang="de">https://www.tu-dresden.de</md:OrganizationURL>
					<md:OrganizationURL xml:lang="en">https://www.tu-dresden.de</md:OrganizationURL>
				</md:Organization>

				<md:ContactPerson contactType="support">
					<md:GivenName>Service</md:GivenName>
					<md:SurName>Desk</md:SurName>
					<md:EmailAddress>servicedesk@tu-dresden.de</md:EmailAddress>
				</md:ContactPerson>

				<md:ContactPerson contactType="technical">
					<md:GivenName>Technischer</md:GivenName>
					<md:SurName>Ansprechpartner</md:SurName>
					<md:EmailAddress>techniker@tu-dresden.de</md:EmailAddress>
				</md:ContactPerson>

				<md:ContactPerson contactType="administrative">
					<md:GivenName>Administrativer</md:GivenName>
					<md:SurName>Ansprechpartner</md:SurName>
					<md:EmailAddress>admin@tu-dresden.de</md:EmailAddress>
				</md:ContactPerson>
			</Handler>

Metadaten generieren

Der shibd bietet einen Metadatengenerator an. Dieser ist per Standard unter dem Endpunkt /Metadata abrufbar. Je nachdem wie Sie Ihren Webserver konfigurieren, ist es möglich Ihre Metadaten zum Download anzubieten z.B. https://mein-sp.de/Shibboleth.sso/Metadata.

            <!-- Extension service that generates "approximate" metadata based on SP configuration. -->
            <Handler type="MetadataGenerator" Location="/Metadata" signing="false"/>

Eine Alternative bietet das Tool shib-metagen an, mit dem die Metadaten generiert werden.

login@server:~$ shib-metagen -2 -L -c /etc/shibboleth/sp-cert.pem -h https://mein-sp.de -e https://mein-sp.de/shibboleth -a Max/Mustermann/max.mustermann@mein-sp.de
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="https://mein-sp.de/shibboleth">
  <md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:KeyDescriptor>
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>
MIIEJDCCAoygAwIBAgIUMlFg3PvMj7p/gyEjfgq9VNSpLkIwDQYJKoZIhvcNAQEL
BQAwHzEdMBsGA1UEAxMUaHR0cHM6Ly9tZWluLXRlc3QuZGUwHhcNMjUwMzI4MTU0
NDE5WhcNMjYwMzI4MTU0NDE5WjAfMR0wGwYDVQQDExRodHRwczovL21laW4tdGVz
dC5kZTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBANGA+7YSxE1u2N/p
2vK/PNg26ORRTMtpi46KnE2L0EM7jNhz81p4zXY/72hjuphKljHjJR2xPyL5Uxg2
XuD/28MhiUA+rfM9eoIre69qBEXm9AWJPaL6L833/EhcYkjUBgK5q9xpH7uWxdu2
v7n1zwdjs86DZ87LB3mslk5VUFvbGD9g03QM5f87mlLPg4pXg1RGbpFd1qxwZDVN
NTpL1uKTn04raWQj7i/TBOslbXhFONYCFtENkdd9r0Kvv89o7fDOrk7ty6ARHqkd
f4uMoXeMHrRNvMzivSvHZRjAitfdo2yU82xHrruQZaqp8SnTUdtZi8Cg+fLwjTKt
DIye+Z86kNeyBOY93sCnthFQmzykTU0jR9lvFFxqXgcRDnmi8g0E8bHC5TXueJ+m
JjINZGcDFEeIRDr2z+AoDxx5vo0Z3MNUp2A3CqpRfdsZNswISK5eHCWPXHkBKPNG
mI+gh2a4UWdp7g3t1w7v5vGFJRxhXq62FGcv1Tb+Sj+r/KkdwQIDAQABo1gwVjA1
BgNVHREELjAsghRodHRwczovL21laW4tdGVzdC5kZYYUaHR0cHM6Ly9tZWluLXRl
c3QuZGUwHQYDVR0OBBYEFEEdnGViCUSXdORVTSg1cZt2yYAAMA0GCSqGSIb3DQEB
CwUAA4IBgQAtEFfyi3W0yT2X/F8invf9J20P1baQ4nEXBZ+1GWzKk3QLdrsVdVfJ
hAoRN2AebidtrjT4XKZDNVV3PQoroonvNdWW3BmP8cp2rIdto7RYwGGyqAgsY8o9
OoHP4NBC3Ri3w2qWPxhYrAeqOwB9Ja3ThJZTR7bXexvmxbyRGoEDYk7uwZ5FIYrW
hy4ui8TzS/t5gJCZ30cWiq3rJ337QZbaCwdH0wA9AaxZMxLuDcEbvZz5SpBWijs3
XGWDi0TB4TqVZ12HSgRObZPCDTzCnY+2bz2lXLDU4j5pcutIHeCr9KrWnoHSvUTP
vrYCVMqAyd1D0HaBLMXi4tnRwRFunoGGIrRhDmQ29p8Egtf6x+wkptBH5VdSW36N
VVUUY8/g0G/8ftjAAcuPh2Z7x/CUY36pre2LE1HryepOup7CSGSCl7oqDrLzReAp
K3DjLmlKUhI49TkKC6V81ZjCgbJJIXVwDRnnFKjDaTqFYClIN3HbV2Sn3J0I8aSI
nIcwxEMBD8g=
          </ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://https://mein-sp.de/Shibboleth.sso/SLO/SOAP"/>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://https://mein-sp.de/Shibboleth.sso/SLO/Redirect"/>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://https://mein-sp.de/Shibboleth.sso/SLO/POST"/>
    <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://https://mein-sp.de/Shibboleth.sso/SLO/Artifact"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://https://mein-sp.de/Shibboleth.sso/SAML2/POST" index="1"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" Location="https://https://mein-sp.de/Shibboleth.sso/SAML2/POST-SimpleSign" index="2"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://https://mein-sp.de/Shibboleth.sso/SAML2/Artifact" index="3"/>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:PAOS" Location="https://https://mein-sp.de/Shibboleth.sso/SAML2/ECP" index="4"/>
  </md:SPSSODescriptor>
  <md:ContactPerson contactType="administrative">
    <md:GivenName>Max</md:GivenName>
    <md:SurName>Mustermann</md:SurName>
    <md:EmailAddress>max.mustermann@mein-sp.de</md:EmailAddress>
  </md:ContactPerson>
</md:EntityDescriptor>

Apache2

Mit folgenden Schritten nehmen Sie eine Anpassung Ihrer Apache2 Konfiguration vor und schützen den Endpunkt /secure mit einer Shibboleth Authentifizierung.

  1. shibd Modul einbinden
  2. Anpassen der vHosts

Im Anschluss den Apache2 Webserver neustarten.

# Konfiguration auf Korrektheit prüfen
login@server:~$ httpd -t
Syntax OK

# Apache neu starten
login@server:~$ systemctl restart apache2.service

shibd Modul einbinden

Mit folgendem Befehl laden Sie das shibd Modul in den Apache2, sofern dies während der Installation nicht schon vorgenommen wurde.

login@server:~$ a2enmod shib
Module shib already enabled

Folgende Konfiguration sollte nun verfügbar sein:

login@server:~$ cat /etc/apache2/mods-enabled/shib.load
LoadModule mod_shib /usr/lib/apache2/modules/mod_shib.so

Anpassen der vHosts

Konfigurieren Sie Ihre vHosts unter /etc/apache2/sites-available/. In unserem Beispiel wird die Datei /etc/apache2/sites-available/000-default.conf verwendet.

<VirtualHost *:443>
    # disable TRACK/TRACE:
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
    RewriteRule .* - [F]

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/my_cert.pem
    SSLCertificateKeyFile /etc/apache2/ssl/my_key.pem
    SSLCertificateChainFile /etc/apache2/ssl/my_ca.pem
    # best practice(apache/modern) from https://ssl-config.mozilla.org/
    # enable HTTP/2, if available
    Protocols h2 http/1.1

    # HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)
    Header always set Strict-Transport-Security "max-age=63072000"
    # modern configuration
    SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
    SSLHonorCipherOrder     off
    SSLSessionTickets       off
    SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

    # Needed for shibd endpoints
    <Location /Shibboleth.sso>
      AuthType None
      Require all granted
    </Location>

    DocmentRoot /var/www/html
    Alias /start /var/www/html

    <Location /secure>
      AuthType shibboleth
      ShibRequestSetting requireSession true
      require shib-session
    </Location>
</VirtualHost>
Empfohlene SSL Konfiguration

Beispielempfehlungen für den sicheren Apache2 Serverbetrieb. Empfehlungen von https://ssl-config.mozilla.org/.

<VirtualHost *:443>
    # disable TRACK/TRACE:
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
    RewriteRule .* - [F]

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/my_cert.pem
    SSLCertificateKeyFile /etc/apache2/ssl/my_key.pem
    SSLCertificateChainFile /etc/apache2/ssl/my_ca.pem
    # best practice(apache/modern) from https://ssl-config.mozilla.org/
    # enable HTTP/2, if available
    Protocols h2 http/1.1

    # modern configuration
    SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
    SSLHonorCipherOrder     off
    SSLSessionTickets       off
    SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
shibd Endpoints

Folgende Location gewährt den Zugriff auf die shibd Endpoints.

	# Needed for shibd endpoints
	<Location /Shibboleth.sso>
		AuthType None
		Require all granted
	</Location>
Ressourcen/Anwendung schützen

Folgende Location schützt den Zugriff mit einer Shibboleth Authentifizierung ab.

	<Location /secure>
		AuthType shibboleth
		ShibRequestSetting requireSession true
		require valid-user
	</Location>

Nginx

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name mein-sp.de;

    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver;
    # async 'resolver' is important for proper operation of OCSP stapling
    resolver 127.0.0.1;

    location /secure {
        # Shibboleth-Authentifizierung erzwingen
        auth_request /Shibboleth.sso/auth;
        auth_request_set $user $upstream_http_remote_user;

        # Weiterleitung an Ihre Anwendung
        proxy_pass http://127.0.0.1:your_app_port;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Remote-User $user; #Übergabe des Benutzers an die Anwendung.

        # Weitere Header, die von Shibboleth bereitgestellt werden können
        # proxy_set_header eppn $upstream_http_eppn;
        # proxy_set_header affiliation $upstream_http_affiliation;
    }

    location /Shibboleth.sso {
        # Shibboleth-Endpunkte weiterleiten
        proxy_pass http://unix:/run/shibboleth/shibd.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Empfohlene SSL Konfiguration

Beispielempfehlungen für den sicheren Nginx Serverbetrieb. Empfehlungen von https://ssl-config.mozilla.org/.

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name mein-sp.de;

    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver;
    # async 'resolver' is important for proper operation of OCSP stapling
    resolver 127.0.0.1;

Ressourcen/Anwendung schützen

    location /secure {
        # Shibboleth-Authentifizierung erzwingen
        auth_request /Shibboleth.sso/auth;
        auth_request_set $user $upstream_http_remote_user;

        # Weiterleitung an Ihre Anwendung
        proxy_pass http://127.0.0.1:your_app_port;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Remote-User $user; #Übergabe des Benutzers an die Anwendung.

        # Weitere Header, die von Shibboleth bereitgestellt werden können
        # proxy_set_header eppn $upstream_http_eppn;
        # proxy_set_header affiliation $upstream_http_affiliation;
    }

shibd Endpoints

    location /Shibboleth.sso {
        # Shibboleth-Endpunkte weiterleiten
        proxy_pass http://unix:/run/shibboleth/shibd.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

Debugging

shibd Logging

Die Shibboleth Daten werden verschlüsselt übertragen. Ein SAML Tracer Plugin im Webbrowser ist nicht wirklich nützlich. Der shibd entschlüsselt die SAML Daten nach dem Empfang. Um diese Lesen zu können, können Sie in der Datei /etc/shibboleth/shibd.logger den Debug Modus aktivieren.

# set overall behavior
log4j.rootCategory=DEBUG, shibd_log, warn_log

Starten Sie den shibd neu und Sie haben die Möglichkeit die SAML Assertion unverschlüsselt in /var/log/shibboleth/shibd.log zu lesen. Vergessen Sie nicht den Debug Modus zurückzusetzen. Andernfalls loggen Sie sensible Nutzerdaten.

Auch ein Blick in das /var/log/shibboleth/transaction.log lohnt sich, um zu erfahren welche Daten in welcher Session verfügbar waren.

Mapping von Attributen

Der IdP liefert die Attribute mit den entsprechenden OIDs aus. Damit der shibd Service Provider diese OIDs verarbeiten kann, müssen diese in der Datei /etc/shibboleth/attribute-map.xml verfügbar und gemappt sein.

Achten Sie darauf, dass die entsprechenden OIDs in dieser Datei vorhanden ist und verwendet werden. Weiterhin können Sie dort den Namen festlegen mit der die Werte vom IdP in Ihre Webserver Session eingehen.

Shibboleth IdP Login testen

Sie möchten den Login über den IdP testen, unabhängig davon, ob Sie eine geschützte Ressource besitzen? Dafür können Sie Ihren SP mit https://mein-sp.de/Shibboleth.sso/Login ansprechen, sodass dieser ein Login am IdP initiiert.

Shibboleth IdP Logout testen

Sie möchten den Logout über den IdP testen? Dafür können Sie Ihren SP mit https://mein-sp.de/Shibboleth.sso/Logout ansprechen. Im Anschluss wird die Shibboleth Session des Nutzers gelöscht.

Shibboleth SP Session prüfen

Haben Sie sich erfolgreich über den IdP authentifiziert und die Shibboleth Session zu Ihrem SP wurde hergestellt, so können Sie mit dem Aufruf https://mein-sp.de/Shibboleth.sso/Session die Session prüfen.

Shibboleth SP Status prüfen

Der SP liefert eine Statusseite über https://mein-sp/Shibboleth.sso/Status. Bitte beachten Sie, dass die /etc/shibboleth/shibboleth2.xml diesen Endpunkt per Standard nur für 127.0.0.1 zugänglich macht.

Auslesen von Shibboleth Attributen

Unterstützt Ihr Webserver PHP, so können Sie folgende Datei als index.php in Ihr Webserver Root Verzeichnis legen:

<?php
phpinfo();
?>

Die IdP Daten werden auf Variablen wie affiliation, schacUserStatus oder entitlement gemappt. Hierbei handelt es sich nur um ein Beispiel. Ihre IdP Daten definieren Sie bei der Beantragung.

phpinfo() Übersicht

Sonstiges

shibd Zertifikatsrollover

SAML Zertifikate besitzen eine entsprechende Gültigkeit, sodass diese in regelmäßigen Abständen aktualisiert werden müssen. Alle IdPs benötigen das neue SAML Zertifikat, um weiterhin mit dem SP verschlüsselt Daten austauschen zu können. Ein Zertifikatsrollover mit dem shibd sollte zeitlich gut geplant sein (siehe: https://doku.tid.dfn.de/de:certificates#zertifikatstausch_am_sp). Eine Alternative zum Zertifikatsrollover wäre: SAML Zertifikatstausch ohne Rollover.

1. shibboleth2.xml vorbereiten

Passen Sie Ihre /etc/shibboleth/shibboleth2.xml Konfiguration wie folgt an. Der SP ist damit in der Lage die IdP-Daten mit altem bzw. neuem SAML Zertifikat zu entschlüsseln. Achten Sie dabei darauf, dass der shibd Leseberechtigungen auf die Zertifikatsdateien besitzt!

    <CredentialResolver type="Chaining">
        <!-- noch aktives altes Zertifikat -->
        <CredentialResolver type="File"
                            key="sp-cert.pem"
                            certificate="sp-key.pem"/>
        <!-- zusätzliches neues Zertifikat -->
        <CredentialResolver type="File"
                            key="sp-cert-new.pem"
                            certificate="sp-key-new.pem"/>
    </CredentialResolver>

Der shibd muss daraufhin neugestartet werden (siehe shibd - shibboleth2.xml).

2. Neues SAML Zertifikat veröffentlichen

Damit die IdPs das neue SP SAML Zertifikat kennen, muss das sp-cert-new.pem über die Metadaten bekannt gemacht werden. Dafür genügt das Hinzufügen im DFN-AAI Metadatenverwaltung (MDV) an der Entity des SPs und eine Wartezeit von 24h. Ohne DFN-AAI Metdatenverwaltung müssen die entsprechenden IdP Betreiber kontaktiert werden, um die Metadaten des SPs zu aktualisieren.

3. shibboleth2.xml SAML Zertifikate tauschen

Tauschen Sie die Reihenfolge der SAML Zertifikate in /etc/shibboleth/shibboleth2.xml, sodass der SP zukünftig das neue SAML Zertifikat zur Kommunikation mit den IdPs verwendet. Voraussetzung ist der Schritt 2, sodass alle IdPs das neue SP SAML Zertifikat kennen und diesem vertrauen.

    <CredentialResolver type="Chaining">
        <!-- neues Zertifikat -->
        <CredentialResolver type="File"
                            key="sp-cert-new.pem"
                            certificate="sp-key-new.pem"/>
        <!-- noch aktives altes Zertifikat -->
        <CredentialResolver type="File"
                            key="sp-cert.pem"
                            certificate="sp-key.pem"/>
    </CredentialResolver>

Der shibd muss daraufhin neugestartet werden (siehe shibd - shibboleth2.xml).

4. Altes SAML Zertifikat entfernen

Entfernen Sie das alte Zertifikat sp-cert.pem aus der DFN-AAI Metadatenverwaltung (MDV) an der Entity des SP. Mit einer Wartezeit von 24h sollten die IdPs nur noch das neue SAML Zertifikat für den Betrieb verwenden.

5. shibboleth2.xml altes SAML Zertifikat entfernen

Nachdem sichergestellt sein sollte, dass alle IdPs ausschließlich das neue SAML Zertifikat für den Betrieb verwenden, kann das alte SAML Zertifikat aus der /etc/shibboleth/shibboleth2.xml entfernt werden.

    <CredentialResolver type="Chaining">
        <!-- neues Zertifikat -->
        <CredentialResolver type="File"
                            key="sp-cert-new.pem"
                            certificate="sp-key-new.pem"/>
        <!-- noch aktives altes Zertifikat -->
        <!--
        <CredentialResolver type="File"
                            key="sp-cert.pem"
                            certificate="sp-key.pem"/>
        -->
    </CredentialResolver>

Der shibd muss daraufhin neugestartet werden (siehe shibd - shibboleth2.xml).