Dies ist eine alte Version des Dokuments!
AAI-Login für Nextcloud
Nextcloud bringt eine eigene SAML-Erweiterung mit, die aber nur zur Anbindung eines einzigen IdPs geeignet ist. Glücklicherweise hat diese Erweiterung aber einen Modus in dem per CGI-Environment-Variablen Authentifiziert wird. Damit wird die Authentifizierung an den Apache ausgelagert und dadurch kann die Shibboleth-SP-Software als Apache-Authentifizierungsmethode verwendet werden.
Vorteile und Besonderheiten:
- für die 'normalen' User verwaltet Nextcloud keine lokalen Passwörter mehr
- der initiale NC-Admin kann sich nach wie vor lokal anmelden, muss dazu aber eine spezielle URL nehmen:
https://HOST/index.php/login?direct=1
- neue AAI-User werden automatisch angelegt. Will man nicht alle AAI-User zulassen muss ausserhalb von Nextcloud eine Liste gepflegt werden:
- idealerweise per SAML-Attribut (typischerweise „eduPersonEntitlement“) aus einer Attribute-Authority
- alternativ als Userliste im Apache
- für jeden nicht-Browser-Client muss der User selber per initialem Browser-AAI-Login ein Security-Token erstellen
"SSO & SAML authentication"-App
- als Nextcloud-Admin einloggen
- unter „+Apps“ –> „Integration“ die Erweiterung „SSO & SAML authentication“ aktivieren
- unter „Settings“ –> „Administration“ –> „SSO & SAML authentication“ die Alternative „Use Environment variable“ auswählen
- „Only allow authentication if…“ NICHT auswählen
- General –> „REMOTE_USER“ (ist vorbelegt)
- „Attribute mapping“ –> „Show attribute mapping settings…“
- erstes Feld „displayName“ (ist vorbelegt)
- zweites Feld „mail“ (ist vorbelegt)
Shibboleth-SP
DFN-AAI-Config
- grundsätzliche DFN-AAI-Anbindung siehe https://doku.tid.dfn.de/de:shibsp
- Kontrollieren, dass „eppn“ als erstes/primäres Attribut an REMOTE_USER zugewiesen wird:
- /etc/shibboleth/shibboleth2.xml
<ApplicationDefaults entityID="https://files-dev.hochschulverwaltung.de/shibboleth" REMOTE_USER="eppn subject-id pairwise-id persistent-id"
Attribut-Mapping
Folgende Attribut-Mappings aktivieren falls nicht schon per Default aktiv:
- /etc/shibboleth/attribute-map.xml
<Attribute name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" id="eppn"> <AttributeDecoder xsi:type="ScopedAttributeDecoder" caseSensitive="false"/> </Attribute> <Attribute name="urn:oid:2.16.840.1.113730.3.1.241" id="displayName"/> <Attribute name="urn:oid:0.9.2342.19200300.100.1.3" id="mail"/>
root@host:~# systemctl restart shibd
Nicht vergessen diese drei Attribute in der DFN-AAI-Metadatenverwaltung als „required“ anzugeben damit die Idps diese Attribute freigeben!
Apache
Grundlegende Konfiguration
Es wird nur die Login-Seite per Shibboleth geschützt (siehe https://github.com/nextcloud/user_saml/issues/243):
- /etc/apache2/sites-available/VHOST.conf
<Location /index.php/apps/user_saml/saml/login> AuthType shibboleth ShibRequestSetting requireSession true <RequireAll> Require shib-attr eppn ~ ^.+$ Require shib-attr displayName ~ ^.+$ Require shib-attr mail ~ ^.+@.+$ Require valid-user </RequireAll> </Location>
root@host:~# systemctl reload apache2
Damit wird ein AAI-Login möglich und (sofern der Nutzer die geforderten drei Attribute mitbringt) automatisch ein Nextcloud-Account angelegt.
Einschränkung der Nutzergruppe
Eine Einschränkung des Nutzerkreises erfolgt typischerweise mithilfe des Berechtigungsattribute („entitlement“) welches für diesen AAI-Dienst aus einer Attribute-Authority kommen müsste. Existiert diese nicht kann der Kreis der berechtigten Nutzer z.B. über eine User-Liste im Apache eingeschränkt werden. Dabei muss unbedingt eine verständliche Fehlerseite konfiguriert werden die dem unberechtigten User eine Erklärung für die Ablehnung gibt:
- /etc/apache2/sites-available/VHOST.conf
<Location /index.php/apps/user_saml/saml/login> AuthType shibboleth ShibRequestSetting requireSession true <RequireAll> Require shib-attr eppn ~ ^.+$ Require shib-attr displayName ~ ^.+$ Require shib-attr mail ~ ^.+@.+$ Require user userX@uni-ab.de userY@uni-cd.de </RequireAll> ErrorDocument 401 /info.php </Location> # Error-Seite muss auch einen Shibboleth-Context haben damit # dort die SAML-Attribute im CGI-Environment auftauchen! Alias /info.php /var/www/vhosts/VHOST/dfn-info.php <Location /info.php> AuthType shibboleth ShibRequestSetting requireSession true Require valid-user </Location>
root@host:~# systemctl reload apache2
Dynamischer Beispielspielausschnitt für die Error-Seite wie sie in der Nextlcloud für die DFN-Nutzergruppe verwendet wird:
- /var/www/vhosts/VHOST/info.php
<?php if (empty($_SERVER['displayName'])) { $displayName = "Interessentin/Interessent"; } else { $displayName = $_SERVER['displayName']; }; echo "<p class='hint'><h3>Sehr geehrte(r) "; print_r($displayName); echo ",</h3></p>\n"; echo "<p class='hint'>dieser File-Sharing-Dienst steht nur Mitgliedern der Nutzergruppe 'XY'</a> zur Verfügung.</p>"; if (!empty($_SERVER['displayName']) && !empty($_SERVER['eppn']) && !empty($_SERVER['mail'])) { echo "<p class='hint'>Um Zugriff auf den Dienst zu bekommen registrieren Sie sich bitte unter Angabe Ihrer Netz-ID</p><center><h3>"; print_r($_SERVER['eppn']); echo "</h3></center><p class='hint'>bei der <a href=\"https://www.somedomain.de\">Nutzergruppe</a>.</p>"; } else { echo "<p class='hint'>Falls Sie registriert sind und diese Fehlermeldung sehen, fehlen noch folgende Benutzerinformationen um diesen Dienst nutzen zu können:</p>"; if (empty($_SERVER['displayName'])) { echo "<p class='hint'>Vor- und Nachname (\"displayName\") wurde nicht übertragen!</p>"; }; if (empty($_SERVER['eppn'])) { echo "<p class='hint'>Netz-Id (\"eduPersonPrincipalName\") wurde nicht übertragen!</p>"; }; if (empty($_SERVER['mail'])) { echo "<p class='hint'>E-Mail-Adresse (\"mail\") wurde nicht übertragen!</p>"; }; }; ?>
Logout
Bei der hier beschriebenen Konfiguration überlässt die Nextcloud-Software die Autentifizierung dem Webserver. Damit verschwindet aber der „Logout“-Menüpunkt in der Nextcloud-Oberfläche und der User kann sich nur abmelden indem er den Browser schliesst. Ein Logout kann aber der Shibboleth-SP übernehmen. Getriggert wird das Single-Logout durch Aufruf der Location
https://VHOST/Shibboleth.sso/Logout
: wie baut man das in die Nextcloud-Oberfläche ein?
Dabei wird ein Single-Logout getriggert, d.h. der User wird nicht nur vom Nextcloud-Dienst abgemeldet sondern auch von allen anderen AAI-Diensten an denen er in diesem Moment eingelogged ist. Daher sollte unbedingt eine Nachfrage mit entsprechendem Hinweis an den User gestellt werden bevor das Logout aktiviert wird.
: wie sieht so ein Code aus?
IdP-Config
IdPs welche die Attribut-Infos in den DFN-AAI-Metadaten nicht auswerten müssen drei Attribute manuell freigeben:
- /opt/shibboleth-idp/conf/attribute-filter.xml
<AttributeFilterPolicy id="hsvw-nextcloud"> <PolicyRequirementRule xsi:type="Requester" value="https://files-dev.hochschulverwaltung.de/shibboleth" /> <AttributeRule attributeID="eduPersonPrincipalName" permitAny="true"/> <AttributeRule attributeID="mail" permitAny="true"/> <AttributeRule attributeID="displayName" permitAny="true"/> </AttributeFilterPolicy>