Direkt zum Inhalt springen
pixelwerft klärt auf

Login-Aktivität im Craft CMS protokollieren

Wer hat sich wann eingeloggt, woher kamen die Versuche, wann lief die Session ab? Mit einem sauberen Audit-Log lassen sich diese Fragen beantworten – für Compliance, Security und ein ruhigeres Backend.

In jedem produktiven CMS läuft irgendwann die gleiche Diskussion: Wer hatte vor zwei Wochen Zugriff auf den Kundenbereich? Warum sind gestern Nacht 180 fehlgeschlagene Login-Versuche aufgelaufen? Und aus welchem Netz kam der Admin, der um 3 Uhr morgens ein Entry veröffentlicht hat?

Ohne Protokoll bleiben diese Fragen unbeantwortet. Wir haben deshalb ein Open-Source-Plugin für Craft CMS entwickelt, das genau diese Ereignisse automatisch erfasst: pixelwerft/user-audit. Das Plugin steht unter MIT-Lizenz auf GitHub zur Verfügung und ist auch direkt über den Craft-Plugin-Store installierbar.

User-Audit-Plugin für Craft CMS – Login-Aktivität protokollieren, entwickelt von pixelwerft in St.Gallen

Warum ein Audit-Log überhaupt?

Ein Audit-Log ist nicht «nice to have», sondern in mehreren Alltagssituationen die einzige verlässliche Informationsquelle:

  • Security: Brute-Force-Angriffe auf Login-Formulare sind alltäglich. Ohne Log siehst du sie nicht – und kannst nicht reagieren.
  • Compliance: Nach einem Datenschutzvorfall musst du nachweisen können, wer wann auf was zugegriffen hat. Das geht nur mit Historie.
  • Support & Nachvollziehbarkeit: Wenn im Backend ein Inhalt «plötzlich weg» ist, hilft ein Blick in die Aktivitätsliste meistens schneller als jedes Backup.
  • Betrieb: Aktive Sessions auf einen Blick – praktisch, wenn du vor einem Deploy wissen willst, ob gerade jemand im Backend arbeitet.

Was wird automatisch erfasst?

Das Plugin klinkt sich in die Craft-Events ein und protokolliert, ohne dass du Code anpassen musst:

  • Erfolgreiche Logins (Control Panel und Frontend)
  • Fehlgeschlagene Login-Versuche – mit E-Mail und IP
  • Blockierte Logins (z. B. bei gesperrten Accounts)
  • Logouts und abgelaufene Sessions
  • Custom-Events aus anderen Plugins oder Modulen (über eine einfache API)

Zu jedem Eintrag speichert das Plugin einen breiten Kontext: IP-Adresse, User-Agent, ausgelesene Geräte-, Betriebssystem- und Browser-Informationen, ob der Zugriff über das Control Panel oder das Frontend kam, ob es eine PWA oder ein normaler Browser war, sowie eine Momentaufnahme der User-Gruppen-Mitgliedschaft. Bei Bedarf kommen zusätzlich eigene Metadaten als JSON dazu.

Der Log-Viewer im Control Panel

Im Craft-Admin kommt ein neuer Navigations-Eintrag dazu. Der Viewer zeigt alle Einträge tabellarisch, mit Live-Filter über Event-Typ, User, IP und Zeitraum. Für externe Auswertungen lassen sich die Ergebnisse als CSV exportieren. Eine separate Ansicht listet alle aktiven Sessions – praktisch vor Wartungs- oder Deploy-Fenstern.

Der Zugriff ist über eine dedizierte Berechtigung gesteuert: Nur User mit der Permission «View activity log» sehen den Eintrag in der Navigation. So lässt sich der Audit-Log zielgerichtet z. B. an eine Datenschutz- oder Security-Rolle vergeben, ohne gleich Admin-Rechte verteilen zu müssen.

Dashboard-Widget für den Überblick

