Skip to content

chore(security): add seed prod-guard and pre-commit secret-scan#340

Merged
cola500 merged 1 commit into
stagingfrom
feature/security-hardening-seed-guard-and-secret-scan
May 19, 2026
Merged

chore(security): add seed prod-guard and pre-commit secret-scan#340
cola500 merged 1 commit into
stagingfrom
feature/security-hardening-seed-guard-and-secret-scan

Conversation

@cola500
Copy link
Copy Markdown
Owner

@cola500 cola500 commented May 19, 2026

Summary

Två defense-in-depth-skydd för operativ säkerhet. Rebasad ovanpå origin/staging (inkl. hela Sprint 3-A + 3-A follow-up) så inga main-noise-commits följer med.

Innehåll (1 commit, 6 filer, +435 / −3)

  1. assertSeedSafe() (prisma/seed-guard.ts) — blockerar prisma/seed.ts från att köra mot hosted Supabase. Förhindrar att seed-skript överskriver riktiga konton med test123-lösenord om DATABASE_URL råkar peka på prod. Kräver explicit ALLOW_SEED_PROD=true-bypass.
  2. scripts/check-no-secrets.sh — pre-commit-hook scannar staged content för:
    • Provider API-keys (Anthropic sk-ant-, OpenAI sk-proj-/sk-, Stripe sk_live_/sk_test_/rk_live_/whsec_, Google AIza..., AWS AKIA..., GitHub gh[pousr]_ + fine-grained PAT, Slack xox[baprs]-)
    • Private keys (RSA, OpenSSH, EC, PGP)
    • Supabase service_role JWTs (base64-decode + payload-check, inte bara format)
    • DB connection strings med embedded credentials (utom localhost/dev-format)

Patterns är prefix-baserade och längd-validerade för low-noise. Override per rad med secret-scan:allow. Skippar known-safe-filer (.env.example, .template, .sample, scriptet och dess testfil, .husky/pre-commit, docs).

False-positive verification mot 3A-fixtures

Verifierat före push:

  • Direct pattern grep mot 19 Sprint 3-A + follow-up-filer (upload/messages/push-tokens/booking/storage/sanitize/ghost-user) — 0 träffar mot någon pattern. UUID-fixturer (a0000000-0000-4000-…, b0000000-0000-4000-…) matchar ingen scanner-regex.
  • Pre-commit hook simulering: stage:ade benign diff i upload/route.test.ts, körde scripts/check-no-secrets.shexit 0 (ingen blockering).
  • Canary-test: stage:ade en mock-fil med tre format-korrekta secrets (sk-ant-…, sk-proj-…, sk_live_…) → scanner blockerade alla tre med exit 1. Verifierar att scannern faktiskt fångar riktiga secrets, inte bara är passiv.

Trade-off: test-fixturer split via runtime concat

scripts/check-no-secrets.test.ts innehåller 7 fixturer med secret-format-strängar för att validera scannern. Källfilen splittar prefix via runtime-concatenation ('sk_' + 'live_AAAA...') så GitHub:s egen secret-scanner inte triggar push-protection på denna fil. Runtime-strängen är identisk → scanner-testet beter sig exakt likadant.

Test plan

  • npx vitest run prisma/seed-guard.test.ts scripts/check-no-secrets.test.ts — 20/20 passed
  • npm run typecheck — pass
  • bash scripts/check-no-secrets.sh mot working tree — exit 0
  • False-positive-smoke mot 19 3A-filer — 0 träffar
  • Canary-test — scanner exit 1 på riktiga secret-format
  • Pre-push gates 4/4 gröna

Rebase note

Branchen rebasades från f4a630ca (main) till origin/staging (628c787) för att eliminera main-noise (README cosmetic-updates, voice-log refactor som redan finns på staging via annan commit). PR-diff visar nu endast de 6 säkerhets-filerna.

- assertSeedSafe() blocks prisma/seed.ts against hosted Supabase
  unless ALLOW_SEED_PROD=true (prevents overwriting real account
  passwords with "test123")
- pre-commit hook scans staged content for provider key formats,
  private keys, service_role JWTs, and DB connection strings

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@cola500 cola500 merged commit 58379d3 into staging May 19, 2026
4 checks passed
@cola500 cola500 deleted the feature/security-hardening-seed-guard-and-secret-scan branch May 19, 2026 07:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant