Shared Secrets Files

Understand why committing secrets files to your repository creates security vulnerabilities and learn better alternatives for configuration management.

⚠️ Medium Risk Approach

Avoid in production

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

12  ••••••••••• •
3    ••••••• ••••••••••••••••••••••••••••
4    ••••••••••• ••••••••
5    ••••••••••• •••••••••••••••
6    ••••••• ••••
7  ••
8  •••••••••• •
9    ••••••••• •••••••••••••••••••••••••••••••
10    ••••••••••• ••••••••••••••••••••••
11    •••••• ••••••••••••••••••••••••••••
12  ••
13  •••••• •
14    ••••••••• ••••••••••••••••••••••••••••••••••••••••
1516

🔒 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      ••••••••• ••••••••
78  ••
9  ••••••••••• •
10    ••••••••• •
11      ••••• ••••••••••••••••••••••
12      ••••••••• ••••••••••••••••••••••••••
13      •••• ••••
14    ••
15    ••••••• •••••••••••••••••••••••••••••••
16    •••••••••••••• •••••••••••••••••••••••••••••••
1718••

🔒 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

Critical

Secrets become permanently stored in git history, even if later removed

Overprivileged Access

High

All team members get access to production secrets, violating least privilege

No Environment Separation

High

Development and production secrets often mixed in the same file

Repository Exposure Risk

Critical

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.js

Interactive 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:

Hardcoded Secrets

Next: Learn the proper way with environment variables

Environment Variables