// TRUST_CENTER

Security posture, in the open.

Every control listed below is implemented in the DefDossier codebase or runtime configuration. Controls still in progress or planned are disclosed honestly — no implied certifications, ever.

TOTAL
18
IMPLEMENTED
13
IN PROGRESS
2
PLANNED
3
COVERAGE
72%
// as of 2026-06-21
// CONTROL_INVENTORY

Controls by domain

Access Control

// 6
AC-01Password storage hashing

All passwords are stored as bcrypt hashes (cost factor 12) with per-record salts. No plaintext or reversible encoding is ever persisted.

// backend/core.py — hash_pw(), verify_pw()
Implemented
AC-02Brute-force protection

Per IP+email login attempts are tracked. After 5 failures within 15 minutes the account is locked until the cooldown elapses.

// backend/routers/auth.py — login() lockout logic
Implemented
AC-03Session security (httpOnly + Secure + SameSite cookies)

Access and refresh tokens are issued as httpOnly cookies with Secure and SameSite=None attributes. Cookie bodies never traverse JavaScript.

// backend/core.py — set_cookies()
Implemented
AC-04CSRF protection (double-submit cookie pattern)

Every state-changing request requires a header (X-CSRF-Token) matching a per-session cookie. Five public bootstrap endpoints are exempt by design.

// backend/core.py — CSRFMiddleware
Implemented
AC-05Token revocation on credential change

User token_version increments on password reset. All previously-issued JWTs are invalidated server-side because the validator compares ver to user.token_version.

// backend/core.py — get_current_user(); backend/routers/auth.py — reset_password()
Implemented
AC-06Password reset link expiry

Reset tokens are single-use, expire in 15 minutes, and rate-limit at 3 requests per email per hour. Tokens are also invalidated by any subsequent reset request.

// backend/routers/auth.py — forgot_password(), reset_password()
Implemented

Data Isolation

// 2
DI-01Per-tenant org_id scoping

Every user-generated document (enrollments, certifications, lesson_progress, practical_attempts, audit_log, chat_messages) is stamped with org_id on write. Cross-org queries are blocked at the route layer (squad, suggest, plan, MITRE coverage, compliance pack).

// backend/routers/*.py — _trainee_in_org() pattern
Implemented
DI-02Verifiable badge signatures

Every Open Badge certificate carries a signed JWT (HMAC-SHA256) that any third party can verify at the public /verify/{badge_id} endpoint. Tampered or revoked badges return INVALID.

// backend/badges.py — verify_badge_jwt()
Implemented

Encryption

// 2
EN-01Encryption in transit (TLS 1.3)

All HTTP traffic to defdossier.com is terminated at Cloudflare with TLS 1.3 and HSTS. The Emergent edge does not accept plaintext HTTP for the production hostname.

// Cloudflare DNS + Emergent edge config
Implemented
EN-02Encryption at rest

Production database is MongoDB hosted by the Emergent platform. Volume-level encryption at rest is dependent on the underlying managed-Mongo offering; awaiting written attestation from Emergent infrastructure.

// Infrastructure-level (out of repo scope)
In Progress

Audit & Monitoring

// 2
AU-01Authentication audit log

Password reset requests and completions, along with compliance pack email sends, are appended to db.audit_log with user_id, IP, and timestamp. Records are append-only from the application.

// backend/routers/auth.py, backend/routers/compliance_routes.py — db.audit_log.insert_one()
Implemented
AU-02Compliance pack delivery audit trail

Every compliance pack email send records the sender, recipient, subject user, and Resend message id — enabling later proof of delivery to procurement officers.

// backend/routers/compliance_routes.py
Implemented

Email Security

// 1
EM-01SPF + DKIM + DMARC on sending domain

defdossier.com publishes SPF (include:amazonses.com), DKIM (Resend resend._domainkey), and DMARC (p=none, monitoring) records. Verified by Resend domain authentication.

// Cloudflare DNS records
Implemented

Vendor Management

// 1
VM-01Documented subprocessors

Customer data is processed only by the subprocessors listed in the Trust Center. Any addition triggers a public update.

// frontend/src/pages/Trust.jsx — Subprocessors section
Implemented

Formal Audit

// 3
PG-01SOC 2 Type I attestation

Targeted 2027. Pre-audit controls implementation underway; engagement with an independent CPA partner expected once first paid customers are onboard.

// Roadmap — not yet in scope
Planned
PG-02ISO 27001 certification

Under evaluation. ISO 27001 will be pursued if customer demand and revenue justify the audit cost.

// Roadmap — not yet in scope
Planned
PG-03External penetration test

Targeted Q3 2026 once seat count exceeds 50. Will engage a CREST/OSCP-credentialed firm.

// Roadmap — not yet in scope
Planned

Business Continuity

// 1
PG-04Disaster-recovery and backup policy

Daily managed-Mongo snapshots via Emergent platform. RTO/RPO targets being formalised.

// Infrastructure — Emergent managed Mongo
In Progress
// SUBPROCESSORS

Data subprocessors

The only third parties that touch customer data. Any change to this list is reflected here within 30 days.

VendorPurposeData categoryRegion
CloudflareDNS, TLS termination, edge CDNEncrypted traffic onlyGlobal edge
EmergentApplication hosting, managed MongoDBAll application dataMulti-region
ResendTransactional email deliveryRecipient email, message bodyTokyo (ap-northeast-1)
Amazon SES (via Resend)SMTP relayEmail envelope + bodyAP Northeast 1
AnthropicSentinel AI assistantPrompt + chat context for an active sessionUnited States
// HONESTY_POLICY

What this page is not

This is not a formal audit report. DefDossier does not currently hold SOC 2 or ISO 27001 attestation — both are explicitly listed under Formal Audit as planned. If you require third-party attestation today, ask us before contracting. We will route your requirement to our auditor partner timeline, or — if it's blocking — propose an alternative path.

Questions? Email joel@defdossier.com.