Kategorien & was protokolliert wird¶
Das Plugin kategorisiert jeden Log-Eintrag automatisch anhand der betroffenen Entität. Insgesamt 13 Rubriken, sortiert nach typischer Audit-Relevanz.
Rubriken-Übersicht¶
Rubrik (category) |
Anzeige-Name | Typische Entities | Audit-Relevanz |
|---|---|---|---|
customer_data |
Kundendaten | customer, customer_address, customer_group |
Hoch — DSGVO-Anfragen, Adressänderungen |
order_data |
Bestelldaten | order, order_line_item, order_delivery, order_transaction, order_address, order_customer |
Hoch — Manipulation an Bestellungen, Statusänderungen |
product_catalog |
Produktkatalog | product, product_variant, product_category, product_price, product_media, category |
Mittel — Preis-/Sortimentsänderungen |
content |
Inhalte | cms_page, cms_section, cms_block, cms_slot, landing_page, mail_template |
Mittel — Schaufenster-Inhalte, Mail-Templates |
admin_user |
Admin-User | user, user_access_key, acl_role, acl_user_role |
Sehr hoch — Privilege-Escalation, Account-Übernahme |
system_config |
System-Konfiguration | system_config, plugin, app, theme |
Hoch — Plugin-Settings, Sicherheitsrelevante Konfigs |
sales_channel |
Sales-Channel | sales_channel, sales_channel_domain, sales_channel_payment_method, sales_channel_shipping_method |
Mittel — Shop-Konfig-Änderungen |
rules_flows |
Regeln & Flows | rule, flow, flow_sequence, state_machine |
Mittel — Automatisierungs-Logik |
promotion |
Aktionen & Promotions | promotion, promotion_discount, promotion_individual_code |
Mittel — Rabatt-Manipulation |
newsletter |
Newsletter | newsletter_recipient, mail_template_type |
Niedrig — DSGVO-Opt-In-Verifikation |
authentication |
Authentifizierung | (kein Entity — direkt aus Auth-Subscriber) | Sehr hoch — Brute-Force-Erkennung, Login-Anomalien |
other |
Sonstiges | alle nicht zugeordneten Entities | Niedrig — i. d. R. selten relevant |
Was wird konkret protokolliert?¶
Entity-Änderungen (Create / Update / Delete)¶
Jede DAL-Operation im Admin-Context wird abgefangen. Pro Operation entsteht ein Eintrag:
- Create → neuer Eintrag,
diffenthält alle initial gesetzten Felder - Update → ein Eintrag pro Feld-Änderung,
diffenthält{feldName: {old: vor, new: nach}} - Delete → ein Eintrag,
diffenthält den letzten bekannten Zustand der gelöschten Entität
Nur Admin-Context, kein Storefront
Schreib-Operationen, die aus dem Storefront kommen (z. B. neuer Newsletter-Eintrag, Customer-Adress-Änderung im Account, Bestellung anlegen), werden nicht protokolliert — das wäre ein anderer Use-Case (Customer-Auditing) und würde die Tabelle in Sekunden fluten. Filter: actor_type = admin oder integration.
Authentifizierung¶
Aktion (action) |
Trigger | Felder im Eintrag |
|---|---|---|
login_success |
erfolgreicher Login an /api/oauth/token |
actor_username, optional ip_address, user_agent |
login_failed |
fehlgeschlagener Login (HTTP 401 / 400 vom Token-Endpoint) | actor_username (eingegebener Username), HTTP-Status-Code |
logout |
expliziter Logout im Admin | actor_user_id, actor_username |
Login-Failed-Anomalien erkennen
Wenn du im Modul nach category=authentication und action=login_failed filterst, siehst du sofort fehlgeschlagene Login-Versuche. Häufung in kurzer Zeit oder mit ständig wechselnden Usernames deutet auf Brute-Force-Versuche hin. Ergänzend kannst du IP-Erfassung in der Konfig aktivieren — dann siehst du, ob die Versuche von einer IP kommen.
Plugin-Lifecycle¶
| Aktion | Trigger |
|---|---|
plugin_install |
Plugin via Store oder ZIP installiert |
plugin_activate |
Plugin aktiviert |
plugin_deactivate |
Plugin deaktiviert |
plugin_uninstall |
Plugin deinstalliert |
plugin_update |
Plugin-Update durchgeführt |
entity_name = plugin, entity_label = <PluginName>, category = system_config.
Diff-Inhalt¶
Das diff-Feld ist JSON mit dem Schema:
{
"feldName": {
"old": "alter Wert",
"new": "neuer Wert"
},
"andererFeld": {
"old": null,
"new": "neuer Wert"
}
}
Sonderfälle:
- Sensitive Felder (
password,apiKey,token, …) → Werte sind als***ersetzt - Strings > 2000 Zeichen → Wert wird als
[truncated: 12345 chars]markiert (Original zu lang) - Arrays/Objects > 4 KB → Wert wird ebenfalls truncated, um DB-Spam zu vermeiden
- Bei
delete→newistnullbei allen Feldern (Eintrag wurde entfernt) - Bei
create→oldistnullbei allen Feldern (Eintrag war vorher nicht existent)
Beispiel-Einträge¶
Beispiel 1: Preisänderung an einem Produkt
{
"actor_username": "max.muster",
"actor_type": "admin",
"category": "product_catalog",
"action": "update",
"entity_name": "product_price",
"entity_id": "abc123…",
"entity_label": "Test-Produkt (Variante 42)",
"diff": {
"gross": {"old": 19.99, "new": 24.99},
"net": {"old": 16.80, "new": 21.00}
},
"created_at": "2026-06-18 14:32:11"
}