15 10 月 2026

把 .env、数据库密码、AccessKey 提交到了 GitHub——这是最常见的数据泄露,没有之一。公开仓库被爬虫秒级扫描,密钥一泄露,云资源被盗用、服务器被当矿机。这篇讲泄露原理、预防配置、泄露后的急救。

需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站和游戏服都能快速部署。

一、泄露是怎么发生的

场景后果
.git 目录能通过 web 访问攻击者下载整个仓库,含所有历史版本
.env/配置文件提交进仓库数据库密码、API Key 全暴露
公网仓库没设私密内部代码、密钥全网可见
前端 JS 里硬编码密钥任何人看源码就能拿到
日志/备份文件在 web 目录www.zip、backup.sql 被直接下载

爬虫有多快:GitHub 公开仓库的密钥,平均几分钟内被自动扫描工具发现。存到上面再删掉也没用——fork、缓存、归档站都留了底。唯一有效的急救是:立刻吊销泄露的密钥。

二、预防:五道防线

2.1 .gitignore 从第一天就写好

# 环境配置(最重要)
.env
.env.*
!.env.example
config.local.php

# 备份和数据库
*.sql
*.zip
*.tar.gz
backup/
db/

# 密钥和证书
*.pem
*.key
id_rsa*
*.p12

# IDE 和系统垃圾
.idea/
.vscode/
.DS_Store
Thumbs.db

# 日志
*.log
logs/

# 依赖(node_modules 别提交,但 lock 文件要提交)
node_modules/
vendor/

2.2 提交前自查

# 看暂存区有没有敏感文件
git status

# 搜敏感关键词(提交前跑一遍)
grep -rniE "password|secret|api[_-]?key|token|access[_-]?key" --include="*.php" --include="*.js" --include="*.py" --include="*.env*" . | grep -v node_modules

# 如果已经 add 了,撤出来
git reset HEAD .env

2.3 密钥和代码分离

# 错误:配置文件写死在仓库里
DB_PASSWORD=123456

# 正确一:配置文件只提交模板,真配置不进仓库
# .env.example(进仓库):
DB_PASSWORD=your_password_here
# .env(不进仓库,gitignore 挡住):

# 正确二:用环境变量注入,CI/CD 里配 secret
export DB_PASSWORD=$(cat /run/secrets/db_pw)

配置分离的完整做法见企业邮箱与邮件发送服务搭建里的 secret 管理一节。

2.4 Nginx 挡住 .git 和备份文件

# 拒绝访问隐藏文件和常见备份格式
location ~ /\.(?!well-known).* {
    deny all;
    access_log off;
    return 404;
}

location ~* \.(sql|zip|tar|tar\.gz|bak|old|swp|log)$ {
    deny all;
    return 404;
}

部署后第一件事:自己访问 http://你的域名/.git/config,返回 404 才算安全,返回文件内容就是裸奔。完整加固见网站常见漏洞与基础防护。

2.5 私密仓库 + 最小权限

  • 内部项目一律 Private,别用 Public「顺便分享」
  • 协作者按需邀请,离职立刻移除
  • 开启仓库的 Secret Scanning(GitHub 自带,泄露密钥自动告警)
  • 云平台 AccessKey 用子账号,按服务授权,别用主账号 Key

三、泄露后急救(已经 push 上去了)

时间就是金钱,按顺序做:

# 1. 吊销泄露的密钥(最重要!现在就做!)
#    - 云 AccessKey:控制台禁用/删除
#    - 数据库密码:ALTER USER ... IDENTIFIED BY '新密码'
#    - API Token:各平台后台重置
# 别等清理完仓库再吊销,先断根

# 2. 仓库改私密(公开的立刻转 Private)

# 3. 从 Git 历史里抹除(仓库还要继续用的话)
git filter-branch --tree-filter 'rm -f .env' --prune-empty HEAD
# 或用 git-filter-repo(更快更安全,推荐)
pip install git-filter-repo
git filter-repo --path .env --invert-paths

# 4. 强推覆盖远程历史(协作者要重新 clone!)
git push origin --force --all

# 5. 检查云账单和访问日志,确认密钥被没用过
#    阿里云/腾讯云控制台看 AccessKey 调用记录

如果仓库已经被 fork 过:历史里的密钥等于公开了,删仓库也没用——必须吊销密钥,这一步没有替代品。

数据库密码泄露后的处置,参考数据库安全加固;确认是否已被入侵,走服务器被入侵应急排查。

四、前端密钥的特殊风险

前端 JS 里的密钥等于公开:

// 错误:地图 API Key、推送 Key 写死在前端
const MAP_KEY = "AKIA........";

// 正确:能暴露的只有「设计上就可公开」的 Key
// - 地图 Key:配 HTTP Referer 白名单(只允许你的域名调用)
// - 推送 Key:用服务端代理转发,前端只碰自己的接口

审查方法:浏览器 F12 → Sources,搜 key|token|secret,看有没有意外暴露的。

五、自查清单

  • [ ] .gitignore 覆盖 .env、*.sql、*.pem、*.log
  • [ ] git log --all -- .env 历史上没提交过敏感文件
  • [ ] 线上访问 /.git/config 返回 404
  • [ ] www.zip、backup.sql 这类文件不在 web 目录
  • [ ] 仓库全是 Private(公开的确认无敏感内容)
  • [ ] 云平台用子账号 AccessKey,不用主账号
  • [ ] GitHub 开启 Secret Scanning 告警
  • [ ] 密钥每季度轮换一次

最后一条最容易被忽略:再严的防护也怕内部人员流动,定期轮换密钥是兜底。轮换和 vault 管理思路见数据泄露应急响应。


代码泄露的防线就五句话:gitignore 写全、提交前搜一遍、密钥代码分离、.git 目录挡死、泄露先吊销密钥。做到这五句,这类事故基本和你无缘。

需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站快速部署。延伸阅读:开源程序部署安全检查、服务器安全基线检查清单、数据泄露应急响应与合规。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:Linux 入侵检测工具实战:rkhunter、AIDE、ClamAV 每周自动扫
  2. 下一篇:网站防扫描与防爆破实战:fail2ban + 限流 + WAF 三层防御
发表评论 4

取消回复