浅谈敏感信息处理
“信息安全的核心不是完美的技术,而是有效的管理与人性化的考虑。” —— Bruce Schneier
什么是敏感信息?
在项目开源的过程中,不可避免地会碰到敏感信息,例如:
- 云数据库的账号密码信息
MySQL等数据库的用户名和密码。 - 微信登录涉及的
AppID
、AppSecret
这些信息用于第三方服务的 OAuth 认证,如果泄露可能导致账号被恶意使用。 - API 密钥
用于调用第三方服务的API_KEY
,如支付网关、地图服务、邮件发送等。 - SSH 私钥
服务器管理中的 SSH 私钥文件,如果泄露会让攻击者获得服务器的完全访问权限。 - JWT Secret
这些密钥用于生成和验证 JWT,保护用户身份信息。 - 支付信息
例如:银行卡号、支付网关的密钥(如支付宝的签名密钥)。 - 个人身份信息(PII)
例如:身份证号码、护照信息、电话号码、住址、电子邮件地址等。 - 密码文件
例如:包含用户登录密码或哈希密码的配置文件、.env
文件中明文存储的敏感数据。
这些敏感信息如果在开源项目中暴露,可能会引发数据泄露、财务损失、甚至法律责任等严重后果,因此在项目中需要妥善处理和保护。
解决方案
在实际项目中,敏感信息通常会存储在配置文件中,例如 .application.yml
或 .env
文件中。为了防止这些文件中的敏感信息被上传到 Git 仓库,最彻底的解决方案是在 .gitignore
文件中忽略它们的提交。例如:
1 | src/main/resources/application.yml |
或者使用通配符来忽略所有 .yml
文件:
1 | *.yml |
同样,可以忽略环境变量文件:
1 | .env |
虽然这可以有效防止敏感信息的泄露,但这样做会导致开源仓库缺少必要的配置文件,从而让你的合作者在克隆仓库后,发现还需要自己创建一系列的文件。这显然增加了使用和协作的难度,不是最优的解决方案。
改进方案
为了解决这个问题,我建议在 .gitignore
中忽略包含敏感信息的配置文件的同时,提供一个示例配置文件。这个示例文件只包含必要的配置字段和注释,供开发者参考。这样既能防止敏感信息泄露,又能让项目在开源时保持完整,降低合作者配置的门槛。
假设你有一个包含敏感信息的配置文件 config.yml
,可以在 .gitignore
文件中添加以下内容:
1 | /config.yml |
然后,创建一个示例文件 config.yml.example
,其中包含必要的配置头和注释。其内容可能如下所示:
1 | # 数据库连接信息 |
这样,其他开发者可以很方便地根据示例文件进行配置。为了让使用者更好地理解流程,你还可以在 README
文件中加入相关说明,例如:
部署
克隆项目代码:
1 git clone https://github.com/your-repo/project.git复制示例配置文件并进行必要修改:
1 cp config.yml.example config.yml根据实际情况填写
config.yml
中的相关信息启动项目:
1
2 go build
./project-name
这样既避免了敏感信息的泄露,又为合作者提供了完整的配置指引。
补救措施
如果你不慎将敏感信息提交到了仓库中,并且这些信息已经存在于 Git 历史记录中,这时候 亡羊补牢,为时不晚。
简单地删除文件并重新提交并不能完全解决问题,因为这些敏感信息仍然保留在 Git 的历史记录中。
以下是修复步骤:
1. 备份敏感文件
首先,备份你需要删除的文件(如果这些文件还需要使用),因为接下来的操作会从本地和远程仓库中彻底删除这些文件。
2. 提交或撤回未提交的修改
如果项目中有未提交的更改,请将其提交到仓库,或撤回这些修改。否则,执行后续步骤时,Git 会报错:Cannot rewrite branches: You have unstaged changes.
3. 执行清除命令
使用 git filter-branch
命令清除历史记录中的敏感文件。以下命令会删除特定文件的历史记录:
1 | git filter-branch -f --tree-filter 'rm -f src/main/resources/application.yml' HEAD |
请将示例中的文件路径替换为你要删除的实际文件路径(相对路径)。
可能要等待一段时间,结果大概是这样:
4. 强制推送修改
清除文件后,使用以下命令强制推送修改到远程仓库:
1 | git push origin main --force |
如果你的分支名称不是 main
,请将 main
替换为你的实际分支名称。
注意:强制推送会覆盖远程仓库的历史记录,所有与该分支有关的开发者需要重新拉取代码。因此,请提前告知团队成员。
5. 重新创建文件并防护敏感信息
完成上述步骤后,根据前文提供的解决方案,重新创建示例配置文件,并确保敏感信息得到了适当的防护。
- 本文作者: NICK
- 本文链接: https://nicccce.github.io/TechNotes/About-Sensitive-Data/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!