Skip to content

PERSON: Benutzer-Zugang entfernen #2069

@Michael-Schaer

Description

@Michael-Schaer

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:

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_at und blocked_at auf Person, beide datetime, default nil
  • 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. nil und in diesem Fall keine Personen suchen
      • Im PBS Wagon auf 18 Monate setzen
    • Setzt die Spalte inactivity_block_warning_sent_at auf DateTime.now
    • Sendet ein neues CustomContent Mail das die Person über die bevorstehende Löschung informiert. Solche Mails können mit der Methode custom_content_mail in einem Mailer versendet werden (dafür auch einen eigenen Mailer anlegen).
  • 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 deren blocked_at leer ist
      • Y Monate ist in den settings.yml konfigurierbar, standardmässig im Core eine extrem lange Zeit oder z.B. nil und in diesem Fall keine Personen suchen
      • Im PBS Wagon auf 1 Monat setzen
    • Setzt die Spalte blocked_at auf DateTime.now
  • Auf dem Sicherheits-Tab einer Person in den beiden Fällen email_compromised_situation und suspend_person_situation je einen Button "Zugang blockieren" einbauen
    • Button taucht nur auf, wenn die last_sign_in_at nicht leer ist
    • Button ruft eine neue POST-Action block im SecurityToolsController auf
      • Action verweigert, dass man sich selber oder sich als Imitator blockiert (@user darf weder current_person noch origin_user sein)
      • Action setzt blocked_at der Person auf DateTime.now und zeigt Flash-Nachricht
    • Falls die Person bereits blockiert ist (blocked_at ist nicht nil):
      • 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 nil sind 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 unblock im SecurityToolsController auf
        • Action setzt blocked_at und inactivity_block_warning_sent_at auf nil und zeigt Flash-Nachricht
  • 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 unblock im SecurityToolsController auf
  • 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
  • Für die eigentliche Sperrung eine neue before_action im ApplicationController anlegen
    • In diesem Hook überprüfen, ob current_person.blocked_at.present?, und wenn ja, eine spezielle minimalistische View rendern (ein render in diesem Hook müsste den Rest der Action abbrechen, falls nicht müsste es mit einem redirect gehen)
    • 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_action Hook 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 separater Datenbankmigration alle Personen suchen, deren last_sign_in_at bereits jetzt älter als X + Y Monate ist, und bei diesen Personen block_warning_sent_at auf 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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions