Security & Compliance

Tooth Fairy Rate Index — what this app protects, and what it does not.

This page states what this application guarantees about the data it holds and the access it permits. Automated infrastructure checks run at each deployment and appear in section 5. This record is not a SOC 2 report. It is not a HIPAA attestation. Only an auditor can issue those. Each check maps to one or more control families in the tables below.

Scope of this record

Application
Tooth Fairy Rate Index — public marketing campaign demo
Environment
Development — not a production system
Hosting
Google Cloud Run, region us-central1 (United States)
Data store
Google Cloud Firestore, Native mode, location nam5 (US multi-region)
App version
tooth-fairy-index@0.1.0-dev.20260811T160230Z
App deployment
cde8142d-bc43-4e20-993d-53bbde49499e — completed 2026-08-11 16:14 UTC
Database version
gcp-firestore@0.1.0-dev.20260811T061818Z
Database deployment
f10c9a45-5cd5-42c7-83ff-7c619f2d82c0 — completed 2026-08-11 15:59 UTC
Scanner
Checkov, run against the OpenTofu execution plan at deploy time

This record covers only the two deployments named above. A new deployment creates a new record.

1. What data this app collects

A visitor submits two things: a dollar amount and a 5-digit US zip code. The app converts the zip code to a US state in memory. The app never writes the zip code to storage. The app stores only the following:

The database does not store names, email addresses, phone numbers, or postal addresses. It does not store zip codes, account IDs, or IP addresses. It stores no identifier that links two submissions to the same person. The app has no user accounts. Visitors do not log in. No one can tell if two submissions come from the same household or from different households.

The app can use an analytics script. The script counts visits. The script shows how visitors use the page. The analytics script is optional. If no analytics key exists, the app does not load the script. Analytics data stays separate from submitted amounts and shares no identifier with them.

No PHI. This app does not process, store, or transmit protected health information (PHI). The HIPAA Security Rule column in the tables below shows the safeguard family for each technical control.

2. Access control and identity

3. Encryption, availability and integrity

4. Change management and audit trail

5. Independent checks that ran on this deployment

The app deploys in two stages. The build stage compiles the container image inside Google Cloud. The deploy stage runs the service. Checkov scans each stage on its own. The database deploys on its own, and it is checked separately.

16Passed
2Failed
0Suppressed

Build stage — 10 passed, 2 failed

CheckWhat it verifiesResultSOC 2 (TSC)HIPAA Security Rule
CKV_GCP_42Service account has no administrator privilegesPassCC6.1, CC6.3164.308(a)(4), 164.312(a)(1)
CKV_GCP_117No broad "basic" roles (owner/editor/viewer) grantedPassCC6.1, CC6.3164.308(a)(4)
CKV_GCP_46The default service account is not usedPassCC6.1, CC6.2164.312(a)(2)(i)
CKV_GCP_41Service Account User / Token Creator not granted project-widePassCC6.3164.308(a)(4)
CKV_GCP_49Roles cannot impersonate or manage other service accountsPassCC6.3164.308(a)(4)
CKV_GCP_101Container image registry is not publicly accessiblePassCC6.1, CC6.6164.312(a)(1)
CKV_GCP_28Source storage bucket is not anonymously or publicly accessiblePassCC6.1, CC6.6164.312(a)(1)
CKV_GCP_114Public access prevention is enforced on the bucketPassCC6.1, CC6.6164.312(a)(1)
CKV_GCP_29Uniform bucket-level access is enabledPassCC6.3164.308(a)(4)
CKV_GCP_78Bucket versioning is enabledPassA1.2, PI1.4164.312(c)(1), 164.308(a)(7)
CKV_GCP_62Bucket should log access requestsFailCC6.1, CC7.2164.312(b), 164.308(a)(1)(ii)(D)
CKV_GCP_63Bucket should not write access logs to itselfFailCC7.2164.312(b)

Deploy stage — 6 passed, 0 failed

CheckWhat it verifiesResultSOC 2 (TSC)HIPAA Security Rule
CKV_GCP_42The app's runtime identity has no administrator privilegesPassCC6.1, CC6.3164.308(a)(4), 164.312(a)(1)
CKV_GCP_117No broad "basic" roles granted to the runtime identityPassCC6.1, CC6.3164.308(a)(4)
CKV_GCP_46The default service account is not used at runtimePassCC6.1, CC6.2164.312(a)(2)(i)
CKV_GCP_41Service Account User / Token Creator not granted project-widePassCC6.3164.308(a)(4)
CKV_GCP_49The runtime identity cannot impersonate other accountsPassCC6.3164.308(a)(4)
CKV_GCP_101Registry read access is not publicPassCC6.1, CC6.6164.312(a)(1)

Database — no checks evaluated

ResourceChecks runResultNote
google_firestore_database 0 No coverage No automated rule covers this resource type, so no check ran.

Zero checks is not a pass. No automated rule covers this resource type. Sections 2 and 3 describe the database's protections.

6. Open findings

Two checks failed. Both findings concern one resource: the temporary bucket that holds a zip file of the source code during the build.

FindingStatusAssessment
CKV_GCP_62
CKV_GCP_63
Open The build source bucket has no access logging. It does not log reads or writes. The bucket holds only the source code. It contains no campaign data and no visitor data. The bucket blocks all public access and enforces uniform access control. The bucket deletes its contents after 14 days.

These findings come from the shared deployment template, not from this app's own configuration. Every app built from that template has the same findings. The fix belongs in the shared template. Every app will then inherit the fix.

7. Known gaps