-- 047_security_events.sql -- Журнал событий безопасности и входа (Tier 1 + Tier 2 плана логирования). -- -- Отдельная таблица, НЕ admin_audit_log, потому что: -- • автор часто аноним (у неудачного логина ещё нет user_id); -- • объём может быть большим (боты долбят логин / rate-limit); -- • свой ретеншн (чистится агрессивнее, чем осознанные админ-действия). -- admin_audit_log остаётся домом для привилегированных действий (Tier 3). -- -- category: -- auth — login.success | login.fail | register | password.change -- access_denied — forbidden (роль) | perm_denied (разрешение) -- rate_limit — rate_limited (превышение лимита запросов) CREATE TABLE IF NOT EXISTS security_events ( id INTEGER PRIMARY KEY AUTOINCREMENT, category TEXT NOT NULL CHECK (category IN ('auth','access_denied','rate_limit')), event TEXT NOT NULL, user_id INTEGER REFERENCES users(id) ON DELETE SET NULL, email TEXT, -- email из попытки/связанный (для анонимных) ip TEXT, user_agent TEXT, method TEXT, route TEXT, detail TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_sec_events_date ON security_events (created_at DESC); CREATE INDEX IF NOT EXISTS idx_sec_events_category ON security_events (category, created_at DESC); CREATE INDEX IF NOT EXISTS idx_sec_events_email ON security_events (email); CREATE INDEX IF NOT EXISTS idx_sec_events_ip ON security_events (ip); CREATE INDEX IF NOT EXISTS idx_sec_events_user ON security_events (user_id);