Звичайні логи застосунку відповідають на питання «що зламалося». Журнал аудиту відповідає на інші: хто, що, коли й до чого отримав доступ чи змінив. Без нього після інциденту неможливо з'ясувати масштаб витоку, а в разі спору - довести, хто виконав дію.
Які події записувати:
- автентифікація: успішні й невдалі входи, вихід, зміна пароля, увімкнення/вимкнення 2FA, скидання пароля;
- зміна прав: призначення ролей, запрошення в команду, видача й відкликання токенів;
- доступ до чутливих даних: перегляд персональних даних, експорт, завантаження документів;
- адміністративні дії: «увійти як користувач», зміна налаштувань безпеки, видалення даних;
- відмови в доступі (403) - серія відмов від одного користувача часто означає спробу перебору ідентифікаторів.
Структура запису:
{
"at": "2026-10-04T10:15:00Z",
"actor": {"type": "user", "id": 42, "impersonated_by": null},
"action": "invoice.downloaded",
"subject": {"type": "invoice", "id": 1041},
"tenant_id": 7,
"ip": "203.0.113.5",
"user_agent": "...",
"request_id": "9f2c...",
"result": "allowed"
}
Вимоги до журналу аудиту:
- незмінність: запис лише додається; адміністратори застосунку не можуть його змінити чи видалити. Окреме сховище чи таблиця з правами лише на вставку, експорт у зовнішню систему (SIEM);
- без секретів: паролі, токени, повні номери карток - ніколи;
- мінімізація персональних даних: записувати ідентифікатори, а не вміст документів; врахувати вимоги GDPR щодо зберігання й видалення;
- узгоджений час (UTC) і ідентифікатор запиту, щоб зв'язати з рештою логів;
- термін зберігання відповідно до регуляторних вимог.
У Laravel:
spatie/laravel-activitylog- журнал змін моделей і власних подій;- події автентифікації (
Login,Failed,Logout,PasswordReset) - слухачі, що пишуть у журнал; Gate::after- зручне місце, щоб фіксувати рішення авторизації для чутливих дій.
Журнал без моніторингу допомагає лише після інциденту. Сповіщення на аномалії - масовий експорт, вхід адміністратора з нової країни, сотні відмов у доступі за хвилину - дають змогу помітити атаку, поки вона триває.