Zwei-Faktor-Anmeldung
owncloud.online prüft den zweiten Faktor im Kern, liefert ihn aber nicht selbst:
Den Faktor bringt eine App mit, die sich in ihrer info.xml unter
<two-factor-providers> einträgt. Für zeitgesteuerte Einmalpasswörter (TOTP)
ist das die App twofactor_totp. Ohne eine solche aktivierte App fragt die
Anmeldung keinen zweiten Faktor ab — auch dann nicht, wenn der Zwang
eingeschaltet ist.
Provider-App bereitstellen
Die App gehört nicht zum Lieferumfang des Kerns; sie wird wie andere Apps über den Markt installiert (siehe Apps und Marketplace) und danach aktiviert:
sudo -u www-data php8.4 occ app:enable twofactor_totp
Die QR-Codes werden über imagick gerendert, und die App verlangt die
Erweiterung in ihrer info.xml (<lib>imagick</lib>). Ohne php8.4-imagick
lässt sich der Schlüssel weder in den Kontoeinstellungen noch auf der
Anmeldeseite als QR-Code anzeigen.
Welche Apps aktiv sind, zeigt:
sudo -u www-data php8.4 occ app:list
Zweiten Faktor im Konto einrichten
Der Weg führt über Einstellungen → Persönlich → Sicherheit, Abschnitt TOTP-Zweifaktorauthentifizierung:
- Das Kästchen TOTP (zeitgesteuertes Einmalpasswort) aktivieren setzen. Der Server erzeugt daraufhin einen neuen Schlüssel und zeigt ihn zusammen mit einem QR-Code an.
- Den QR-Code in der Authenticator-App scannen. Wer nicht scannen kann, überträgt den unter Dies ist Ihr neuer TOTP-Schlüssel: angezeigten Wert von Hand.
- Den angezeigten sechsstelligen Code in das Feld Authentifizierungscode eintragen und Überprüfen drücken. Die Antwort lautet Geprüft oder Nicht geprüft. In der Sprachfassung Deutsch (Persönlich) heißen dieselben Beschriftungen Bestätigen, Bestätigt und Nicht bestätigt.
Schritt 3 ist der entscheidende: Nur ein bestätigter Schlüssel zählt. Wird das Kästchen gesetzt, aber nie ein Code bestätigt, bleibt die Anmeldung unverändert; beim nächsten Aufruf der Seite steht das Kästchen wieder leer, denn sein Zustand hängt am bestätigten Schlüssel. Wird das Kästchen wieder entfernt, löscht der Server den Schlüssel; eine erneute Aktivierung erzeugt einen neuen und verlangt einen neuen Scan.
Zum Zeitverhalten: Der Code wechselt alle 30 Sekunden, und die Prüfung akzeptiert drei Zeitschritte in beide Richtungen, also rund anderthalb Minuten Abweichung zwischen Server- und Geräteuhr. Ein bereits angenommener Code wird kein zweites Mal akzeptiert; der zuletzt geprüfte Code wird dafür gespeichert.
Zweiten Faktor erzwingen
Der Zwang steht unter Einstellungen → Administration → Sicherheit, Abschnitt Zwei-Faktor-Authentifizierung. Dort gibt es zwei Bedienelemente:
- das Kästchen Erzwinge Zwei-Faktor-Authentifizierung für alle Nutzer.
- das Feld Die folgenden Gruppen sind von der erzwungenen Zwei-Faktor-Authentifizierung ausgenommen
In der Sprachfassung Deutsch (Förmlich: Sie) heißt der Navigationspunkt Administrator statt Administration; der Abschnitt selbst ist derselbe.
Beide Bedienelemente schreiben in die App-Konfiguration:
| Schlüssel | App | Bedeutung |
|---|---|---|
enforce_2fa |
core |
yes schaltet den Zwang ein, jeder andere Wert lässt ihn aus |
enforce_2fa_excluded_groups |
core |
JSON-Liste der ausgenommenen Gruppen, Vorgabe [] |
Dieselbe Einstellung auf der Kommandozeile:
sudo -u www-data php8.4 occ config:app:set core enforce_2fa --value yes
sudo -u www-data php8.4 occ config:app:set core enforce_2fa_excluded_groups --value '["Technik","Vorstand"]'
sudo -u www-data php8.4 occ config:app:get core enforce_2fa
sudo -u www-data php8.4 occ config:app:get core enforce_2fa_excluded_groups
Ausschalten geht über --value no oder durch Löschen des Schlüssels:
sudo -u www-data php8.4 occ config:app:delete core enforce_2fa
Was der Zwang je Gruppe tatsächlich leistet
Das Modell kennt nur Ausnahmen, keine Positivliste: Der Zwang gilt für alle, und die eingetragenen Gruppen sind davon ausgenommen. Soll er nur für eine einzige Gruppe gelten, müssen alle übrigen Gruppen in der Ausnahmeliste stehen — und Konten, die in keiner Gruppe sind, lassen sich auf diesem Weg nicht ausnehmen, weil die Prüfung nur Gruppenmitgliedschaften vergleicht. Mitglieder ausgenommener Gruppen können den Faktor weiterhin freiwillig einrichten; darauf weist auch die Oberfläche hin.
Verhalten bei erzwungenem Faktor
- Konten ohne eingerichteten Faktor werden nicht ausgesperrt: Auf der Faktor-Seite erzeugt die App einen Schlüssel und zeigt den QR-Code an, die Einrichtung findet also unmittelbar bei der Anmeldung statt. Der eingegebene Code gilt zugleich als Bestätigung des neuen Schlüssels.
- Der Zwang überstimmt die kontobezogene Abschaltung (siehe unten).
- Ohne aktive Provider-App bleibt der Zwang wirkungslos, weil es keinen Faktor gibt, der abgefragt werden könnte.
Der Ablauf nach richtigem Passwort: Es erscheint die Seite Bestätigung in zwei Schritten mit der Liste der verfügbaren Faktoren, bei genau einem Faktor geht es direkt zur Code-Eingabe. Bis der Code stimmt, gibt die Middleware keine andere Seite frei; nur Anmelden abbrechen führt hinaus.
App-Passwörter und Client-Abgleich
Gilt für ein Konto ein zweiter Faktor, weist der Server jede Client-Anmeldung ab, die das Kontopasswort mitsendet. Anfragen mit einem App-Passwort (Gerätetoken) laufen unverändert weiter.
| Zugangsweg | Verhalten bei aktivem zweitem Faktor |
|---|---|
| Anmeldung im Browser | unverändert, der Faktor wird abgefragt |
| Client mit Kontopasswort (WebDAV, OCS) | abgewiesen; im Protokoll steht Login failed: '<konto>' (Remote IP: '<ip>') |
| Client mit App-Passwort | läuft weiter |
Token-Ausgabe über index.php/token/generate |
abgewiesen mit HTTP 401 |
| Bereits angemeldete Browser-Sitzung | wird nicht nachträglich zum Faktor aufgefordert; die Abfrage entsteht beim Anmelden |
Bestehende App-Passwörter bleiben gültig. Das Einschalten des zweiten Faktors entzieht keine Token — bequem für laufende Clients, zugleich aber der wunde Punkt der Maßnahme: Ein abgeflossenes App-Passwort umgeht den zweiten Faktor weiterhin. Wer den Faktor einführt, um kompromittierte Zugangsdaten auszuschließen, muss die Token deshalb durchgehen und entziehen.
Token verwalten und neu erstellen lässt sich unter Einstellungen → Persönlich → Sicherheit, Abschnitt App-Passwörter / Token: Namen eintragen, Neuen App-Passcode erstellen drücken, dann werden Benutzername und Passwort / Token einmalig angezeigt. Auf derselben Seite listet der Abschnitt Sitzungen die aktuell angemeldeten Web-, Desktop- und Mobil-Clients.
Unabhängig vom zweiten Faktor lässt sich die Anmeldung mit dem Kontopasswort
für alle Clients sperren, in config/config.php:
'token_auth_enforced' => true,
Die Browser-Anmeldung ist davon nicht betroffen.
Wenn ein Konto seinen zweiten Faktor verloren hat
Der zweite Faktor lässt sich nicht wiederherstellen, nur zurücksetzen. Danach richtet das Konto ein neues Gerät ein.
In der Verwaltungsoberfläche steht dafür Einstellungen → Administration → Nutzer-Authentifizierung, Abschnitt TOTP Admin Reset. Die Beschriftungen dieses Abschnitts sind nicht übersetzt und erscheinen auch in einer deutschen Oberfläche englisch: über Search users das Konto suchen, in der Liste markieren und Reset selected drücken. Reset all TOTP setups setzt sämtliche Einrichtungen der Instanz zurück.
Derselbe Vorgang auf der Kommandozeile:
sudo -u www-data php8.4 occ twofactor_totp:delete-secret alice
sudo -u www-data php8.4 occ twofactor_totp:delete-secret alice bob
sudo -u www-data php8.4 occ twofactor_totp:delete-secret --all
Ohne Kontoangabe und ohne --all bricht der Befehl mit einem Hinweis ab. Die
Ausgabe nennt je Konto die Zahl der gelöschten Schlüssel.
Was danach passiert, hängt am Zwang: Ist er für das Konto wirksam, richtet sich das Konto bei der nächsten Anmeldung auf der Faktor-Seite neu ein. Ist er es nicht, ist der zweite Faktor für dieses Konto schlicht aus, bis es ihn in den Kontoeinstellungen wieder einschaltet.
Zwei weitere Wege, die den Schlüssel erhalten:
# Faktor für ein Konto abschalten, ohne den Schluessel zu loeschen
sudo -u www-data php8.4 occ user:setting alice core two_factor_auth_disabled --value 1
# Abschaltung wieder zuruecknehmen
sudo -u www-data php8.4 occ user:setting alice core two_factor_auth_disabled --delete
# Schluessel als "nicht geprueft" markieren; der Faktor ist damit aus, sofern kein Zwang gilt
sudo -u www-data php8.4 occ twofactor_totp:set-secret-verification-status false --uid alice
Beide Wege greifen nur, solange der Zwang für dieses Konto nicht gilt — der
Zwang wird zuerst geprüft. Bei erzwungenem Faktor führt ein als „nicht geprüft"
markierter Schlüssel lediglich wieder auf die Faktor-Seite, auf der derselbe
Schlüssel erneut als QR-Code erscheint. Die Abschaltung über
two_factor_auth_disabled erlaubt auch die Provisioning-API mit einem PUT auf
ocs/v1.php/cloud/users/<uid> und dem Schlüssel two_factor_auth_enabled
(Wert true oder false); dasselbe Feld erscheint lesend in den Kontodaten.
Aufräumen von Schlüsseln bereits gelöschter Konten:
sudo -u www-data php8.4 occ twofactor_totp:delete-redundant-secret
Achtung: Wird die App
twofactor_totpdeaktiviert, löscht sie über einen Hook die Schlüssel aller Konten. Ein Deaktivieren „nur kurz zum Testen" kostet damit die Einrichtung der gesamten Instanz. Auch das Löschen eines Kontos entfernt dessen Schlüssel.
Zusammenspiel mit der Anmeldebremse
Die Bremse gegen Passwort-Raten zählt fehlgeschlagene Passwort-Prüfungen je
Kombination aus IP-Adresse und Anmeldename. Die ersten Versuche sind frei,
danach wächst eine Wartezeit, die das Anmeldeformular als Restzeit anzeigt.
Voraussetzung für die richtige Zählung hinter einem Reverse-Proxy ist ein
korrektes trusted_proxies, siehe
Sicherheit und Setup-Warnungen.
Für den zweiten Faktor ist die Reihenfolge entscheidend:
- Falsches Passwort — der Versuch wird gezählt, die Faktor-Seite wird nie erreicht.
- Richtiges Passwort — der Zähler für dieses Paar aus IP und Anmeldename wird geleert, danach folgt die Faktor-Seite.
- Falscher Code auf der Faktor-Seite — der Versuch wird nicht gezählt. Der
Kern schreibt lediglich eine Warnung ins Protokoll:
Two factor verify failed: '<konto>' (Remote IP: '<ip>').
Die Bremse schützt also das Passwort, nicht den zweiten Faktor. Nach beliebig vielen falschen Codes gibt es weder Wartezeit noch Sperre; gegen das Raten des Codes stehen allein seine sechs Stellen, das enge Zeitfenster und die Sperre gegen die Wiederverwendung eines Codes. Wer das für zu wenig hält, überwacht die genannte Protokollzeile, siehe Serverprotokoll und Fehlermeldungen.
Ist die App brute_force_protection aktiviert, stellt sie die Richtlinie für
die Anmeldung und für Freigabe-Passwörter. Die eingebaute Bremse tritt auf
genau diesen beiden Wegen zurück, damit nicht zwei Mechanismen nebeneinander
zählen und zwei verschiedene Wartezeiten nennen. Für alle übrigen Aktionen
bleibt sie zuständig.
Fehlersuche
| Symptom | Ursache | Abhilfe |
|---|---|---|
| Zwang ist eingeschaltet, es wird trotzdem kein Code verlangt | Keine App mit <two-factor-providers> aktiv — ohne Faktor greift der Zwang ins Leere |
occ app:enable twofactor_totp, danach occ app:list prüfen |
| Kästchen im Konto gesetzt, beim Anmelden ändert sich nichts | Der Schlüssel wurde nie mit einem Code bestätigt; nur bestätigte Schlüssel zählen | Code eingeben und Überprüfen drücken, bis Geprüft erscheint |
| Codes werden abgelehnt, obwohl die App sie anzeigt | Uhr von Server oder Endgerät weicht um mehr als rund anderthalb Minuten ab | Zeitsynchronisierung auf dem Server und dem Endgerät prüfen |
| Derselbe Code wird ein zweites Mal nicht angenommen | Der zuletzt geprüfte Code ist gespeichert und für die Wiederverwendung gesperrt | Den nächsten Code abwarten |
| Kein QR-Code, Einrichtung schlägt fehl | php8.4-imagick fehlt, die App verlangt die Erweiterung |
Erweiterung installieren, PHP-FPM neu laden |
| Desktop- oder Mobil-Client meldet Anmeldefehler, der Browser funktioniert | Der Client sendet das Kontopasswort; das ist bei aktivem zweitem Faktor gesperrt (Protokoll: Login failed: …) |
App-Passwort erstellen und im Client statt des Kontopassworts eintragen |
| Alter Client gelangt trotz aktivem Faktor an die Daten | Ein vor der Umstellung erzeugtes App-Passwort gilt weiter | Token unter Persönlich → Sicherheit → App-Passwörter / Token entziehen |
| Ausgenommene Gruppe wird trotzdem zum Faktor gezwungen | enforce_2fa_excluded_groups enthält keine gültige JSON-Liste oder einen falsch geschriebenen Gruppennamen |
occ config:app:get core enforce_2fa_excluded_groups prüfen und neu setzen |
two_factor_auth_disabled für ein Konto wirkt nicht |
Der Zwang gilt für dieses Konto und wird zuerst geprüft | Gruppe des Kontos ausnehmen oder den Zwang abschalten |
Nach dem Deaktivieren von twofactor_totp sind alle Einrichtungen weg |
Das Deaktivieren löscht über einen Hook sämtliche Schlüssel | Konten neu einrichten lassen; die App nicht zu Testzwecken deaktivieren |
| Mehrere falsche Codes bleiben folgenlos | Die Anmeldebremse zählt nur Passwortversuche, keine Faktor-Versuche | Protokoll auf Two factor verify failed überwachen |