Pilot status — staging — AWS us-east-1
Security — pilot controls in place
A plain list of what is configured today in the pilot Project Workspace, what is not yet, and how to reach us about a concern. It describes the staging environment because that is the only environment that exists. It is not an audit result and makes no promise about future controls.
Reporting a concern: [Support email]. Region: AWS us-east-1. Environment: staging, at staging.buildmydentaloffice.com. No production environment exists yet.
In place
What is configured today.
Each statement below describes something that exists in the deployed staging stack or the application code as of the review date. Nothing here is planned; the planned items are in the next section.
Separation and storage
- In placeSeparate stacks.The public website and the workspace are separate CloudFormation stacks with their own buckets, roles and CloudFront distributions. Nothing private is deployed into the public site's bucket.
- In placeUploads are validated and scanned before anything is kept.A file lands in a quarantine bucket the browser cannot name, under a policy bound to a server-chosen key, its exact declared length and its SHA-256. It is then re-read for type, size, checksum and file signature, checked structurally — a PDF carrying embedded JavaScript, a launch or open action, an embedded file or an XFA form is refused — and scanned for malware. Only the exact version that passed all of that is promoted; a flagged file is refused and deleted. Scanning runs inside our own AWS account, so drawings are not sent to an outside scanning service.
- In placeInvitations are delivered by the server.The invitation link is emailed from a domain we control with DKIM signing, and is never shown to the architect who created it — so holding the link means control of the mailbox it was sent to, not merely knowing the address. Bounces and complaints suppress the address automatically.
- In placeOperators never hold broad credentials.A production job issues a one-hour set of credentials scoped by policy to exactly one source file version and one output location, with an explicit denial on anything wider. One job's credentials cannot read or write another job's files; that is enforced by AWS and verified against real access-denied responses, not only by our own code.
- In placeRestore and deletion have been rehearsed.A drill restores every table into isolated copies and checks that deleted projects stay deleted, revoked invitations stay revoked, and purged files are not referenced again. Deleting a project removes every stored version, its production jobs, its releases and its exports.
- In placePrivate buckets.The workspace's quarantine, source and artifact buckets block all public access, deny any request that is not over TLS by bucket policy, and are versioned.
- In placeCustomer-managed encryption.Objects are encrypted with a customer-managed KMS key that has automatic rotation enabled. The workspace's DynamoDB tables are encrypted with the same key.
- In placeStandard response headers.Both distributions apply AWS's managed security-headers policy (strict transport security, content-type and frame options, referrer policy).
Sign-in and sessions
- In placeAuthorization code with PKCE.Architects sign in through Amazon Cognito using the authorization-code flow with PKCE; the code verifier is generated and held server-side, and the token exchange is a server-to-server call.
- In placeAdmin-created accounts only.The user pool allows no public sign-up. Team members are invited by their firm's owner, and BMDO creates the first account.
- In placeServer-side sessions.The session cookie carries a random 256-bit token; only its SHA-256 digest is stored. Sessions expire 8 hours after sign-in, absolutely, and the expiry is re-checked on every request. The cookie is HttpOnly, Secure and SameSite=Lax.
- In placeMembership re-checked on every request.The firm a session belongs to is resolved server-side and its membership row is re-read on every call, so removing a member ends their access on their next request.
- In placeCSRF token and Origin check.Every mutating request must carry the session's CSRF token and an Origin header equal to the workspace's origin.
Sharing
- In placePer-recipient grants.An invitation is bound to one recipient email, one project and one release version, with explicit capabilities (view, comment, download) and an expiry of 1 to 90 days. Only a SHA-256 digest of the token is stored; the link is returned once and never stored.
- In placeRevocation on the next request.A revoked grant's status is re-read on every guest request. A wrong email, a revoked or expired grant and a made-up token all receive the same “no longer available” response, so nothing is enumerable.
- In placeTenant scoping.Every project, grant, activity and billing read is scoped to the firm resolved from the session. Another firm's project id is indistinguishable from a missing one.
Logging
- In placeMinimal access logs.The API access log records time, method, path, status, latency and request id. It records no cookies, query strings or bodies, so a session token or sign-in code cannot appear in it.
- In placeNo internals in responses.API responses are marked no-store and never carry internal errors or stack traces.
Payments
- In placeStripe-hosted collection.Card details are entered on Stripe's Checkout and customer-portal pages and never reach BMDO.
- In placeSigned webhooks.Stripe events are verified by HMAC-SHA256 signature with a 5-minute tolerance and a constant-time comparison, then deduplicated by event id.
- In placeSecrets in Parameter Store.Stripe keys live in SSM Parameter Store, encrypted with the stack's key; the application role can read only that path.
Least privilege
- In placeApplication role.May read and write the named DynamoDB tables, read the Stripe parameter path, write its own log group, administer the user pool and use the key. It has no S3 access at all today.
- In placeWorker role.May read the source bucket, write the artifacts bucket and use the key. It has no database access, so a worker cannot read other projects' records or publish a release itself.
Not yet in place
What is still missing.
These are known gaps, listed so that no one reads the section above as complete. Each is a work package in the pilot plan, not a promise with a date.
- Not yetMFA required for owners and operators.Time-based one-time passwords can be set up today and the enforcement switch is built, but it is currently set to warn rather than require. Architect accounts are not in scope for it: that role cannot manage the firm, its members or its billing.
- Not yetA production environment separate from staging.Only staging exists; there is no production stack, and no real client data is in the workspace.
- Not yetThird-party security review.No external review or penetration test has been performed.
- Not yetIdle timeout and per-session revocation.Sessions end at their 8-hour absolute expiry, sign-out, or membership removal; there is no idle timeout and no way for an administrator to end one specific session.
- Not yetAccess logging on the public site.The public website's distribution does not log requests.
Before a real client
Evidence the pilot plan requires first.
The workspace is in a design-exploration phase with no customers. Before real client material is accepted, the plan calls for the following to be recorded, and this page updated to match.
- Two-tenant and revoked/expired-guest negative tests, including all derivative files and old source versions.
- Anonymous access denied at both website/distribution and raw storage endpoints.
- Upload scanning and size enforcement, with malicious and malformed samples handled, verified in staging.
- Reviewed contractual text and accurate privacy and security claims, with consent records tied to document versions.
- Tested backup restore, deletion workflow, incident ownership, access reviews and cost limits.
Contact
Reporting a concern.
Reporting a concern: [Support email]. Until a monitored security address is set up, the address in the footer reaches the owner directly. Please include what you saw, where, and when; do not include plan contents or anyone's personal information in a first message.