Zusätzlich gibt es ein Widget für das Craft-Dashboard. Es zeigt auf einen Blick die letzten 24 Stunden: erfolgreiche Logins, Logouts, fehlgeschlagene Versuche – und die fünf IPs, von denen gerade am meisten fehlerhafte Versuche auflaufen. Wenn dort plötzlich eine unbekannte IP mit 400 Versuchen steht, weisst du Bescheid.

Schutz vor Brute-Force: Login-Throttling

Das Plugin bringt ein integriertes Sliding-Window-Throttling mit. Pro IP und pro E-Mail-Adresse lässt sich definieren, wie viele Fehlversuche innerhalb welchen Zeitfensters erlaubt sind. Wird das Limit überschritten, beantwortet Craft weitere Versuche direkt mit HTTP 429 Too Many Requests – ohne die Datenbank weiter zu belasten und ohne dass die echten Credentials überhaupt geprüft werden.

Das schneidet klassische Credential-Stuffing-Attacken an der Wurzel ab. Die Schwellenwerte sind in den Plugin-Settings konfigurierbar, damit sie zum realen Nutzungsverhalten deiner Redaktion passen.

«Von einem neuen Ort eingeloggt» – E-Mail-Alerts

Wenn sich ein User zum ersten Mal von einer IP-Adresse einloggt, die in einem konfigurierbaren Rückblickfenster noch nie aufgetaucht ist, verschickt das Plugin automatisch eine Hinweis-Mail an den betreffenden Account. Das ist dasselbe Muster, das grosse Plattformen wie Google oder GitHub nutzen – und es fängt einen Grossteil kompromittierter Accounts ab, bevor Schaden entsteht.

Data Retention: alte Einträge sauber aufräumen

Ein Audit-Log wächst schnell. Damit die Datenbank nicht langsam zuwuchert, bringt das Plugin einen Console-Command mit, der Einträge älter als X Tage löscht. Typischerweise hinterlegst du diesen Command einmalig in deinem Cron und vergisst ihn danach. Die Retention-Dauer legst du in den Settings fest; 0 bedeutet «nie löschen».

Für Entwickler: Custom Events und Self-Service

Zwei Schnittstellen sind bewusst für andere Plugins und für die User selbst gedacht:

  • Custom Event API: Eigene Module können beliebige Ereignisse in die gleiche Audit-Tabelle schreiben – zum Beispiel «Rechnung exportiert», «Vertrag freigegeben» oder «Kampagne versendet». Alles, was du im Backend nachvollziehen können willst.
  • Self-Service-Login-Historie: Ein JSON-Endpoint im Frontend gibt einem eingeloggten User die eigene Login-Historie zurück. Damit lässt sich z. B. eine «Letzte Anmeldungen»-Seite im Kundenbereich bauen, ganz ohne Admin-Zugang.

Installation und Konfiguration

Die Installation ist ein Zweizeiler über Composer:

  • composer require pixelwerft/user-audit
  • ./craft plugin/install user-audit

Alternativ findest du das Plugin im Craft-Plugin-Store und installierst es dort per Klick. Nach der Installation gehst du in Settings → Plugins → User Audit und stellst ein, was für dein Projekt passt: ob Control Panel und/oder Frontend geloggt werden sollen, wie streng das Throttling greift, wie lang die Retention ist und wann ein «neuer Ort»-Alert verschickt wird.

Die Daten liegen in einer eigenen Tabelle user_activity_log (mit dem konfigurierten Craft-Tabellen-Präfix) und haben eine SET NULL-Foreign-Key auf die User-Tabelle. Das heisst: Selbst wenn ein User später gelöscht wird, bleiben die Audit-Einträge erhalten – nur der Referenz-Pointer wird entfernt. Genau das Verhalten, das man in einer Compliance-Diskussion braucht.

Open Source, MIT, auf GitHub

