2020.06 2021.06

Anbindung von Shibboleth

Beschreibung der Anbindung an externe Authentifizierungs- und Authorisierungssysteme.

Shibboleth

Wikipedia

Shibboleth ist ein vom Internet2/MACE entwickeltes Verfahren zur verteilten Authentifizierung und Autorisierung für Webanwendungen und Webservices. Das Konzept von Shibboleth sieht vor, dass der Benutzer sich nur einmal bei seiner Heimateinrichtung authentifizieren muss, um ortsunabhängig auf Dienste oder lizenzierte Inhalte verschiedener Anbieter zugreifen zu können (engl. Single Sign-on). Shibboleth basiert auf einer Erweiterung des Standards SAML.

Discovery-Service
Hier wählt der Benutzer zu welcher Einrichtung er gehört und wird an dessen Identity-Provider weitergeleitet. Der Discovery-Service ist optional.
Identity-Provider:
Hält die Namen, Passworter und Rollen der Benutzer. Idr. hat jede Universität einen eigenen Identity-Provider. Benutzer melden sich hier an und bestimmen welche Informationen an den Service-Provider weitergeleitet werden sollen.
Service-Provider
Stellt geschützte Resourcen zu verfügung. Leitet die Benutzer an den Discovery-Service oder an den Identity-Provider weiter. Nimmt nach der Anmeldung die Benutzerinformationen entgegen.

Die MyCoRe-Anwendung ist ein Teil des Serviceproviders und nimmt die Benutzerinformationen entgegen. Der andere Teil ist ein Apache-Plugin, welches die Shibboleth relevanten Requests verarbeitet und an den Tomcat weiterleitet.

Installieren des Serviceproviders

Als erstes muss man ein Apache-Plugin installieren, welches den Serivceprovider enthält: sudo apt-get install libapache2-mod-shib2

/etc/shibboleth/
Konfigurationsverzeichniss des Shibboleth Daemon
/usr/sbin/shibd
Shibboleth Daemon
/var/log/shibboleth
Logverzeichniss
/etc/httpd/conf.d/shib.conf
Apache spezifische Konfiguration für den Serviceprovider

Konfiguration des Service providers

Die wichtigste Konfigurationsdatei ist die /etc/shibboleth/shibboleth2.xml Diese Datei bestimmt welche Discovery-Services/Identity-Provider angesprochen werden und ist in mehrere Sektionen aufgeteilt. Für die Konfiguration wird das Shibboleth-Wiki empfohlen.

Wir empfehlen folgende Konfiguration:

ApplicationDefaults@attributePrefix
"AJP_" - Die attribute werden nur per ajp weitergeleitet wenn das Prefix AJP_ gesetzt ist
Sessions@handlerSSL
true - Es werden nur Anfragen per SSL auf den Handler zugelassen
Sessions@cookieProps
https - Cookies werden nur für SSL Anfragen gesetzt

Die Sektion <ApplicationDefaults .../> bestimmt die Grundkonfiguration des Demons. Es ist in der nachfolgenden Sektion <ApplicationOverride .../> möglich diese Konfiguration zu erweitern, oder Teile davon zu Überschreiben. Das Erweitern der Konfiguration bietet die Möglichkeit auf einem Server mehrere Anwendungen mit unterschiedlichen Identity-Providern oder Discovery-Services zu betreiben.

Konfiguration von Apache

Nachdem für jede Anwendung ein ApplicationOverride konfiguriert ist, muss Apache konfiguriert werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
  <Location /hagen/>
  ProxyPass  ajp://localhost:8038/hagen/
  ProxyPassReverse  ajp://localhost:8038/hagen/
  Require all granted
  </Location>
  <Location /hagen/Shibboleth.sso>
  SetHandler shib
  ProxyPass !
  ProxyPassReverse !
  ShibRequestSetting applicationId hagen
  </Location>
  <Location /hagen/servlets/MCRShibbolethLoginServlet>
  AuthType shibboleth
  ShibRequestSetting requireSession 1
  ShibRequestSetting applicationId hagen
  Require  valid-user
  </Location>
  

Die erste Location ist die eigentliche MyCoRe-Anwendung welche per ProxyAJP an den Tomcat mit MyCoRe weitergeleitet wird.

Die zweite Location ist der Service Provider und wird über das Apache-Plugin angesprochen. Das **ProxyPass !** und **ProxyPassReverse !** verhindern das dieser Pfad an den Tomcat weitergereicht werden. Das **SetHandler** sagt dem Apache das dass Apache-Plugin für diese Location benutzt werden soll. Die **applicationId** verweist auf dass **ApplicationOverride/@id** welches in der shibboleth2.xml festgelegt wurde.

