Release prep: 54 engines, self-hosted signatures, i18n, dashboard updates

This commit is contained in:
DmitrL-dev 2026-03-23 16:45:40 +10:00
parent 694e32be26
commit 41cbfd6e0a
178 changed files with 36008 additions and 399 deletions

View file

@ -0,0 +1,65 @@
-- +goose Up
-- SENTINEL SOC — PostgreSQL Schema
-- Tables: soc_events, soc_incidents, soc_sensors
CREATE TABLE soc_events (
id TEXT PRIMARY KEY,
source TEXT NOT NULL,
sensor_id TEXT NOT NULL DEFAULT '',
severity TEXT NOT NULL,
category TEXT NOT NULL,
subcategory TEXT NOT NULL DEFAULT '',
confidence DOUBLE PRECISION NOT NULL DEFAULT 0.0,
description TEXT NOT NULL DEFAULT '',
session_id TEXT NOT NULL DEFAULT '',
content_hash TEXT NOT NULL DEFAULT '',
decision_hash TEXT NOT NULL DEFAULT '',
verdict TEXT NOT NULL DEFAULT 'REVIEW',
timestamp TIMESTAMPTZ NOT NULL,
metadata JSONB NOT NULL DEFAULT '{}'
);
CREATE TABLE soc_incidents (
id TEXT PRIMARY KEY,
status TEXT NOT NULL DEFAULT 'OPEN',
severity TEXT NOT NULL,
title TEXT NOT NULL,
description TEXT NOT NULL DEFAULT '',
event_ids JSONB NOT NULL DEFAULT '[]',
event_count INTEGER NOT NULL DEFAULT 0,
decision_chain_anchor TEXT NOT NULL DEFAULT '',
chain_length INTEGER NOT NULL DEFAULT 0,
correlation_rule TEXT NOT NULL DEFAULT '',
kill_chain_phase TEXT NOT NULL DEFAULT '',
mitre_mapping JSONB NOT NULL DEFAULT '[]',
playbook_applied TEXT NOT NULL DEFAULT '',
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
resolved_at TIMESTAMPTZ
);
CREATE TABLE soc_sensors (
sensor_id TEXT PRIMARY KEY,
sensor_type TEXT NOT NULL,
status TEXT DEFAULT 'UNKNOWN',
first_seen TIMESTAMPTZ NOT NULL,
last_seen TIMESTAMPTZ NOT NULL,
event_count INTEGER DEFAULT 0,
missed_heartbeats INTEGER DEFAULT 0,
hostname TEXT NOT NULL DEFAULT '',
version TEXT NOT NULL DEFAULT ''
);
-- Indexes
CREATE INDEX idx_soc_events_timestamp ON soc_events(timestamp);
CREATE INDEX idx_soc_events_severity ON soc_events(severity);
CREATE INDEX idx_soc_events_category ON soc_events(category);
CREATE INDEX idx_soc_events_sensor ON soc_events(sensor_id);
CREATE INDEX idx_soc_events_content_hash ON soc_events(content_hash);
CREATE INDEX idx_soc_incidents_status ON soc_incidents(status);
CREATE INDEX idx_soc_sensors_status ON soc_sensors(status);
-- +goose Down
DROP TABLE IF EXISTS soc_sensors;
DROP TABLE IF EXISTS soc_incidents;
DROP TABLE IF EXISTS soc_events;

View file

@ -0,0 +1,57 @@
-- +goose Up
-- SENTINEL SOC — Auth & Multi-Tenancy (PostgreSQL)
-- Tables: users, api_keys, tenants
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
name TEXT NOT NULL DEFAULT '',
password TEXT NOT NULL,
role TEXT NOT NULL DEFAULT 'viewer',
tenant_id TEXT NOT NULL DEFAULT '',
active BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS api_keys (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
name TEXT NOT NULL,
key_hash TEXT UNIQUE NOT NULL,
key_prefix TEXT NOT NULL,
role TEXT NOT NULL DEFAULT 'viewer',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
last_used TIMESTAMPTZ,
active BOOLEAN NOT NULL DEFAULT true
);
CREATE TABLE IF NOT EXISTS tenants (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
slug TEXT UNIQUE NOT NULL,
plan_id TEXT NOT NULL DEFAULT 'free',
stripe_customer_id TEXT NOT NULL DEFAULT '',
stripe_sub_id TEXT NOT NULL DEFAULT '',
owner_user_id TEXT NOT NULL,
active BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
events_this_month INTEGER NOT NULL DEFAULT 0,
month_reset_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Add assigned_to column to incidents (was missing in 001)
ALTER TABLE soc_incidents ADD COLUMN IF NOT EXISTS assigned_to TEXT NOT NULL DEFAULT '';
-- Indexes
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
CREATE INDEX IF NOT EXISTS idx_users_tenant ON users(tenant_id);
CREATE INDEX IF NOT EXISTS idx_api_keys_hash ON api_keys(key_hash);
CREATE INDEX IF NOT EXISTS idx_api_keys_user ON api_keys(user_id);
CREATE INDEX IF NOT EXISTS idx_tenants_slug ON tenants(slug);
CREATE INDEX IF NOT EXISTS idx_tenants_owner ON tenants(owner_user_id);
-- +goose Down
DROP TABLE IF EXISTS tenants;
DROP TABLE IF EXISTS api_keys;
DROP TABLE IF EXISTS users;
ALTER TABLE soc_incidents DROP COLUMN IF EXISTS assigned_to;