Een hack die je pas na weken ontdekt, kost meer dan een hack die je binnen een uur ziet. Logging en alerting bepalen welke van de twee jou overkomt.
Een hack die je pas na weken ontdekt, kost meer dan een hack die je binnen een uur ziet. Logging en alerting bepalen welke van de twee jou overkomt.
In de OWASP Top 10:2025 heet dit A09 Security Logging & Alerting Failures. Let op het woord alerting. Een log die niemand leest of waar nooit een alarm uit komt, heeft bij een incident weinig waarde.
Dit artikel beschrijft welke events je vastlegt, hoe lang je ze bewaart, waar je ze naartoe stuurt en welke alerts de moeite waard zijn. Voor Magento, Shopify en Laravel.
Waarom logging zo vaak ontbreekt
Bij audits zien we steeds hetzelfde beeld:
- De webserver-logs bestaan, maar roteren na een paar dagen weg.
- Er is geen overzicht van wie wat in de admin heeft gedaan.
- Logs staan alleen op de server die gehackt is, dus een aanvaller kan ze wissen.
- Alerts gaan naar een mailbox die niemand leest, of er zijn er zoveel dat iedereen ze negeert.
Het gevolg komt terug in elk incident: je weet dat je gehackt bent, maar niet sinds wanneer, hoe, en wat er is aangeraakt. Dat maakt herstel en de afweging rond de meldplicht (72 uur bij de Autoriteit Persoonsgegevens, AVG art. 33) veel moeilijker. Het hoort bij je incident response plan.
Welke events log je?
Begin met events die het meeste zeggen over misbruik. Een praktische lijst:
Authenticatie en toegang
- Admin-logins, geslaagd en mislukt, met IP en user-agent
- Wachtwoord-resets en wijzigingen van e-mailadres bij admin-accounts
- 2FA-wijzigingen (uitgeschakeld, nieuw apparaat)
- Aanmaken, wijzigen of verwijderen van admin-gebruikers en rollen
- Wijzigingen in API-integraties en tokens
- Klantlogins, in elk geval de mislukte, voor credential stuffing
Configuratie en betalingen
- Wijzigingen in betaalmethoden en betaalprovider-instellingen
- Wijzigingen in verzend- en prijsinstellingen waar fraude mee mogelijk is
- Wijzigingen in CSP, scripts en tracking-codes die op de checkout geladen worden
- Wijzigingen in CMS-blokken en pagina's met JavaScript (een favoriete plek voor skimmers)
- Wijzigingen aan systeemconfiguratie en cron
Bestanden en code
- Nieuwe of gewijzigde bestanden in webroot,
app/,vendor/enpub/ - Nieuwe PHP-bestanden in upload- of mediamappen (zou nooit moeten)
- Wijzigingen aan
.htaccess, nginx-config encomposer.json/composer.lockbuiten een deploy
Applicatie en verkeer
- 5xx-fouten en pieken daarin
- Verdachte requests: pogingen op bekende exploit-paden, ongebruikelijke REST-aanroepen, grote aantallen 404's
- Uitgaande verbindingen vanaf de webserver naar onverwachte bestemmingen
- Grote exports (klanten, orders) en bulk-API-aanroepen
Wat log je niet?
Logging kan zelf een privacyprobleem zijn. Leg niet vast:
- wachtwoorden, ook niet bij mislukte logins (gebruikers typen soms hun wachtwoord in het e-mailveld)
- volledige kaartgegevens of CVV (dat is ook een PCI DSS-kwestie, zie PCI DSS 4.0 voor webshops)
- sessietokens, API-keys en andere secrets
- complete request-bodies met persoonsgegevens, tenzij je een duidelijke reden hebt
- meer persoonsgegevens dan nodig voor het doel
Maskeer of laat weg wat je niet nodig hebt. Logging die zelf een datalek veroorzaakt, werkt averechts.
Bewaartermijn en AVG
Er is geen wettelijk getal dat voor alle webshops geldt. Het hangt af van doel en risico. Een gangbare werkwijze:
| Soort log | Richtlijn voor bewaren |
|---|---|
| Security-events (admin-acties, auth) | Genoeg om een incident van maanden terug te kunnen reconstrueren, vaak 6 tot 12 maanden |
| Webserver access logs | Korter, omdat ze veel IP-adressen bevatten, bijvoorbeeld enkele weken tot enkele maanden |
| Betaalgerelateerde systemen | Houd rekening met de eisen van PCI DSS en je acquirer |
Dit zijn praktische richtlijnen, geen juridisch advies. Een IP-adres is een persoonsgegeven, dus je hebt een grondslag nodig (gerechtvaardigd belang voor beveiliging is gebruikelijk), een bewaartermijn die je kunt onderbouwen, en je legt het vast in je verwerkingsregister en privacyverklaring. Leg de termijn vast en laat logs daarna ook echt verdwijnen.
Voor PCI DSS 4.0 gelden eigen eisen voor logging en bewaren. Heb je een QSA of acquirer, volg dan hun eisen. Lees ook onze PCI DSS-pagina.
Centraliseren: logs buiten de server
Dit is het belangrijkste architectuurpunt. Een aanvaller met toegang tot je server kan lokale logs aanpassen of verwijderen. Stuur logs daarom weg.
Opties, van licht naar zwaar:
- Logs doorsturen naar een externe logdienst (hosted log management). Weinig onderhoud, goed voor kleine teams.
- Een eigen stack zoals Loki/Grafana of een ELK-opzet. Meer controle, meer beheer.
- Syslog naar een aparte, beveiligde server met alleen-schrijven rechten voor de bron.
Wat je hoe dan ook wilt:
- Tijdsynchronisatie (NTP) op alle servers, anders kloppen tijdlijnen niet.
- Een vast logformat (bij voorkeur gestructureerd, zoals JSON), zodat je kunt zoeken en filteren.
- Toegang tot logs beperkt tot wie het nodig heeft. Logs bevatten gevoelige informatie.
- Een test: kun je een incident van vorige maand nog terugvinden?
Draai je op Hypernode of vergelijkbare managed hosting, dan bepaalt het platform welke logs je kunt bereiken. Zie Magento hosting. Vraag vooraf na hoe lang logs beschikbaar zijn en hoe je ze exporteert.
Specifiek per platform
Magento. In Magento Open Source mis je vaak een volledige audittrail van beheeracties. Dat kun je oplossen met een gecontroleerde extensie of maatwerk, en met logging op database- of webserverniveau. Let opvar/log (systeem- en debuglogs) en de nginx/PHP-FPM-logs. Zet monitoring op wijzigingen aan bestanden in app/, pub/ en vendor/.
Shopify. Je hebt geen servertoegang. Shopify toont activiteit van medewerkers en wijzigingen in de admin, en je ziet de installatie van apps. Zet notificaties aan voor nieuwe staff-accounts en app-installaties, en controleer periodiek wie toegang heeft. Zie Shopify security.
Laravel en Filament. Je hebt veel zelf in de hand. Gebruik de logkanalen van Laravel (stack, daily, naar een externe dienst), leg audit-events vast voor beheeracties in Filament, en log mislukte logins en autorisatiefouten. Zie de Laravel security checklist en de Filament-checklist.
Alerts die je wel leest
Het doel is weinig alerts, hoge precisie. Wie elke dag vijftig meldingen krijgt, leest er binnen een maand geen één meer.
Een nuttige eerste set, gerangschikt naar urgentie:
| Alert | Urgentie |
|---|---|
| Nieuwe admin-gebruiker aangemaakt buiten kantoortijd of door onbekende | Direct |
| 2FA uitgeschakeld voor een admin | Direct |
| Betaalmethode of betaalprovider-instellingen gewijzigd | Direct |
Nieuw PHP-bestand in pub/media of andere uploadmap | Direct |
Wijziging in checkout-scripts of CMS-blok met | Direct |
| Admin-login vanuit nieuw land of nieuwe IP | Zelfde dag |
| Veel mislukte admin-logins in korte tijd | Zelfde dag |
| Piek in 5xx-fouten | Zelfde dag |
Gewijzigd lockfile of vendor/ buiten een deploy | Zelfde dag |
| Afwijkend uitgaand verkeer | Zelfde dag |
Regels voor goede alerts:
- Koppel elk alert aan een actie. Als je niet weet wat je ermee moet doen, schrap het.
- Beperk de kring. Eén of twee mensen met een duidelijke eigenaar, plus een vervanger.
- Stuur kritieke alerts naar een kanaal waar je ze ziet, bijvoorbeeld chat of telefoon, niet alleen e-mail.
- Test je alerts. Maak een testgebruiker aan en kijk of het alarm afgaat.
- Evalueer maandelijks. Welke alerts leidden tot niets? Pas aan of verwijder.
Een alert op "iets lijkt raar" is geen alert. Een alert op "nieuw admin-account aangemaakt om 03:12" is er wel een.
Een kleine start voor wie bijna niets heeft
Geen security-team nodig. Stap voor stap:
- Zorg dat webserver- en applicatielogs minimaal drie maanden bewaard blijven en buiten de server staan.
- Log admin-logins en wijzigingen aan gebruikers en rollen.
- Zet file integrity monitoring aan op code- en uploadmappen.
- Stel de vijf directe alerts uit de tabel in.
- Oefen één keer: wie krijgt de melding, en wat doet diegene?
Dat is een middag tot enkele dagen werk, afhankelijk van je platform. Het levert veel op bij elk volgend incident.
Veelgestelde vragen
Hoe lang moet ik logs van mijn webshop bewaren?
Er is geen vaste wettelijke termijn voor alle webshops. Voor security-events is een periode die een incident van maanden terug kan reconstrueren gebruikelijk, vaak 6 tot 12 maanden. Voor access logs met IP-adressen kies je korter en onderbouw je de termijn. Heb je PCI DSS-verplichtingen, volg dan de eisen van je QSA of acquirer.
Is een IP-adres in een log een persoonsgegeven?
Ja, onder de AVG kan een IP-adres een persoonsgegeven zijn. Je hebt een grondslag nodig, meestal gerechtvaardigd belang voor beveiliging, en een bewaartermijn die je kunt uitleggen. Neem het op in je privacyverklaring.
Waarom moeten logs buiten de server staan?
Omdat een aanvaller met servertoegang lokale logs kan aanpassen of wissen. Logs op een aparte plek, waar de bron alleen kan schrijven, blijven bruikbaar bij een incident.
Welke alerts zijn het belangrijkst?
Wijzigingen die direct geld of toegang raken: nieuwe admin-gebruikers, uitgeschakelde 2FA, gewijzigde betaalinstellingen, nieuwe PHP-bestanden in uploadmappen en wijzigingen in checkout-scripts. Begin daarmee en breid later uit.
Moet ik een SIEM aanschaffen?
Voor de meeste webshops niet. Een goede centrale logdienst met een handvol gerichte alerts levert meer dan een SIEM die niemand configureert. Een SIEM wordt pas interessant bij een grotere omgeving met een team dat het kan beheren.
Wil je weten wat jouw shop nu eigenlijk vastlegt, en wat er vandaag ontbreekt? Bekijk onze security audit of stuur ons een bericht via /contact.

Geschreven door Ruthger Idema
15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.
Meer over ons team →