Die dritte Location schaltet die Authentifizierung mit Shibboleth ein. Wenn die URL ` /hagen/servlets/MCRShibbolethLoginServlet` aufgerufen wird, dann schaltet sich erst Apache ein, weil das `AuthType` auf `shibboleth` gesetzt wurde, dann wird die Kontrolle an den Shibboleth-Daemon abgegeben. Dieser führt die Authentifizierung aus und leitet anschließend an das `MCRShibbolethLoginServlet ` weiter und übergibt die Informationen die beim Login vom Identity-Provider übermittelt wurden.

Anpassen der Realms.xml

Nachdem Apache Konfiguriert ist, muss die realms.xml im Datenverzeichnis von MyCoRe angepasst werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    <?xml version="1.0" encoding="UTF-8"?>

    <realms local="local">
        <realm id="local">
            [...]
        </realm>
        <realm id="shibboleth" setable="false">
            <label xml:lang="de">Shibboleth</label>
            <label xml:lang="en">Shibboleth</label>
            <login url="MCRShibbolethLoginServlet" redirectParameter="url">
                <label xml:lang="de">Anmelden mit dem Login Ihrer Heimateinrichtung</label>
                <label xml:lang="en">Login with your user credentials of your home institution</label>
                <info>
                    <label xml:lang="de">
                        Falls unterstützt, müssen Sie sich ggf. nur einmalig anmelden.
                    </label>
                    <label xml:lang="en">
                        This login uses single-sign-on facilities provided by your home institution.
                    </label>
                </info>
            </login>
        </realm>
        <realm id="tu-ilmenau.de">
            <label xml:lang="de">TU Ilmenau</label>
            <label xml:lang="en">TU Ilmenau</label>
            <attributeMapping>
                <attribute name="userName" mapping="eppn"/>
                <attribute name="realName" mapping="displayName" converter="org.urmel.dbt.utils.DisplayNameConverter"/>
                <attribute name="eMail" mapping="mail"/>
                <attribute name="roles" mapping="affiliation" separator=";">
                    <valueMapping name="employee">submitter</valueMapping>
                    <valueMapping name="member">reader</valueMapping>
                </attribute>
            </attributeMapping>
            <passwordChangeURL>https://www.tu-ilmenau.de/unirz/it-service-desk/password/</passwordChangeURL>
        </realm>
        <realm id="uni-jena.de">
            <label xml:lang="de">FSU Jena</label>
            <label xml:lang="en">FSU Jena</label>
            <attributeMapping>
                <attribute name="userName" mapping="eppn"/>
                <attribute name="realName" mapping="displayName" converter="org.urmel.dbt.utils.DisplayNameConverter"/>
                <attribute name="eMail" mapping="mail"/>
                <attribute name="roles" mapping="eduPersonAffiliation">
                    <valueMapping name="employee">submitter</valueMapping>
                    <valueMapping name="member">reader</valueMapping>
                </attribute>
            </attributeMapping>
            <passwordChangeURL>https://portal.uni-jena.de/</passwordChangeURL>
        </realm>
        <realm id="uni-erfurt.de">
            <label xml:lang="de">Universität Erfurt</label>
            <label xml:lang="en">University Erfurt</label>
            <attributeMapping>
                <attribute name="userName" mapping="eppn"/>
                <attribute name="realName" mapping="displayName" converter="org.urmel.dbt.utils.DisplayNameConverter"/>
                <attribute name="eMail" mapping="mail"/>
                <attribute name="roles" mapping="eduPersonAffiliation">
                    <valueMapping name="employee">submitter</valueMapping>
                    <valueMapping name="member">reader</valueMapping>
                </attribute>
            </attributeMapping>
            <passwordChangeURL>https://idmweb.uni-erfurt.de/OAS</passwordChangeURL>
        </realm>
    </realms>
    

Um zu bewirken, dass der Benutzer beim Anlegen eines Dokument auch gespeichert wird muss in den mycore.properties noch folgendes Property gesetzt werden:

1
2
  # can be used to persist transient user (shibboleth or ...)
  MCR.EventHandler.MCRObject.110.Class=org.mycore.user2.events.MCRPersistTransientUserEventHandler

Anhand der Attribute die gemappt werden sieht man, was der IDP liefern muss.