问题描述
提出了一个关于在生产环境中存储开源项目敏感信息的问题。他的项目是一个简单的 Laravel 应用,部署在自己网络上的闲置笔记本上(使用 Nginx 在 Ubuntu 上)。虽然项目仓库是公开的,但目前还没有包含任何敏感信息。他希望隐藏代码中的 API 密钥等敏感信息(在 GitHub 上是公开的)。此外,他已经在 GitHub 账户上设置了一些在代码推送到主分支时运行的 GitHub Actions,这些 Actions 使用了他的 GitHub 账户中的 secrets。他已经意识到不应该将 .env 文件提交到仓库中。主要问题包括:
1. 是否应该将所有敏感信息存储在 GitHub 的 secrets 中?
2. 在服务器上手动添加这些 secrets 到生产环境/配置,还是通过 GitHub Actions 的部署任务自动添加?
3. 是否应该将 secrets 存储在数据库中或加密后存储在代码中,但这些解决方案似乎都需要用户维护某些信息来保持对这些 secrets 的访问。
此外,用户还有一个额外的问题,关于何时手动编辑生产服务器上的项目文件,何时通过部署自动进行更改,因为生产环境与开发环境/仓库需要不同的配置。
解决方案
请注意以下操作可能因版本和工具不同而有所不同,请谨慎操作并备份重要数据。
存储敏感信息
在处理敏感信息时,有几种常见的方法:
使用 GitHub Secrets:对于与 GitHub 相关的敏感信息,如 API 密钥,可以将其存储在 GitHub Secrets 中。这些 secrets 在 GitHub 仓库设置中进行管理,只有具有访问权限的人才能查看和修改。GitHub Actions 和其他 CI/CD 工具可以访问这些 secrets,用于自动化部署等任务。
服务器环境变量:将敏感信息作为服务器环境变量配置。这样,您可以在部署时手动将这些变量添加到服务器的环境中。在 Laravel 项目中,您可以使用
.env
文件来管理这些变量,但不要将.env
文件提交到版本控制中。通过在服务器上设置这些环境变量,您可以在代码中通过getenv()
等方法来访问它们。
自动化部署
针对自动化部署和添加 secrets 到生产环境,您有几种选项:
GitHub Actions 部署任务:利用您已经设置的 GitHub Actions,可以在推送代码到主分支时自动触发部署任务。在这些部署任务中,您可以通过 GitHub Secrets 访问敏感信息,并将其添加到服务器环境变量中。这可以确保您的生产环境中的敏感信息与您的 GitHub Secrets 保持同步。
使用脚本或工具:您还可以编写自定义脚本或使用部署工具来管理自动化部署。例如,您可以编写一个脚本,在部署过程中从 GitHub Secrets 获取敏感信息,并将其设置为服务器环境变量。
关于存储敏感信息的其他考虑
- 尽可能避免将明文敏感信息存储在代码中。加密是一种更安全的选择,但确保您能够管理加密密钥和解密过程。
- 如果考虑将 secrets 存储在数据库中,请确保数据库也得到了适当的保护,以防止非授权访问。
配置管理
对于不同环境(例如开发环境和生产环境)的配置差异,可以使用不同的方法来处理:
环境变量:使用不同的环境变量配置,可以在不同的环境中加载不同的配置。例如,在 Laravel 中,您可以使用
.env
文件来管理不同环境的配置变量。配置文件:使用不同的配置文件来分别管理不同环境的配置。在部署过程中,您可以选择性地部署适当的配置文件。
无论您选择哪种方法,确保在生产环境中保持敏感信息的安全性,以及正确配置各个环境的设置。
总结
在处理开源项目中的敏感信息时,您可以使用 GitHub Secrets 或服务器环境变量来存储和管理这些信息。利用 GitHub Actions 或自定义脚本来自动化部署,并确保生产环境和开发环境的配置能够正确地管理。遵循最佳实践,确保敏感信息得到适当的保护,从而保证您的项目的安全性和可维护性。