机密扫描与硬编码凭据
使用 git-secrets、gitleaks 和提交前钩子,防止 API 密钥和密码被提交。
机密扫描与硬编码凭据 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
硬编码机密问题
开发者会意外地将 API 密钥、密码、私钥和令牌提交到源代码仓库。一旦进入 git 历史记录,即使删除也会持续存在。公共代码仓库在代码推送后的几秒内就会被机器人抓取。
被提交的内容
代码仓库中常见的机密包括:
- AWS 访问密钥(
AKIA...) - GitHub 个人访问令牌
- 配置文件中的数据库密码
- Stripe/支付 API 密钥
- 私有 TLS/SSH 密钥
- Slack webhook URL
用于预防的提交前钩子
从一开始就阻止机密进入 git:
# Install gitleaks as a pre-commit hook:
pip install pre-commit
# .pre-commit-config.yaml:
repos:
- repo: https://github.com/zricethezav/gitleaks
rev: v8.18.1
hooks:
- id: gitleaks扫描现有代码仓库
扫描现有 repos 中的机密:
# gitleaks: scan entire git history
gitleaks detect --source . --log-opts="--all"
# truffleHog: high-entropy string + regex detection
trufflehog git file://.
# GitHub secret scanning (automatic for public repos)
# Alerts under Security → Secret scanning alertsGitHub 机密扫描
GitHub 会自动扫描公共代码仓库中的已知机密模式(AWS 密钥、GitHub 令牌等),并通知服务提供商。对于私有 repos,GitHub Advanced Security 可以扩展此功能。AWS 等服务提供商在检测到密钥后会自动撤销这些密钥。
.gitignore 方案及其局限性
将 .env 添加到 .gitignore 可以防止意外提交。但开发者仍可能将机密提交到其他文件中,而且如果文件已经提交,.gitignore 也无济于事。深度防御策略:gitignore + 提交前钩子 + CI 扫描。
使用环境变量
机密不应出现在代码中。请使用在运行时加载的环境变量:
# Python:
import os
api_key = os.environ["API_KEY"]
# Node.js with dotenv (for local dev only):
require("dotenv").config()
const apiKey = process.env.API_KEY
# Never commit .env to git机密管理器
生产应用程序应使用专用的机密管理器:
- AWS Secrets Manager — 自动轮换、由 IAM 控制访问权限
- HashiCorp Vault — 开源、适用于企业、支持多种后端
- Azure Key Vault / GCP Secret Manager
机密绝不应存放在代码中,也不应存放在磁盘上的环境变量中。
轮换已泄露的机密
如果机密已泄露:
- 立即撤销该机密(先于调查)
- 检查访问日志,查找未经授权的使用
- 生成新的机密
- 更新所有使用旧机密的系统
- 使用
git-filter-repo或 BFG Repo Cleaner 从 git 历史记录中移除该机密
从 Git 历史记录中移除机密
撤销机密后,从历史记录中移除:
# BFG Repo Cleaner (faster than filter-branch):
java -jar bfg.jar --delete-files .env repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push --force
# Note: force push rewrites history - coordinate with teamCI/CD 流水线中的机密
CI/CD 系统有自己的机密管理机制:
- GitHub Actions:机密存储在仓库/组织设置中 → 通过
${{ secrets.API_KEY }}访问 - GitLab CI:CI/CD 变量
- Jenkins:凭据插件
请在日志中屏蔽机密。切勿在调试输出中打印机密。
快速检查:机密扫描
防止机密进入代码仓库最有效的第一道防线是什么?
课程回顾
git 中的硬编码机密是重大风险,公共 repos 会在几秒内被机器人抓取。预防措施:提交前钩子(gitleaks)、gitignore。检测措施:truffleHog、GitHub 机密扫描。将机密存储在环境变量或专用机密管理器(Vault、AWS Secrets Manager)中。机密泄露后立即轮换,并使用 BFG Repo Cleaner 从 git 历史记录中移除。
常见问题解答
「机密扫描与硬编码凭据」课时是免费的吗?
是的 — 「机密扫描与硬编码凭据」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「机密扫描与硬编码凭据」这节课中我会学到什么?
使用 git-secrets、gitleaks 和提交前钩子,防止 API 密钥和密码被提交。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「机密扫描与硬编码凭据」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。