· Security
Critical Infrastructure Operator
Problem
Secrets scattered across repos, CI environment variables, and Slack channels; no rotation, no audit trail.
Outcome
Vault rollout across 12 services; zero plaintext credentials remaining in the codebase.
Key metrics
- Services migrated
- 12
- Plaintext credentials remaining
- Zero
- Rotation automated
- 100%
What we did
The client's codebase contained dozens of hardcoded credentials — database passwords, third-party API keys, internal service tokens — spread across .env files committed to git, CI secrets configured in the UI without documentation, and a Slack channel that had been used to share credentials "temporarily" for two years.
We scanned the full codebase and CI configuration first, cataloguing every secret by type and access scope. The scan surfaced 47 distinct credentials across 12 services. We prioritised by blast radius: database credentials and cloud API keys first, internal tokens last.
Vault was deployed in HA mode with AWS KMS-backed auto-unseal. We wrote Terraform modules for provisioning policies and roles so that every new service got a least-privilege secret path by default. GitHub Actions was wired to use Vault's JWT auth — no static credentials in CI at all.
The migration took four weeks. By the end every credential was in Vault, rotation was automated on a per-secret schedule, and every access was logged. A final scan confirmed zero plaintext credentials in the codebase. The audit trail the client had never had was now on by default.
Have a similar problem?
Start a project →