From 591dc75d1ee992f28f2d3bb2dcf1fc899c0b9fa2 Mon Sep 17 00:00:00 2001 From: Anso Date: Sat, 18 Apr 2026 18:24:27 -0400 Subject: [PATCH] feat(audit-log): signal rail, day-banded stream, anomaly detection (#682) Add a Stream view to the Audit Log that leads with a four-tile signal rail (events, actors, failure rate with inline sparkline, peak hour) and presents the feed grouped by day with severity dots, relative times, and inline anomaly callouts. The existing Table view is preserved behind a toggle for power users. Anomaly flags are computed at read time against strictly prior history and returned on demand via ?with_anomalies=1: - unusual_hour: hour outside the actor's central 7-day window - new_ip: IP unseen for this actor in the last 30 days - first_seen_actor: no prior history in the 30-day window New /audit-log/stats endpoint returns the signal-rail aggregates over 24h/7d/30d windows; stats are derived from a single 30-day scan. --- .../__tests__/audit-anomaly-service.test.ts | 169 ++++++ backend/src/index.ts | 36 +- backend/src/services/AuditAnomalyService.ts | 180 ++++++ backend/src/services/DatabaseService.ts | 6 + docs/features/audit-log.mdx | 51 +- docs/images/audit-log/audit-stream.png | Bin 0 -> 131509 bytes frontend/src/components/AuditLogView.tsx | 564 ++++++++++++++---- 7 files changed, 868 insertions(+), 138 deletions(-) create mode 100644 backend/src/__tests__/audit-anomaly-service.test.ts create mode 100644 backend/src/services/AuditAnomalyService.ts create mode 100644 docs/images/audit-log/audit-stream.png diff --git a/backend/src/__tests__/audit-anomaly-service.test.ts b/backend/src/__tests__/audit-anomaly-service.test.ts new file mode 100644 index 00000000..e1db5a33 --- /dev/null +++ b/backend/src/__tests__/audit-anomaly-service.test.ts @@ -0,0 +1,169 @@ +import { describe, it, expect } from 'vitest'; +import { + annotateEntries, + computeAuditStats, + isUnusualHour, +} from '../services/AuditAnomalyService'; +import type { AuditLogEntry } from '../services/DatabaseService'; + +const HOUR = 60 * 60 * 1000; +const DAY = 24 * HOUR; + +function entry(overrides: Partial = {}): AuditLogEntry { + return { + id: 0, + timestamp: Date.now(), + username: 'alice', + method: 'POST', + path: '/api/stacks/deploy', + status_code: 200, + node_id: null, + ip_address: '10.0.0.1', + summary: 'Deployed stack web', + ...overrides, + }; +} + +describe('AuditAnomalyService - isUnusualHour', () => { + it('returns false when baseline is too small to trust', () => { + expect(isUnusualHour(3, [9, 10, 11])).toBe(false); + }); + + it('returns false when hour is inside the actor typical range', () => { + const baseline = [9, 10, 10, 11, 11, 12, 13, 14, 15, 16]; + expect(isUnusualHour(11, baseline)).toBe(false); + }); + + it('returns true when hour is well outside the baseline', () => { + const baseline = [9, 10, 10, 11, 11, 12, 13, 14, 15, 16]; + expect(isUnusualHour(3, baseline)).toBe(true); + }); +}); + +describe('AuditAnomalyService - annotateEntries', () => { + it('flags first_seen_actor when the actor has no prior history', () => { + const now = Date.now(); + const current = [entry({ id: 1, timestamp: now, username: 'newbie' })]; + const result = annotateEntries(current, [], now); + expect(result[0].flags).toContain('first_seen_actor'); + }); + + it('does not flag first_seen_actor when actor appears in history', () => { + const now = Date.now(); + const history = [entry({ id: 1, timestamp: now - DAY, username: 'alice' })]; + const current = [entry({ id: 2, timestamp: now, username: 'alice' })]; + const result = annotateEntries(current, history, now); + expect(result[0].flags).not.toContain('first_seen_actor'); + }); + + it('flags new_ip when actor has history but not from this ip', () => { + const now = Date.now(); + const history = Array.from({ length: 6 }, (_, i) => + entry({ id: i + 1, timestamp: now - (i + 1) * HOUR, ip_address: '10.0.0.1' }) + ); + const current = [entry({ id: 99, timestamp: now, ip_address: '45.76.1.2' })]; + const result = annotateEntries(current, history, now); + expect(result[0].flags).toContain('new_ip'); + }); + + it('does not flag new_ip when ip matches historical value', () => { + const now = Date.now(); + const history = [entry({ id: 1, timestamp: now - HOUR, ip_address: '10.0.0.1' })]; + const current = [entry({ id: 2, timestamp: now, ip_address: '10.0.0.1' })]; + const result = annotateEntries(current, history, now); + expect(result[0].flags).not.toContain('new_ip'); + }); + + it('ignores ips older than the 30-day window when scoring new_ip', () => { + const now = Date.now(); + const history = [ + entry({ id: 1, timestamp: now - 45 * DAY, ip_address: '10.0.0.9' }), + entry({ id: 2, timestamp: now - 2 * DAY, ip_address: '10.0.0.1' }), + ]; + const current = [entry({ id: 3, timestamp: now, ip_address: '10.0.0.9' })]; + const result = annotateEntries(current, history, now); + expect(result[0].flags).toContain('new_ip'); + }); + + it('flags unusual_hour when entry falls outside the 7-day hour distribution', () => { + const now = new Date('2026-04-18T03:15:00Z').getTime(); + const history = Array.from({ length: 10 }, (_, i) => { + const ts = new Date('2026-04-15T10:00:00Z').getTime() + i * HOUR * 0.5; + return entry({ id: i + 1, timestamp: ts, ip_address: '10.0.0.1' }); + }); + const current = [entry({ id: 99, timestamp: now })]; + const result = annotateEntries(current, history, now); + expect(result[0].flags).toContain('unusual_hour'); + }); + + it('does not flag unusual_hour when baseline is smaller than the minimum', () => { + const now = Date.now(); + const history = [entry({ id: 1, timestamp: now - HOUR })]; + const current = [entry({ id: 2, timestamp: now })]; + const result = annotateEntries(current, history, now); + expect(result[0].flags).not.toContain('unusual_hour'); + }); + + it('returns empty flags for entries without a username', () => { + const now = Date.now(); + const current = [entry({ id: 1, username: '' })]; + const result = annotateEntries(current, [], now); + expect(result[0].flags).toEqual([]); + }); +}); + +describe('AuditAnomalyService - computeAuditStats', () => { + function buildEntries(now: number): { last24h: AuditLogEntry[]; last7d: AuditLogEntry[]; last30d: AuditLogEntry[] } { + const last24h: AuditLogEntry[] = []; + for (let i = 0; i < 20; i++) { + last24h.push(entry({ + id: i + 1, + timestamp: now - i * HOUR, + status_code: i < 3 ? 500 : 200, + ip_address: i === 5 ? '45.76.1.2' : '10.0.0.1', + })); + } + const older: AuditLogEntry[] = []; + for (let i = 0; i < 60; i++) { + older.push(entry({ + id: 100 + i, + timestamp: now - DAY - i * HOUR, + ip_address: '10.0.0.1', + })); + } + return { + last24h, + last7d: [...last24h, ...older.filter(e => e.timestamp >= now - 7 * DAY)], + last30d: [...last24h, ...older], + }; + } + + it('summarizes events, actors, failures, and peak hour', () => { + const now = new Date('2026-04-18T12:00:00Z').getTime(); + const { last24h, last7d, last30d } = buildEntries(now); + const stats = computeAuditStats({ now, last24h, last7d, last30d }); + expect(stats.events_24h.value).toBe(20); + expect(stats.actors_24h.value).toBe(1); + expect(stats.failure_rate.value).toBe(15); + expect(stats.activity_by_hour).toHaveLength(24); + expect(stats.activity_by_hour.reduce((a, b) => a + b, 0)).toBe(20); + }); + + it('flags the new_ip detail when an actor uses an ip not seen in prior 29 days', () => { + const now = new Date('2026-04-18T12:00:00Z').getTime(); + const { last24h, last7d, last30d } = buildEntries(now); + const stats = computeAuditStats({ now, last24h, last7d, last30d }); + expect(stats.actors_24h.detail).toMatch(/new ip/); + }); + + it('surfaces peak hour when it falls outside working hours', () => { + const now = new Date(2026, 3, 18, 12, 0, 0).getTime(); + const nightBase = new Date(2026, 3, 18, 3, 15, 0).getTime(); + const nightEntries: AuditLogEntry[] = Array.from({ length: 10 }, (_, i) => + entry({ id: i + 1, timestamp: nightBase - i * 5000 }) + ); + const stats = computeAuditStats({ now, last24h: nightEntries, last7d: nightEntries, last30d: nightEntries }); + expect(stats.unusual_hour.severity).toBe('warn'); + expect(stats.unusual_hour.value).toBe(3); + }); +}); diff --git a/backend/src/index.ts b/backend/src/index.ts index 9658893c..412e6ee3 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -27,6 +27,7 @@ import { AutoHealService } from './services/AutoHealService'; import { DockerEventManager } from './services/DockerEventManager'; import { ImageUpdateService } from './services/ImageUpdateService'; import { UpdatePreviewService } from './services/UpdatePreviewService'; +import { annotateEntries, computeAuditStats, HISTORY_WINDOW_MS } from './services/AuditAnomalyService'; import { templateService } from './services/TemplateService'; import { ErrorParser } from './utils/ErrorParser'; import { NodeRegistry } from './services/NodeRegistry'; @@ -6238,11 +6239,25 @@ app.get('/api/audit-log', async (req: Request, res: Response): Promise => const search = req.query.search as string | undefined; const from = req.query.from ? parseInt(req.query.from as string) : undefined; const to = req.query.to ? parseInt(req.query.to as string) : undefined; + const withAnomalies = req.query.with_anomalies === '1'; if (isDebugEnabled()) { console.log(`[Audit:diag] Query: page=${page} limit=${limit} username=${username || '-'} method=${method || '-'} search=${search || '-'}`); } - const result = DatabaseService.getInstance().getAuditLogs({ page, limit, username, method, from, to, search }); + const db = DatabaseService.getInstance(); + const result = db.getAuditLogs({ page, limit, username, method, from, to, search }); + + if (withAnomalies && result.entries.length > 0) { + const now = Date.now(); + const historyFrom = now - HISTORY_WINDOW_MS; + const oldestInPage = result.entries.reduce( + (min, e) => Math.min(min, e.timestamp), + result.entries[0].timestamp + ); + const history = db.getAuditLogsInRange(historyFrom, oldestInPage); + res.json({ ...result, entries: annotateEntries(result.entries, history, now) }); + return; + } res.json(result); } catch (error) { console.error('[AuditLog] Failed to fetch audit log:', error); @@ -6250,6 +6265,25 @@ app.get('/api/audit-log', async (req: Request, res: Response): Promise => } }); +app.get('/api/audit-log/stats', async (req: Request, res: Response): Promise => { + if (!requireAdmiral(req, res)) return; + if (!requirePermission(req, res, 'system:audit')) return; + + try { + const now = Date.now(); + const db = DatabaseService.getInstance(); + const cutoff24h = now - 24 * 60 * 60 * 1000; + const cutoff7d = now - 7 * 24 * 60 * 60 * 1000; + const last30d = db.getAuditLogsInRange(now - HISTORY_WINDOW_MS, now); + const last7d = last30d.filter(e => e.timestamp >= cutoff7d); + const last24h = last7d.filter(e => e.timestamp >= cutoff24h); + res.json(computeAuditStats({ now, last24h, last7d, last30d })); + } catch (error) { + console.error('[AuditLog] Failed to compute audit stats:', error); + res.status(500).json({ error: 'Failed to compute audit stats' }); + } +}); + app.get('/api/audit-log/export', async (req: Request, res: Response): Promise => { if (!requireAdmiral(req, res)) return; if (!requirePermission(req, res, 'system:audit')) return; diff --git a/backend/src/services/AuditAnomalyService.ts b/backend/src/services/AuditAnomalyService.ts new file mode 100644 index 00000000..2a6dae73 --- /dev/null +++ b/backend/src/services/AuditAnomalyService.ts @@ -0,0 +1,180 @@ +import type { AuditLogEntry } from './DatabaseService'; + +export type AnomalyFlag = 'unusual_hour' | 'new_ip' | 'first_seen_actor'; + +export const HISTORY_WINDOW_MS = 30 * 24 * 60 * 60 * 1000; +const HOUR_BASELINE_WINDOW_MS = 7 * 24 * 60 * 60 * 1000; +const MIN_HOURS_FOR_BASELINE = 5; + +/** + * Returns true when `hour` sits outside the central 90% of the actor's + * typical activity window. Requires a minimum baseline to avoid flagging + * actors whose first few logins happen to be during off-hours. + */ +export function isUnusualHour(hour: number, baselineHours: number[]): boolean { + if (baselineHours.length < MIN_HOURS_FOR_BASELINE) return false; + const sorted = [...baselineHours].sort((a, b) => a - b); + const lo = sorted[Math.floor(sorted.length * 0.05)]; + const hi = sorted[Math.floor(sorted.length * 0.95)]; + return hour < lo || hour > hi; +} + +interface ActorBaseline { + hoursLast7d: number[]; + ipsLast30d: Set; +} + +function buildBaselines(history: AuditLogEntry[], now: number): Map { + const baselines = new Map(); + const hourCutoff = now - HOUR_BASELINE_WINDOW_MS; + const ipCutoff = now - HISTORY_WINDOW_MS; + + for (const entry of history) { + if (!entry.username) continue; + let b = baselines.get(entry.username); + if (!b) { + b = { hoursLast7d: [], ipsLast30d: new Set() }; + baselines.set(entry.username, b); + } + if (entry.timestamp >= hourCutoff) { + b.hoursLast7d.push(new Date(entry.timestamp).getHours()); + } + if (entry.timestamp >= ipCutoff && entry.ip_address) { + b.ipsLast30d.add(entry.ip_address); + } + } + return baselines; +} + +/** + * Annotate a page of entries with anomaly flags computed against strictly + * prior history. The caller is responsible for supplying history entries + * that do NOT overlap with the entries being annotated; typically pull + * entries where `timestamp < min(entries.timestamp)` from the last 30 days. + */ +export interface AuditStatTile { + value: number | null; + label: string; + detail: string | null; + severity: 'ok' | 'warn' | 'alert'; +} + +export interface AuditStats { + events_24h: AuditStatTile; + actors_24h: AuditStatTile; + failure_rate: AuditStatTile; + unusual_hour: AuditStatTile; + activity_by_hour: number[]; + failures_by_hour: number[]; +} + +export function computeAuditStats(input: { + now: number; + last24h: AuditLogEntry[]; + last7d: AuditLogEntry[]; + last30d: AuditLogEntry[]; +}): AuditStats { + const { now, last24h, last7d, last30d } = input; + const events24 = last24h.length; + const prior7d = last7d.length - events24; + const avg7dPerDay = Math.max(0, prior7d) / 6; + const deltaPct = avg7dPerDay > 0 ? Math.round(((events24 - avg7dPerDay) / avg7dPerDay) * 100) : null; + + const actors24 = new Set(last24h.map(e => e.username).filter(Boolean)); + const olderIpByActor = new Map>(); + for (const e of last30d) { + if (!e.username || !e.ip_address) continue; + if (e.timestamp >= now - 24 * 60 * 60 * 1000) continue; + let set = olderIpByActor.get(e.username); + if (!set) { set = new Set(); olderIpByActor.set(e.username, set); } + set.add(e.ip_address); + } + let newIpCount = 0; + let sampleNewIpActor: string | null = null; + for (const e of last24h) { + if (!e.username || !e.ip_address) continue; + const prior = olderIpByActor.get(e.username); + if (prior && prior.size > 0 && !prior.has(e.ip_address)) { + newIpCount++; + if (!sampleNewIpActor) sampleNewIpActor = e.username; + } + } + + const failureCount = last24h.filter(e => e.status_code >= 400).length; + const failureRate = events24 > 0 ? failureCount / events24 : 0; + const failurePct = Math.round(failureRate * 100); + + const activityByHour = Array.from({ length: 24 }, () => 0); + const failuresByHour = Array.from({ length: 24 }, () => 0); + for (const e of last24h) { + const hour = new Date(e.timestamp).getHours(); + activityByHour[hour]++; + if (e.status_code >= 400) failuresByHour[hour]++; + } + const peakHour = activityByHour.reduce( + (best, count, hour) => (count > best.count ? { count, hour } : best), + { count: -1, hour: 0 } + ); + const peakIsOffHours = peakHour.count > 0 && (peakHour.hour < 8 || peakHour.hour >= 18); + + return { + events_24h: { + value: events24, + label: 'events · 24h', + detail: deltaPct === null ? 'no 7d baseline yet' : `${deltaPct >= 0 ? '+' : ''}${deltaPct}% vs 7d avg`, + severity: deltaPct !== null && deltaPct > 150 ? 'warn' : 'ok', + }, + actors_24h: { + value: actors24.size, + label: 'actors', + detail: newIpCount > 0 + ? `${newIpCount} new ip${newIpCount === 1 ? '' : 's'}${sampleNewIpActor ? ` · ${sampleNewIpActor}` : ''}` + : null, + severity: newIpCount > 0 ? 'warn' : 'ok', + }, + failure_rate: { + value: failurePct, + label: 'failure rate', + detail: `${failureCount} of ${events24} request${events24 === 1 ? '' : 's'}`, + severity: failurePct >= 20 ? 'alert' : failurePct >= 5 ? 'warn' : 'ok', + }, + unusual_hour: { + value: peakIsOffHours ? peakHour.hour : null, + label: 'peak hour', + detail: peakIsOffHours + ? `${peakHour.count} event${peakHour.count === 1 ? '' : 's'} at ${String(peakHour.hour).padStart(2, '0')}:00` + : 'inside working hours', + severity: peakIsOffHours ? 'warn' : 'ok', + }, + activity_by_hour: activityByHour, + failures_by_hour: failuresByHour, + }; +} + +export function annotateEntries( + entries: AuditLogEntry[], + history: AuditLogEntry[], + now: number = Date.now() +): (AuditLogEntry & { flags: AnomalyFlag[] })[] { + const baselines = buildBaselines(history, now); + + return entries.map(entry => { + const flags: AnomalyFlag[] = []; + if (!entry.username) return { ...entry, flags }; + + const baseline = baselines.get(entry.username); + if (!baseline) { + flags.push('first_seen_actor'); + } else { + const entryHour = new Date(entry.timestamp).getHours(); + if (isUnusualHour(entryHour, baseline.hoursLast7d)) { + flags.push('unusual_hour'); + } + if (entry.ip_address && baseline.ipsLast30d.size > 0 && !baseline.ipsLast30d.has(entry.ip_address)) { + flags.push('new_ip'); + } + } + + return { ...entry, flags }; + }); +} diff --git a/backend/src/services/DatabaseService.ts b/backend/src/services/DatabaseService.ts index 66ffbc1e..21a7e018 100644 --- a/backend/src/services/DatabaseService.ts +++ b/backend/src/services/DatabaseService.ts @@ -2066,6 +2066,12 @@ export class DatabaseService { this.db.prepare('DELETE FROM audit_log WHERE timestamp < ?').run(cutoff); } + public getAuditLogsInRange(from: number, to: number): AuditLogEntry[] { + return this.db.prepare( + 'SELECT * FROM audit_log WHERE timestamp >= ? AND timestamp < ? ORDER BY timestamp ASC' + ).all(from, to) as AuditLogEntry[]; + } + // --- API Tokens --- public addApiToken(token: Omit): number { diff --git a/docs/features/audit-log.mdx b/docs/features/audit-log.mdx index 35815f57..edec2174 100644 --- a/docs/features/audit-log.mdx +++ b/docs/features/audit-log.mdx @@ -61,19 +61,56 @@ Expanding a row reveals additional detail: Navigate to the **Audit** tab in the sidebar. This tab is visible to users with the **Admin** or **Auditor** role on an Admiral license. - - Audit Log view showing the action table with search filters, color-coded method badges, and export controls - +The Audit Log has two views, toggled from the header: **Stream** (default) and **Table**. -Click any row to expand it and see the full request details inline. +### Stream view + +Stream gives you an at-a-glance read on activity. A signal rail at the top summarizes the last 24 hours across four tiles, and the feed below groups entries by day with severity dots, relative times, and inline anomaly callouts. - Audit Log with an expanded row showing request path, IP address, node ID, and entry ID + Audit Log Stream view showing the signal rail with events, actors, failure rate, and peak hour tiles above a day-banded chronological feed -The header displays the total number of matching entries and provides **Refresh** and **Export** controls. +**Signal rail tiles:** -Results are paginated at 50 entries per page. Navigation controls appear at the bottom of the table when there are multiple pages. +| Tile | What it shows | +|------|---------------| +| **Events · 24h** | Count of audit entries in the last 24 hours, with a percent change versus the prior 7-day average | +| **Actors** | Unique users active in the last 24 hours; notes the count of new IP addresses when present | +| **Failure rate** | Share of 24-hour requests with 4xx or 5xx responses, rendered with an inline sparkline of the hourly failure trend | +| **Peak hour** | The hour with the highest activity, flagged in amber when it falls outside 08:00-18:00 | + +**Feed entries:** each row shows the relative time (e.g. `58m ago`), a severity dot (green for 2xx, amber for 3xx, rose for 4xx/5xx), the actor and action summary, a meta line with exact timestamp, node, status code, IP, and any anomaly flags, and the method and path on the right. + +Rows colored in rose or amber indicate failures; the tinting makes spikes of errors visible at a glance. + +### Table view + +Table keeps the full-featured detail grid for power users: exact timestamps, method badges, action summaries, and status codes in sortable columns. Clicking any row expands it to show the full request path, IP address, node ID, and entry ID. + + + Audit Log Table view showing the action table with search filters, color-coded method badges, and export controls + + + + Audit Log Table view with an expanded row showing request path, IP address, node ID, and entry ID + + +The header displays the total number of matching entries and provides **Refresh** and **Export** controls in both views. + +Results are paginated at 50 entries per page. Navigation controls appear at the bottom of the feed or table when there are multiple pages. + +## Anomaly detection + +In Stream view, Sencho annotates individual entries with lightweight anomaly flags that help you spot activity that deviates from an actor's normal pattern. Flags appear inline in the entry's meta line, after the IP address. + +| Flag | When it fires | +|------|---------------| +| **unusual hour** | The entry's hour sits outside the actor's typical activity window, computed from the central 90% of their last 7 days. Requires a baseline of at least 5 prior entries to avoid flagging new users. | +| **new ip** | The IP address on this entry has not been seen for this actor in the last 30 days, and the actor already has prior history. | +| **first seen** | The actor has no prior entries in the 30-day history window. Useful for spotting brand-new service accounts, CLI tools, or compromised sessions. | + +Flags are computed at read time against your existing audit history. No new tables, no per-entry storage overhead, and the logic is cache-friendly, so enabling Stream view does not slow down the audit log endpoint. ## Filtering and search diff --git a/docs/images/audit-log/audit-stream.png b/docs/images/audit-log/audit-stream.png new file mode 100644 index 0000000000000000000000000000000000000000..add5c26d8d99bbb52670c9e7778bea0ae43b32d0 GIT binary patch literal 131509 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

8(+oPx~E-+x8_ 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 literal 0 HcmV?d00001 diff --git a/frontend/src/components/AuditLogView.tsx b/frontend/src/components/AuditLogView.tsx index 8aa82dce..4bc1ca28 100644 --- a/frontend/src/components/AuditLogView.tsx +++ b/frontend/src/components/AuditLogView.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useCallback, Fragment } from 'react'; +import { useState, useEffect, useCallback, Fragment, useMemo } from 'react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -7,10 +7,13 @@ import { DatePicker } from '@/components/ui/date-picker'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; -import { ChevronLeft, ChevronRight, Search, ScrollText, RefreshCw, Download, ChevronDown } from 'lucide-react'; +import { Sparkline } from '@/components/ui/sparkline'; +import { ChevronLeft, ChevronRight, Search, ScrollText, RefreshCw, Download, ChevronDown, Activity, Table2 } from 'lucide-react'; import { apiFetch } from '@/lib/api'; import { toast } from '@/components/ui/toast-store'; +type AnomalyFlag = 'unusual_hour' | 'new_ip' | 'first_seen_actor'; + interface AuditEntry { id: number; timestamp: number; @@ -21,6 +24,23 @@ interface AuditEntry { node_id: number | null; ip_address: string; summary: string; + flags?: AnomalyFlag[]; +} + +interface AuditStatTile { + value: number | null; + label: string; + detail: string | null; + severity: 'ok' | 'warn' | 'alert'; +} + +interface AuditStats { + events_24h: AuditStatTile; + actors_24h: AuditStatTile; + failure_rate: AuditStatTile; + unusual_hour: AuditStatTile; + activity_by_hour: number[]; + failures_by_hour: number[]; } const methodOptions = [ @@ -31,18 +51,76 @@ const methodOptions = [ { value: 'PATCH', label: 'PATCH' }, ]; +const SEVERITY_DOT: Record<'ok' | 'warn' | 'alert', string> = { + ok: 'bg-success', + warn: 'bg-warning', + alert: 'bg-destructive', +}; + +const SEVERITY_TEXT: Record<'ok' | 'warn' | 'alert', string> = { + ok: 'text-stat-value', + warn: 'text-warning', + alert: 'text-destructive', +}; + +const FLAG_LABEL: Record = { + unusual_hour: 'unusual hour', + new_ip: 'new ip', + first_seen_actor: 'first seen', +}; + +function entrySeverity(statusCode: number): 'ok' | 'warn' | 'alert' { + if (statusCode >= 400) return 'alert'; + if (statusCode >= 300) return 'warn'; + return 'ok'; +} + +function formatRelative(ts: number, now: number): string { + const diff = now - ts; + if (diff < 60_000) return 'now'; + const mins = Math.round(diff / 60_000); + if (mins < 60) return `${mins}m ago`; + const hours = Math.floor(mins / 60); + if (hours < 24) return `${hours}h ago`; + const days = Math.floor(hours / 24); + return `${days}d ago`; +} + +function formatDayBanner(ts: number): string { + const d = new Date(ts); + return d.toLocaleDateString(undefined, { weekday: 'short', month: 'short', day: 'numeric' }); +} + +function formatClock(ts: number): string { + const d = new Date(ts); + return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); +} + +function dayKey(ts: number): string { + const d = new Date(ts); + return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`; +} + export function AuditLogView() { const [entries, setEntries] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [loading, setLoading] = useState(true); + const [view, setView] = useState<'stream' | 'table'>('stream'); + const [stats, setStats] = useState(null); const [searchFilter, setSearchFilter] = useState(''); const [methodFilter, setMethodFilter] = useState('all'); const [fromDate, setFromDate] = useState(); const [toDate, setToDate] = useState(); const [expandedId, setExpandedId] = useState(null); + const [now, setNow] = useState(() => Date.now()); const limit = 50; + useEffect(() => { + const id = setInterval(() => setNow(Date.now()), 60_000); + return () => clearInterval(id); + }, []); + const buildFilterParams = useCallback(() => { const params = new URLSearchParams(); if (searchFilter) params.set('search', searchFilter); @@ -66,6 +144,7 @@ export function AuditLogView() { const params = buildFilterParams(); params.set('page', String(page)); params.set('limit', String(limit)); + params.set('with_anomalies', '1'); const res = await apiFetch(`/audit-log?${params}`, { localOnly: true }); if (res.ok) { @@ -80,10 +159,25 @@ export function AuditLogView() { } }, [page, buildFilterParams]); + const fetchStats = useCallback(async () => { + try { + const res = await apiFetch('/audit-log/stats', { localOnly: true }); + if (res.ok) { + setStats(await res.json()); + } + } catch (err) { + console.error('[AuditLog] Failed to fetch stats:', err); + } + }, []); + useEffect(() => { fetchLogs(); }, [fetchLogs]); + useEffect(() => { + if (view === 'stream') fetchStats(); + }, [view, fetchStats]); + const totalPages = Math.max(1, Math.ceil(total / limit)); const methodBadgeVariant = (method: string): 'default' | 'secondary' | 'destructive' | 'outline' => { @@ -127,6 +221,20 @@ export function AuditLogView() { } }; + const groupedEntries = useMemo(() => { + const groups: { key: string; day: number; entries: AuditEntry[] }[] = []; + for (const entry of entries) { + const key = dayKey(entry.timestamp); + const last = groups[groups.length - 1]; + if (last && last.key === key) { + last.entries.push(entry); + } else { + groups.push({ key, day: entry.timestamp, entries: [entry] }); + } + } + return groups; + }, [entries]); + return (

+
+ + +
@@ -161,141 +289,317 @@ export function AuditLogView() {

- {/* Filters */} -
-
- - { setSearchFilter(e.target.value); setPage(1); }} - className="pl-8" - /> -
- { setMethodFilter(v || 'all'); setPage(1); }} - placeholder="Method" - className="w-[140px]" + {view === 'stream' ? ( + - { setFromDate(d); setPage(1); }} - placeholder="From" - className="w-[160px]" - /> - { setToDate(d); setPage(1); }} - placeholder="To" - className="w-[160px]" - /> -
+ ) : ( + <> +
+
+ + { setSearchFilter(e.target.value); setPage(1); }} + className="pl-8" + /> +
+ { setMethodFilter(v || 'all'); setPage(1); }} + placeholder="Method" + className="w-[140px]" + /> + { setFromDate(d); setPage(1); }} + placeholder="From" + className="w-[160px]" + /> + { setToDate(d); setPage(1); }} + placeholder="To" + className="w-[160px]" + /> +
- {/* Table */} -
- - - - Timestamp - User - Method - Action - Status - Node - - - - {loading && entries.length === 0 ? ( - - - Loading... - - - ) : entries.length === 0 ? ( - - - No audit log entries found. - - - ) : ( - entries.map((entry) => ( - - setExpandedId(expandedId === entry.id ? null : entry.id)} - > - - {new Date(entry.timestamp).toLocaleString()} - - - {entry.username} - - - - {entry.method} - - - - {entry.summary} - - - {entry.status_code} - - - {entry.node_id ?? '-'} +
+
+ + + Timestamp + User + Method + Action + Status + Node + + + + {loading && entries.length === 0 ? ( + + + Loading... - {expandedId === entry.id && ( - - -
-
- Request Path - {entry.path} -
-
- IP Address - {entry.ip_address || '-'} -
-
- Node ID - {entry.node_id ?? 'Local'} -
-
- Entry ID - #{entry.id} -
-
-
-
- )} - - )) - )} -
-
-
- - {/* Pagination */} - {totalPages > 1 && ( -
-

- Page {page} of {totalPages} -

-
- - + ) : entries.length === 0 ? ( + + + No audit log entries found. + + + ) : ( + entries.map((entry) => ( + + setExpandedId(expandedId === entry.id ? null : entry.id)} + > + + {new Date(entry.timestamp).toLocaleString()} + + + {entry.username} + + + + {entry.method} + + + + {entry.summary} + + + {entry.status_code} + + + {entry.node_id ?? '-'} + + + {expandedId === entry.id && ( + + +
+
+ Request Path + {entry.path} +
+
+ IP Address + {entry.ip_address || '-'} +
+
+ Node ID + {entry.node_id ?? 'Local'} +
+
+ Entry ID + #{entry.id} +
+
+
+
+ )} +
+ )) + )} + +
-
+ + {totalPages > 1 && ( +
+

+ Page {page} of {totalPages} +

+
+ + +
+
+ )} + )}
); } + +interface StreamViewProps { + stats: AuditStats | null; + loading: boolean; + groups: { key: string; day: number; entries: AuditEntry[] }[]; + now: number; + page: number; + totalPages: number; + onPage: (n: number) => void; +} + +function StreamView({ stats, loading, groups, now, page, totalPages, onPage }: StreamViewProps) { + const tiles: AuditStatTile[] = stats + ? [stats.events_24h, stats.actors_24h, stats.failure_rate, stats.unusual_hour] + : []; + const failures = stats?.failures_by_hour ?? []; + const hasFailurePoints = failures.some(f => f > 0); + + return ( +
+
+ {tiles.length === 0 ? ( + Array.from({ length: 4 }).map((_, i) => ( +
+
 
+
+ · +
+
+
+ )) + ) : ( + tiles.map((tile, idx) => ( +
+
+ {tile.label} +
+
+ + {tile.value === null + ? '·' + : idx === 2 + ? `${tile.value}%` + : idx === 3 + ? `${String(tile.value).padStart(2, '0')}:00` + : tile.value} + + {idx === 2 && hasFailurePoints && ( +
+ +
+ )} +
+
+ {tile.detail ?? '\u00a0'} +
+
+ )) + )} +
+ + {loading ? ( +
Loading audit stream...
+ ) : groups.length === 0 ? ( +
No audit log entries found.
+ ) : ( +
+ {groups.map(group => ( +
+
+ + {formatDayBanner(group.day)} + + + {group.entries.length} {group.entries.length === 1 ? 'event' : 'events'} + +
+
+ {group.entries.map(entry => ( + + ))} +
+
+ ))} +
+ )} + + {totalPages > 1 && ( +
+

+ Page {page} of {totalPages} +

+
+ + +
+
+ )} +
+ ); +} + +interface StreamRowProps { + entry: AuditEntry; + now: number; +} + +function StreamRow({ entry, now }: StreamRowProps) { + const severity = entrySeverity(entry.status_code); + const [verb, ...rest] = entry.summary.split(' '); + const target = rest.join(' '); + const flags = entry.flags ?? []; + const rowTint = + severity === 'alert' ? 'bg-destructive/4' : + severity === 'warn' ? 'bg-warning/4' : + ''; + + return ( +
+
+ {formatRelative(entry.timestamp, now)} +
+
+
+
+
+
+ {entry.username || 'system'} + {verb.toLowerCase()} + {target || entry.path} +
+
+ {formatClock(entry.timestamp)} + · + {entry.node_id == null ? 'local' : `node ${entry.node_id}`} + · + + {entry.status_code} + + {entry.ip_address && ( + <> + · + {entry.ip_address} + + )} + {flags.map(flag => ( + · {FLAG_LABEL[flag]} + ))} +
+
+
+ {entry.method} {entry.path.split('?')[0]} +
+
+ ); +}