-
Notifications
You must be signed in to change notification settings - Fork 121
Description
Bisher ist der Zugriff auf ein Hitobito-System zeitlich unbeschränkt. Das ist aus Security- und Datenschutz-Sicht nicht optimal und sollte angepasst werden.
Daraus ergibt sich folgende Überlegung:
Automatismus
- Nach 18 Monaten ohne Login wird eine Warnung an die Haupt-E-Mail geschickt, dass der Zugang bald entfernt wird
- Falls nicht wieder eingeloggt, wird das login einen Monat später gesperrt (ohne die Haupt-E-Mail anzupassen)
- Dabei wird auch der betroffene Benutzer per Mail informiert
- Die Fristen (18 + 1 Monat) sind pro Instanz anpassbar
- Für andere Wagons wird der Job standardmässig deaktiviert
- Neue OAuth-Zugriffe sollen bei gesperrten Accounts nicht mehr möglich sein, bestehende Sessions müssen aber nicht unbedingt überprüft werden
Funktion "Login schicken"
- Der Button "Login schicken" entsperrt neu auch den Account.
- Button-Text anpassen "Entsperren und Login schicken", falls der Account gesperrt ist
- Personen mit Schreibrechten können diesen Button verwenden
- Funktion "Passwort vergessen" schlägt neu fehl, wenn der Account gesperrt ist.
⚠️
Funktion "Login sperren"
- Hiermit wird das Login manuell gesperrt.
Erscheint im Drop-Down unter "Login schicken"- Im Security-Tab werden die zwei Abschnitte angepasst und ein Button zur Sperrung eingebaut:
Vermutest du, dass jemand die Kontrolle über die E-Mail-Adresse von [Person] unerlaubt übernommen hat?
Möchtest du [Person] ganz aus Hitobito ausschliessen?
- Da diese Option in der Diskussion umstritten war, sollte sie pro Wagon deaktivierbar sein.
Login-Icons
Sperrung soll im Icon miteinbezogen werden:
Line 366 in bee9e3a
| return :login if email? && password? |
Login UI
Wenn sich eine gesperrte Person einloggt, erhält sie ein E-Mail (konfigurierbar in den Texten):
Dein Account wurde automatisch aufgrund von Inaktivität gesperrt, du kannst dich bei deinen Gruppenleiterinnen oder Adressverwalterinnen melden, um den Zugang wieder zu erhalten.
Im Moment gibt es die Möglichkeit, herauszufinden, ob es eine E-Mail-Adresse in der MiData gibt oder nicht, wenn die Passwort-Reset-Funktion verwendet wird. Dieser Umstand sollte wenn möglich auch geändert werden.
Siehe auch die ursprüngliche Idee, die kontrovers aufgenommen wurde: #1297
Tech-Spec
- Die Sperre ist, in Absprache mit @Michael-Schaer, nicht als Login-Sperre sondern als hitobito-Benutzungs-Sperre umzusetzen. Der Login inkl. 2FA darf weiterhin funktionieren, aber nach dem Login soll der User blockiert sein und nur einen Logout-Link und eine simple Nachricht über den Zustand angezeigt bekommen. OAuth soll nicht mehr funktionieren, aber Passwortwechsel schon (falls einfach umsetzbar)
- Umsetzung im Core, aber die Frist für die Automatisierung soll statt 18+1 Monate eine extrem lange Zeit sein (oder komplett deaktiviert)
- Wenn die Fristen in einem Wagon geändert werden, muss man daran denken, was mit den Personen passiert die durch die Friständerung jetzt vielleicht neu von diesem Feature betroffen oder nicht mehr betroffen sind
ToDo
- Neue Datenbankspalten
inactivity_block_warning_sent_atundblocked_ataufPerson, beide datetime, defaultnil - Neuer Background-Job
InactivityBlockWarningJob, der täglich läuft- Sucht in Batches alle Personen, deren
last_sign_in_atälter als X Monate ist- X Monate ist in den settings.yml konfigurierbar, standardmässig im Core eine extrem lange Zeit oder z.B.
nilund in diesem Fall keine Personen suchen - Im PBS Wagon auf 18 Monate setzen
- X Monate ist in den settings.yml konfigurierbar, standardmässig im Core eine extrem lange Zeit oder z.B.
- Setzt die Spalte
inactivity_block_warning_sent_ataufDateTime.now - Sendet ein neues CustomContent Mail das die Person über die bevorstehende Löschung informiert. Solche Mails können mit der Methode
custom_content_mailin einem Mailer versendet werden (dafür auch einen eigenen Mailer anlegen).
- Sucht in Batches alle Personen, deren
- Neuer Background-Job
InactivityBlockJob, der täglich läuft- Sucht in Batches alle Personen, deren
inactivity_block_warning_sent_atälter als Y Monate ist UND derenblocked_atleer ist- Y Monate ist in den settings.yml konfigurierbar, standardmässig im Core eine extrem lange Zeit oder z.B.
nilund in diesem Fall keine Personen suchen - Im PBS Wagon auf 1 Monat setzen
- Y Monate ist in den settings.yml konfigurierbar, standardmässig im Core eine extrem lange Zeit oder z.B.
- Setzt die Spalte
blocked_ataufDateTime.now
- Sucht in Batches alle Personen, deren
- Auf dem Sicherheits-Tab einer Person in den beiden Fällen
email_compromised_situationundsuspend_person_situationje einen Button "Zugang blockieren" einbauen- Button taucht nur auf, wenn die last_sign_in_at nicht leer ist
- Button ruft eine neue POST-Action
blockim SecurityToolsController auf- Action verweigert, dass man sich selber oder sich als Imitator blockiert (@user darf weder
current_personnochorigin_usersein) - Action setzt
blocked_atder Person aufDateTime.nowund zeigt Flash-Nachricht
- Action verweigert, dass man sich selber oder sich als Imitator blockiert (@user darf weder
- Falls die Person bereits blockiert ist (
blocked_atist nichtnil):- Statt den Buttons eine andere, passende Nachricht anzeigen, z.B. "Diese Person ist blockiert, und hat daher keinen Zugriff mehr."
- Weitere Section anzeigen mit Erklär-Text dass die Person blockiert ist, und was das für Auswirkungen hat, und falls X und Y nicht
nilsind auch erklären dass das nach X + Y Monaten ohne Login automatisch passiert, und mit Button um die Person zu entsperren. - Button ruft eine neue POST-Action
unblockim SecurityToolsController auf- Action setzt
blocked_atundinactivity_block_warning_sent_ataufnilund zeigt Flash-Nachricht
- Action setzt
- Im Login-Dropdown eine neue Option zum Entsperren einbauen
- Option taucht nur auf, wenn
template.can?(:update, @user) - Option taucht nur auf, wenn
@user.blocked_at.present? - Option ruft POST-Action
unblockim SecurityToolsController auf
- Option taucht nur auf, wenn
- In der Berechnung des Login-Status Icons (kann auf Personen-Detail oder in Personenliste als zusätzliche Spalte angeschaut werden) einen neuen Status "blockiert" einbauen
- Icon muss im PeopleHelper gesetzt werden. Vorschlag: user-lock
- Deutsche Übersetzung für den neuen Status erfassen
- Für die eigentliche Sperrung eine neue
before_actionimApplicationControlleranlegen- In diesem Hook überprüfen, ob
current_person.blocked_at.present?, und wenn ja, eine spezielle minimalistische View rendern (einrenderin diesem Hook müsste den Rest der Action abbrechen, falls nicht müsste es mit einemredirectgehen) - Ausnahmen sind alle Actions die für Login, 2FA und Passwort-Reset nötig sind. Die OAuth Actions (Doorkeeper::Authorizations#new etc.) sollen aber explizit blockiert / abgebrochen werden
- Für Formate abgesehen von HTML kann auch einfach ein HTTP 403 ausgegeben werden wenn das einfacher ist
- Zu klären mit @Michael-Schaer wenn das implementiert ist: Gibt es noch mehr Ausnahmen?
- Falls es aus irgendeinem Grund nicht möglich ist, das im
before_actionHook des ApplicationControllers zu realisieren, könnte man stattdessen eine eigene Rack Middleware schreiben. Aber dann müsste man sich möglicherweise ActiveRecord und Devise selber einrichten oder zumindest requiren...
- In diesem Hook überprüfen, ob
- In separater Datenbankmigration alle Personen suchen, deren
last_sign_in_atbereits jetzt älter als X + Y Monate ist, und bei diesen Personenblock_warning_sent_atauf heute vor Y Monaten setzen (an diese Personen wollen wir keine Warnung mehr schicken) - Specs schreiben
- Kunde wegen Übersetzungen informieren
- Mit angemessener Rolle "durchklicken"
- CHANGELOG-Eintrag unter "unreleased" unten hinzufügen