Skip to content

Controls

The EDFlow controls matrix: authentication and MFA, server-side authorization and projections, token hashing, encryption, rate limits, audit, log redaction, security headers and CSP, supply chain, vulnerability management and penetration testing.

Controls matrix

AreaControl
Staff authenticationInvite-only; passwords of 12+ characters with a strength check and a breached-password list; MFA (TOTP) required in production; optional Microsoft Entra ID (OIDC with PKCE, guest accounts refused); lockout after 5 failures in 15 minutes from unknown devices; idle lock after 15 minutes; 12-hour sessions; fresh sign-in for sensitive actions
Patient and family access128-bit random card and link tokens in the URL fragment only; a second device needs the date of birth or the first device's approval; staff-assisted sign-in by reverse pairing, so staff never hold a usable credential; at most 5 patient devices per visit and 3 per family link; access ends automatically after departure
AuthorizationServer-side only: identity is derived on the server, never from client-supplied ids, roles or sites. Each staff function checks a permission at the active site. Cross-site ids return "not found". Every read goes through an allow-listed projection per audience, with tests that forbidden fields are absent
Audit before readA staff member must open a visit (recorded) before reading or acting on it. Board views recorded every 15 minutes
Token storageTokens, visit codes and API secrets stored only as keyed HMAC hashes; a copy of the database opens nothing
EncryptionTLS 1.2+ (1.3 preferred) with HSTS preload; AES-256 at rest with KMS customer-managed keys; phone numbers and MFA secrets encrypted with AES-256-GCM; per-organization KMS keys for integration secrets, with a hospital-held key option
Rate limitsPer network, per visit, per account, per app, per endpoint; never a global lockout that would let an attacker lock staff out
AuditAppend-only log with a daily hash chain; per-patient access report; monitoring rules; SIEM export
Log redactionThe backend logger accepts only allow-listed keys; console is banned by lint; HTTP handlers never log bodies, headers or token paths; parser errors carry positions, not values
NotificationsGeneric templates only; payload lint in CI
Web securityNonce-based CSP, frame-ancestors 'none', X-Content-Type-Options: nosniff, strict referrer policy, no-store and no-referrer on token routes, no third-party scripts on patient and family pages, self-hosted fonts
API securityOWASP API Top 10 controls: site-scoped queries, short-lived tokens, network binding, allow-listed projections, rate limits, SSRF policy for webhooks, strict schemas, no CORS
IntegrationHMAC or OAuth; replay window; idempotency; prohibited-field tripwire; IP allowlists; per-source keys with rotation overlap
Supply chainLockfile integrity, dependency audit, secret scanning (including the service's credential prefixes), SBOM, pinned CI actions, signed build artefacts with provenance, two-person production deployments
Vulnerability managementCritical vulnerabilities fixed within 72 hours; forced app updates for security fixes
Penetration testingExternal test of the API, edge, portal and patient web before live; annually and after major changes; summary letter shared
Privileged accessNo standing vendor access to production data; just-in-time break glass with approval and session recording. See Privileged access
ResilienceSee Availability and incidents

Security headers

HeaderValue
Strict-Transport-Security2 years, includeSubDomains, preload
Content-Security-PolicyNonce-based scripts, connect-src limited to the backend, frame-ancestors 'none' (the display only for configured origins)
Referrer-Policystrict-origin-when-cross-origin; no-referrer on token routes
Permissions-PolicyCamera only on sign-in and staff scan routes
Cache-Controlno-store on token routes and API responses

Verification

Every public backend function has tests for the happy path, an authorization denial and a validation failure, and an authorization matrix is generated from the permission catalogue. Projection tests assert forbidden fields are absent. Storage and log scans run over end-to-end test runs.

Last updated on

Was this page helpful?

On this page