安全习惯
密钥与 .gitignore。
安全习惯
这一课你将能做到
- 正确配置
.gitignore并理解其作用范围 - 使用环境变量或配置管理工具处理敏感信息,而非硬编码
- 如果意外提交了密钥,能够使用
git filter-repo或 BFG Repo-Cleaner 彻底清除历史记录
为什么要学
代码仓库不是保险箱。Git 的设计初衷是「永久保存历史」,这意味着一旦你提交了敏感信息(如 API 密钥、数据库密码、私钥),它就会永远留在历史记录中,即使你后来删掉了文件,别人依然可以通过查看历史提交找到它。这可能导致你的云服务器被滥用、数据库被拖库、公司机密泄露,后果可能是灾难性的。
先建立图像
把 Git 仓库想象成一个公开的相册。你把一张照片(包含敏感信息的文件)贴进去,又撕下来(删除文件),但相册的每一页(提交历史)都留下了印记。任何拿到相册(克隆仓库)的人,只要翻到那一页,就能看到照片。
工作区 (包含敏感信息) → 暂存区 → 提交 → 远程仓库 (GitHub)
↑ ↓
└────────────── 他人克隆/拉取 ──────────────────┘
跟着做
步骤 1:创建并配置 .gitignore
.gitignore 文件告诉 Git 哪些文件或目录不需要跟踪。
- 在项目根目录创建
.gitignore文件:touch .gitignore - 添加规则,例如:
# 依赖目录 node_modules/ vendor/ # 日志文件 *.log # 环境变量文件 .env .env.local # IDE 配置文件 .idea/ .vscode/ # 编译产物 target/ dist/ - 提交
.gitignore文件本身,让团队所有成员共享规则。
步骤 2:使用环境变量管理敏感信息
绝对不要把密码、密钥硬编码在代码里。
错误示范:
// src/main/java/com/example/DatabaseConfig.java
public class DatabaseConfig {
private static final String DB_PASSWORD = "my-secret-password-123";
}
正确示范:
// src/main/java/com/example/DatabaseConfig.java
public class DatabaseConfig {
private static final String DB_PASSWORD = System.getenv("DB_PASSWORD");
}
然后在运行项目前,通过命令行设置环境变量:
# Linux/macOS
export DB_PASSWORD="my-secret-password-123"
# Windows (PowerShell)
$env:DB_PASSWORD="my-secret-password-123"
步骤 3:处理已提交的敏感信息
如果你发现自己已经把 .env 文件提交到了远程仓库,必须立即采取行动。
-
从当前代码中删除文件:
rm .env git rm --cached .env git commit -m "security: 删除包含敏感信息的 .env 文件" -
修改密码/密钥:立即登录相关服务(如 AWS、数据库控制台),修改所有泄露的凭证。旧密码已经不安全了。