Shared Secrets Files
Understand why committing secrets files to your repository creates security vulnerabilities and learn better alternatives for configuration management.
⚠️ Medium Risk Approach
While slightly better than hardcoded secrets, committing secrets files to your repository still exposes sensitive information to anyone with repository access and creates permanent security risks in your version control history.
Common Shared Secrets Patterns
secrets.json File
secrets.json File Example
1•
2 ••••••••••• •
3 ••••••• ••••••••••••••••••••••••••••
4 ••••••••••• ••••••••
5 ••••••••••• •••••••••••••••
6 ••••••• ••••
7 ••
8 •••••••••• •
9 ••••••••• •••••••••••••••••••••••••••••••
10 ••••••••••• ••••••••••••••••••••••
11 •••••• ••••••••••••••••••••••••••••
12 ••
13 •••••• •
14 ••••••••• ••••••••••••••••••••••••••••••••••••••••
15 •
16•🔒 Secret Hidden
⚠️ Problem: All secrets visible to anyone who clones the repository
config.js with Secrets
config.js with Secrets Example
1•• ••••••••• • ••••••••• •• ••••••••••
2•••••••••••••• • •
3 •••••••••••• •
4 ••••••••• •
5 ••••• ••••••••••••
6 ••••••••• ••••••••
7 •
8 ••
9 ••••••••••• •
10 ••••••••• •
11 ••••• ••••••••••••••••••••••
12 ••••••••• ••••••••••••••••••••••••••
13 •••• ••••
14 ••
15 ••••••• •••••••••••••••••••••••••••••••
16 •••••••••••••• •••••••••••••••••••••••••••••••
17 •
18••🔒 Secret Hidden
⚠️ Problem: Production secrets mixed with configuration
Loading Shared Secrets
Loading Shared Secrets Example
1•• •••••• • ••••• •••••• ••••••• ••••
2••••• ••••••• • ••••••••••••••••••••••••••
3••••• •••••• • •••••••••••••••••••••••
4
5•• •••••••• •••••••••• ••••• •••••• •••••••
6••••• •••••••• • •
7 ••••• ••••••••••••••••••••••
8 ••••• ••••••••••••••••••••••••••
9 ••••••••• ••••••••••••••••••••••••••
10 ••••• •••••••••••••••••••••
11••
12
13•• ••• •••••••••••••
14••••• ••••••••• • •••••••••••••••••••••••
15••••• ••••••••• • •••••••••••••••••••
16
17••••••••••••••••••••••• ••••• •••••••••••••••🔒 Secret Hidden
⚠️ Problem: Application depends on committed secrets
Why Shared Secrets Are Problematic
Version Control History
Secrets become permanently stored in git history, even if later removed
Overprivileged Access
All team members get access to production secrets, violating least privilege
No Environment Separation
Development and production secrets often mixed in the same file
Repository Exposure Risk
If repository becomes public or is compromised, all secrets are exposed
Better Approaches
Separate Configuration Files
Keep configuration structure in repo, secrets elsewhere
Separate Configuration Files Implementation
1// config.template.json (committed)
2{
3 "database": {
4 "host": "REPLACE_WITH_DB_HOST",
5 "username": "REPLACE_WITH_USERNAME",
6 "password": "REPLACE_WITH_PASSWORD"
7 }
8}Environment-Based Loading
Load secrets from environment variables or external sources
Environment-Based Loading Implementation
1// config.js (committed)
2module.exports = {
3 database: {
4 host: process.env.DB_HOST,
5 username: process.env.DB_USERNAME,
6 password: process.env.DB_PASSWORD
7 }
8}CLI Demo (Terminal)
Run the shared secrets demo from your terminal in this project root:
Run CLI demo
1# From project root
2node app-shared.js
3
4# Or with Bun
5bun app-shared.jsInteractive Demo & Guided Lab
This unified demo reenacts a shared secrets leak and walks through the guided lab steps. The output includes console logs, demo results, and lab scenario tasks and resources.
Three-Week Migration Timeline
Week 1
- Inventory every secrets.* or config.* file committed to the repo
- Create configuration templates that exclude sensitive values
- Update documentation explaining the new separation
Week 2
- Introduce environment variable loading with validation
- Set up secret scanning in CI and pre-push hooks
- Ensure pipeline secrets are stored outside of version control
Week 3
- Rotate exposed credentials and remove secrets files from history
- Schedule access reviews for teams that previously read secrets
- Train developers on the new workflow and escalation paths
GitHub's Secret Detection
GitHub automatically scans repositories for known secret patterns and alerts you when secrets are detected:
- Secret scanning: Automatically detects API keys, tokens, and credentials
- Push protection: Prevents commits containing secrets from being pushed
- Partner alerts: Notifies service providers when their secrets are exposed
💡 Even with these protections, it's better to never commit secrets in the first place!
Source Code & Live Demo
See how shared secrets appear in a real repository and how GitHub detects them:
Next: Learn the proper way with environment variables
Environment Variables