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:

  • 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

Besonderheiten:

  • 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
  • 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)
  • 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"
 

Folgende Attribut-Mappings aktivieren falls nicht schon per Default aktiv:

/etc/shibboleth/shibboleth2.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"/>
 

<cli sh prompt='# '> root@host:~# systemctl restart shibd </cli>

<note>Nicht vergessen diese drei Attribute in der DFN-AAI-Metadatenverwaltung als „required“ anzugeben damit die Idps diese Attribute freigeben!</note>

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>

<cli sh prompt='# '> root@host:~# systemctl reload apache2 </cli>

Damit wird ein AAI-Login möglich und (sofern der Nutzer die geforderten drei Attribute mitbringt) automatisch ein Nextcloud-Account angelegt.

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                  rgb@dfn.de elser@dfn.de userX@uni-ab.de userY@uni-cd.de
   </RequireAll>
   ErrorDocument 401 /dfn-info.php
</Location>
 
# Error-Seite muss auch einen Shibboleth-Context haben damit
# dort die SAML-Attribute im CGI-Environment auftauchen!
Alias /dfn-info.php /var/www/vhosts/VHOST/dfn-info.php
<Location /dfn-info.php>
    AuthType shibboleth
    ShibRequestSetting requireSession true
    Require valid-user
</Location>

<cli sh prompt='# '> root@host:~# systemctl reload apache2 </cli>

Dynamischer Beispielspielausschnitt für die Error-Seite wie sie in der Nextlcloud für die DFN-Nutzergruppe verwendet wird:

/var/www/vhosts/files-dev.hochschulverwaltung.de/dfn-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 DFN-Nutzergruppe 'Hochschulverwaltung'</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.hochschulverwaltung.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>";
        };
};
 
?>

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

FIXME: 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.

FIXME: wie sieht so ein Code aus?

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>
  • Zuletzt geändert: vor 4 Jahren