Wir haben das Plugin bewusst als Open Source veröffentlicht. Audit-Logs sind Security-relevant – und bei allem, was Security berührt, ist Transparenz im Quellcode Gold wert. Issues, Pull Requests und Diskussionen sind auf GitHub willkommen:

github.com/pixelwerft/user-audit

Direkt aus dem Craft Plugin Store

Wer lieber mit einem Klick installiert statt über Composer, findet User Audit auch offiziell gelistet – Hier im offiziellen Plugin Store. Bonus Pixel

Häufige Fragen

Wozu brauche ich überhaupt ein Audit-Log für mein Craft CMS?

Ein Audit-Log ist in mehreren Alltagssituationen die einzige verlässliche Informationsquelle. Es macht Brute-Force-Angriffe auf das Login sichtbar, liefert nach einem Datenschutzvorfall den Nachweis, wer wann auf was zugegriffen hat, hilft im Support beim Nachvollziehen verschwundener Inhalte und zeigt vor einem Deploy die aktiven Sessions. Ohne Protokoll bleiben diese Fragen schlicht unbeantwortet.

Welche Login-Ereignisse erfasst das Plugin automatisch?

Das Plugin klinkt sich ohne Code-Anpassung in die Craft-Events ein und protokolliert erfolgreiche Logins im Control Panel und Frontend, fehlgeschlagene Versuche mit E-Mail und IP, blockierte Logins bei gesperrten Accounts sowie Logouts und abgelaufene Sessions. Zu jedem Eintrag wird ein breiter Kontext gespeichert: IP-Adresse, User-Agent, Geräte-, Betriebssystem- und Browser-Infos, die Herkunft des Zugriffs und eine Momentaufnahme der User-Gruppen. Über eine API lassen sich zusätzlich Custom-Events aus anderen Modulen erfassen.

Wie schützt das Plugin vor Brute-Force- und Credential-Stuffing-Angriffen?

Es bringt ein integriertes Sliding-Window-Throttling mit, bei dem sich pro IP und pro E-Mail-Adresse festlegen lässt, wie viele Fehlversuche in welchem Zeitfenster erlaubt sind. Wird das Limit überschritten, antwortet Craft mit HTTP 429 Too Many Requests, ohne die Datenbank zu belasten und ohne die echten Credentials überhaupt zu prüfen. Die Schwellenwerte sind in den Plugin-Settings konfigurierbar, sodass sie zum realen Nutzungsverhalten der Redaktion passen.

Werde ich gewarnt, wenn sich jemand von einem unbekannten Ort einloggt?

Ja. Loggt sich ein User zum ersten Mal von einer IP-Adresse ein, die in einem konfigurierbaren Rückblickfenster noch nie aufgetaucht ist, verschickt das Plugin automatisch eine Hinweis-Mail an den betroffenen Account. Das ist dasselbe Muster, das grosse Plattformen wie Google oder GitHub nutzen, und es fängt einen Grossteil kompromittierter Accounts ab, bevor Schaden entsteht.

Wie wird das Plugin installiert und was passiert mit den Daten?

Die Installation läuft als Zweizeiler über Composer, alternativ per Klick aus dem offiziellen Craft Plugin Store. Die Einträge liegen in einer eigenen Tabelle mit einer SET-NULL-Beziehung auf die User-Tabelle, sodass Audit-Einträge auch nach dem Löschen eines Users erhalten bleiben. Über einen Console-Command lassen sich Einträge, die älter als eine konfigurierbare Frist sind, automatisiert aufräumen, wobei der Wert null für nie löschen steht.

Manuel Thaler – pixelwerft GmbH

Craft-Projekt absichern oder erweitern?

Wir setzen User-Audit in eigenen Kundenprojekten ein und begleiten Craft-CMS-Projekte von der Plugin-Integration bis zur kompletten Applikationsarchitektur. Wenn du Fragen zum Plugin, zu Backend-Security oder zu einer eigenen Integration hast – schreib uns.

ahoi@pixelwerft.ch

← Zurück zur Übersicht aller Fragen & Antworten