mirror of
https://github.com/sameerk27/vigil365.git
synced 2026-07-02 10:39:35 +02:00
- SECURITY.md: disclosure policy, design/deployment model, current controls, hardening-in-progress, operator responsibilities (keeps Graph API stability notes) - docs/THREAT_MODEL.md: assets, trust boundaries, data flows, STRIDE mitigations Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3.3 KiB
3.3 KiB
Vigil365 — Threat Model
A concise threat model covering trust boundaries, data flows, assets, and the
controls that protect them. Scope is the self-hosted, single-tenant deployment
described in SECURITY.md.
Assets
| Asset | Sensitivity |
|---|---|
| Graph API credentials (tenant/client ID, client secret/cert) | Critical — grant read access to tenant security data |
| Collected M365 security data (alerts, risky users, devices, sign-ins) | High — reveals security posture |
| Notification secrets (SMTP password, webhook URLs) | High |
| User roles / access assignments | Medium |
| Audit trail | Medium — integrity matters for accountability |
Trust boundaries
[ Operator's browser ] --HTTPS--> [ Reverse proxy / Kestrel TLS ]
|
[ Vigil365 API ] --app-only token--> [ Microsoft Graph ]
|
[ SQL database (in-tenant) ]
- Browser ↔ App — authenticated user session; should always be HTTPS in production. Untrusted input crosses here.
- App ↔ Microsoft Graph — outbound, app-only OAuth2; read-only scopes.
- App ↔ Database — trusted, same-network; transport-encrypted.
- App ↔ SMTP/webhooks — outbound notifications; secrets decrypted in memory only at send time.
Data flows
- The background collector pulls current-state security data from Graph every ~15 minutes and persists it to SQL.
- The browser SPA reads that data through the API.
- Privileged/mutating actions (acknowledge, snooze, settings, user management) are authenticated and, where applicable, role-gated server-side.
Threats & mitigations (STRIDE-aligned)
| Threat | Mitigation |
|---|---|
| Spoofing — unauthorised access to the dashboard | Entra ID sign-in (in progress); network isolation; tenant-scoped login |
| Tampering — modifying data/config | Server-side authorization; read-only Graph (no tenant writes); append-only audit trail |
| Repudiation — denying an action | Audit entries capture actor identity from the validated token |
| Information disclosure — leaking secrets or data | Secrets DPAPI-encrypted at rest and never returned by the API; generic error messages; data stays in-tenant; HTTPS in production |
| Denial of service | Self-hosted/internal exposure limits blast radius; Graph 429 handling with backoff |
| Elevation of privilege | Role policies enforced on the server, not just hidden in the UI; last-admin lockout guards |
Out of scope / assumptions
- The host OS, SQL Server, and network are administered and patched by the operator.
- The Entra app registration is correctly configured with least-privilege, read-only permissions.
- Vigil365 is not a SIEM and does not ingest raw logs; visibility is bounded by what Microsoft Graph exposes.
- Physical security and tenant-admin trust are assumed.
Residual risks
- A compromised Graph credential exposes read access to tenant security data — hence credential storage in a vault and rotation are operator responsibilities.
- Until identity sign-in is merged to the released branch, network isolation is the primary access control for the public release.