feat: Mimecast email integration — message logs, threat events, 120d retention, admin UI
This commit is contained in:
parent
7792e91587
commit
25bb70cfa6
11 changed files with 112285 additions and 1 deletions
72
migrations/055_create_mimecast_tables.sql
Normal file
72
migrations/055_create_mimecast_tables.sql
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
-- ============================================================================
|
||||
-- Mimecast Email Integration Tables
|
||||
-- 120-day rolling retention for message logs, threat events, and message bodies
|
||||
-- ============================================================================
|
||||
|
||||
-- Core message tracking log
|
||||
CREATE TABLE IF NOT EXISTS mimecast_messages (
|
||||
id TEXT PRIMARY KEY,
|
||||
sender_address TEXT,
|
||||
sender_domain TEXT,
|
||||
recipient_address TEXT,
|
||||
subject TEXT,
|
||||
direction TEXT, -- 'inbound' | 'outbound'
|
||||
status TEXT, -- 'delivered' | 'rejected' | 'bounced' | 'held' | 'spam'
|
||||
action TEXT,
|
||||
spam_score NUMERIC,
|
||||
size_bytes BIGINT,
|
||||
attachment_count INT DEFAULT 0,
|
||||
sent_datetime TIMESTAMPTZ,
|
||||
received_datetime TIMESTAMPTZ,
|
||||
delivery_datetime TIMESTAMPTZ,
|
||||
route TEXT,
|
||||
reject_reason TEXT,
|
||||
held_reason TEXT,
|
||||
source_ip TEXT,
|
||||
raw JSONB, -- Full API response for forward-compat
|
||||
synced_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Separate table for message bodies (large, for LLM use only)
|
||||
CREATE TABLE IF NOT EXISTS mimecast_message_bodies (
|
||||
message_id TEXT PRIMARY KEY REFERENCES mimecast_messages(id) ON DELETE CASCADE,
|
||||
body_text TEXT,
|
||||
body_html TEXT,
|
||||
headers JSONB,
|
||||
fetched_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- SIEM/threat events
|
||||
CREATE TABLE IF NOT EXISTS mimecast_threat_events (
|
||||
id TEXT PRIMARY KEY,
|
||||
message_id TEXT REFERENCES mimecast_messages(id) ON DELETE SET NULL,
|
||||
event_type TEXT, -- 'url_click' | 'attachment_sandbox' | 'impersonation' | 'spam' | 'virus'
|
||||
threat_level TEXT, -- 'high' | 'medium' | 'low' | 'info'
|
||||
url TEXT,
|
||||
file_name TEXT,
|
||||
verdict TEXT,
|
||||
actor_email TEXT,
|
||||
event_datetime TIMESTAMPTZ,
|
||||
details JSONB, -- Full raw event payload
|
||||
synced_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Cursor-based pagination state for resumable syncs
|
||||
CREATE TABLE IF NOT EXISTS mimecast_sync_state (
|
||||
sync_type TEXT PRIMARY KEY, -- 'messages' | 'threats' | 'held'
|
||||
last_synced_at TIMESTAMPTZ,
|
||||
cursor TEXT,
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_mimecast_messages_sent_datetime ON mimecast_messages (sent_datetime DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_mimecast_messages_sender_domain ON mimecast_messages (sender_domain);
|
||||
CREATE INDEX IF NOT EXISTS idx_mimecast_messages_status ON mimecast_messages (status);
|
||||
CREATE INDEX IF NOT EXISTS idx_mimecast_messages_direction ON mimecast_messages (direction);
|
||||
CREATE INDEX IF NOT EXISTS idx_mimecast_messages_recipient ON mimecast_messages (recipient_address);
|
||||
CREATE INDEX IF NOT EXISTS idx_mimecast_threat_events_datetime ON mimecast_threat_events (event_datetime DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_mimecast_threat_events_type ON mimecast_threat_events (event_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_mimecast_threat_events_level ON mimecast_threat_events (threat_level);
|
||||
CREATE INDEX IF NOT EXISTS idx_mimecast_threat_events_details ON mimecast_threat_events USING GIN (details);
|
||||
Loading…
Add table
Add a link
Reference in a new issue