Updated directory structure. Initial authnication design and database initialization files.
This commit is contained in:
parent
82d6ae8f57
commit
109f099a4c
|
|
@ -0,0 +1,196 @@
|
|||
-- ===============================
|
||||
-- ComplyCore Supabase IAM + RLS Init
|
||||
-- Includes:
|
||||
-- - Tenants
|
||||
-- - Users
|
||||
-- - Service Accounts (NPEs)
|
||||
-- - Audit Logs
|
||||
-- ===============================
|
||||
|
||||
-- 1. Define user roles
|
||||
CREATE TYPE user_role AS ENUM ('client_user', 'client_admin', 'reviewer', 'superadmin');
|
||||
|
||||
-- 2. Define authentication scopes for service accounts
|
||||
CREATE TYPE api_scope AS ENUM ('upload', 'evaluate', 'read_reports', 'manage_projects');
|
||||
|
||||
-- 3. Tenants table
|
||||
CREATE TABLE tenants (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name TEXT NOT NULL,
|
||||
dba_name TEXT,
|
||||
cage_code TEXT,
|
||||
sam_uid TEXT,
|
||||
duns_number TEXT,
|
||||
naics_codes TEXT[],
|
||||
address_line1 TEXT,
|
||||
address_line2 TEXT,
|
||||
city TEXT,
|
||||
state_province TEXT,
|
||||
postal_code TEXT,
|
||||
country TEXT DEFAULT 'USA',
|
||||
primary_contact_name TEXT,
|
||||
primary_contact_email TEXT,
|
||||
primary_contact_phone TEXT,
|
||||
cmmc_target_level TEXT DEFAULT 'Level 2',
|
||||
sponsoring_agency TEXT,
|
||||
compliance_status TEXT DEFAULT 'pending',
|
||||
notes TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc', now())
|
||||
);
|
||||
|
||||
-- 4. Users table (linked to auth.users)
|
||||
CREATE TABLE users (
|
||||
id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
||||
role user_role NOT NULL DEFAULT 'client_user',
|
||||
|
||||
-- Identity
|
||||
first_name TEXT NOT NULL,
|
||||
last_name TEXT NOT NULL,
|
||||
job_title TEXT,
|
||||
department TEXT,
|
||||
|
||||
-- Contact
|
||||
email TEXT NOT NULL UNIQUE,
|
||||
phone_office TEXT,
|
||||
phone_mobile TEXT,
|
||||
address_line1 TEXT,
|
||||
address_line2 TEXT,
|
||||
city TEXT,
|
||||
state_province TEXT,
|
||||
postal_code TEXT,
|
||||
country TEXT DEFAULT 'USA',
|
||||
|
||||
-- Flags
|
||||
is_service_account BOOLEAN DEFAULT false,
|
||||
mfa_enabled BOOLEAN DEFAULT false,
|
||||
|
||||
-- System
|
||||
last_login_at TIMESTAMP WITH TIME ZONE,
|
||||
notes TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc', now())
|
||||
);
|
||||
|
||||
-- 5. Service Accounts (API Clients)
|
||||
CREATE TABLE api_clients (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
||||
name TEXT NOT NULL,
|
||||
client_id TEXT NOT NULL UNIQUE,
|
||||
client_secret TEXT NOT NULL,
|
||||
scopes api_scope[] NOT NULL,
|
||||
enabled BOOLEAN DEFAULT true,
|
||||
created_by UUID REFERENCES users(id),
|
||||
description TEXT,
|
||||
last_used_at TIMESTAMP WITH TIME ZONE,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc', now())
|
||||
);
|
||||
|
||||
-- 6. Evaluation results table
|
||||
CREATE TABLE evaluations (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
||||
project_id UUID NOT NULL,
|
||||
control_id TEXT NOT NULL,
|
||||
status TEXT CHECK (status IN ('implemented', 'partial', 'missing')),
|
||||
notes TEXT,
|
||||
created_by UUID REFERENCES users(id),
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc', now())
|
||||
);
|
||||
|
||||
-- 7. Audit log
|
||||
CREATE TABLE auth_audit_log (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
actor_id UUID, -- user or service account
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
||||
action TEXT NOT NULL,
|
||||
target_table TEXT,
|
||||
target_id UUID,
|
||||
ip_address TEXT,
|
||||
user_agent TEXT,
|
||||
result TEXT CHECK (result IN ('success', 'fail')) DEFAULT 'success',
|
||||
timestamp TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc', now())
|
||||
);
|
||||
|
||||
-- =======================================
|
||||
-- Session Context Claims
|
||||
-- =======================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_claim_context()
|
||||
RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
AS $$
|
||||
DECLARE
|
||||
v_role TEXT;
|
||||
v_tenant UUID;
|
||||
BEGIN
|
||||
SELECT role, tenant_id INTO v_role, v_tenant
|
||||
FROM public.users
|
||||
WHERE id = auth.uid();
|
||||
|
||||
-- Set session-scoped variables
|
||||
PERFORM set_config('request.jwt.claim.role', v_role, true);
|
||||
PERFORM set_config('request.jwt.claim.tenant_id', v_tenant::text, true);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- =======================================
|
||||
-- Row-Level Security (RLS) Policies
|
||||
-- =======================================
|
||||
|
||||
-- Enable RLS
|
||||
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE evaluations ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE api_clients ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE auth_audit_log ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Users: only see own row
|
||||
CREATE POLICY "Self-access only"
|
||||
ON users
|
||||
USING (id = auth.uid());
|
||||
|
||||
-- Evaluations: Tenant isolation for client roles
|
||||
CREATE POLICY "Tenant isolation"
|
||||
ON evaluations
|
||||
FOR ALL
|
||||
USING (
|
||||
(current_setting('request.jwt.claim.role', true) IN ('client_user', 'client_admin'))
|
||||
AND tenant_id = current_setting('request.jwt.claim.tenant_id', true)::uuid
|
||||
);
|
||||
|
||||
-- Evaluations: Reviewer read-only access
|
||||
CREATE POLICY "Reviewer read access"
|
||||
ON evaluations
|
||||
FOR SELECT
|
||||
USING (
|
||||
current_setting('request.jwt.claim.role', true) = 'reviewer'
|
||||
);
|
||||
|
||||
-- Evaluations: Superadmin full access
|
||||
CREATE POLICY "Superadmin full access"
|
||||
ON evaluations
|
||||
FOR ALL
|
||||
USING (
|
||||
current_setting('request.jwt.claim.role', true) = 'superadmin'
|
||||
)
|
||||
WITH CHECK (
|
||||
current_setting('request.jwt.claim.role', true) = 'superadmin'
|
||||
);
|
||||
|
||||
-- Service Accounts: Restrict to own tenant + enabled
|
||||
CREATE POLICY "API client isolation"
|
||||
ON api_clients
|
||||
FOR ALL
|
||||
USING (
|
||||
tenant_id = current_setting('request.jwt.claim.tenant_id', true)::uuid
|
||||
AND enabled = true
|
||||
);
|
||||
|
||||
-- Audit Log: tenant-scoped visibility
|
||||
CREATE POLICY "Audit tenant visibility"
|
||||
ON auth_audit_log
|
||||
FOR SELECT
|
||||
USING (
|
||||
tenant_id = current_setting('request.jwt.claim.tenant_id', true)::uuid
|
||||
);
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
```mermaid
|
||||
graph TD
|
||||
subgraph Clients
|
||||
A1[Client Browser] --> F1[ComplyCore Web Portal]
|
||||
end
|
||||
|
||||
subgraph "Frontend (Flutter Web / Next.js)"
|
||||
F1 -->|Login| IAM[Identity & Access Management]
|
||||
F1 -->|Upload Docs| U1[Secure File Upload]
|
||||
F1 -->|Start Eval| A1_n8n[n8n Workflow Trigger]
|
||||
F1 -->|View Results| R1[Report Viewer]
|
||||
end
|
||||
|
||||
subgraph "Backend (Core Platform Services)"
|
||||
IAM --> DB[(PostgreSQL w/ RLS)]
|
||||
U1 --> Storage[MinIO or Nextcloud]
|
||||
A1_n8n --> EvalAPI[FastAPI Evaluation Engine]
|
||||
EvalAPI --> DB
|
||||
EvalAPI --> Storage
|
||||
EvalAPI --> ReportGen[Markdown/PDF Generator]
|
||||
ReportGen --> R1
|
||||
ReportGen --> PDFOut[PDF Report Files]
|
||||
end
|
||||
|
||||
subgraph "DevOps (Secure Infrastructure)"
|
||||
Logging[Wazuh / Prometheus / Loki]
|
||||
IAM --> Logging
|
||||
EvalAPI --> Logging
|
||||
Storage --> Logging
|
||||
end
|
||||
|
||||
subgraph External
|
||||
Admin[Reviewer / Auditor Portal]
|
||||
Admin --> F1
|
||||
end
|
||||
```
|
||||
Loading…
Reference in New Issue