git - 在用于实时部署的公共存储库中隐藏凭据
问题描述
在 GitHub 等公共存储库中隐藏凭据(例如 API 密钥或数据库凭据)的最佳做法是什么?我的首选解决方案是拥有一个存储凭据的配置文件,然后添加一个 gitignore 文件以在推送期间不包含配置文件。
需要注意的是,每次推送都使用这个 repo 进行部署,例如 Netlify 或 Heroku。所以一个 Netlify / Heroku 网站从 repo push 上线。在这种情况下,如果有 API 调用或数据库请求,则凭证需要在公共存储库中,因为这是“生产文件夹”。
我听说过 Travis CI,它可以在 GitHub 推送之后构建,但我没有深入研究它。从公共存储库部署时,其他项目如何使用其凭据?
解决方案
通常,人们将秘密传递给他们的代码的方式是通过环境,这被认为是最佳实践。原因如下:
- 环境中的秘密永远不会写入磁盘,因此发现或泄露的意外风险要小得多。
- 环境中的秘密仅对具有相同用户 ID 的其他进程可见,这在部署到硬件时很有帮助。
如果您的凭据足够小,您可以使用您正在使用的任何提供者的秘密存储或环境存储。所有主要的 CI 提供商都有这个,我希望大多数主要的托管站点也有。我知道 Heroku 知道。诸如必须是文件的 SSH 密钥之类的东西可以从环境写入磁盘,理想情况下是写入一个已清理的临时目录。
如果您要部署到自己的基础架构,通常您将为此目的使用一些加密的秘密存储。Vault是一个常见的。
如果您需要用于开发的凭据,则可以构建代码,以便secret
在未设置变量的情况下为开发使用提供安全的默认值(如硬编码短语 ),或者您可以在开发和测试代码中提供一组后备. 一些项目也使用.env
文件,尽管这需要一些人不想安装的额外代码。
如果您有无法存储在秘密存储中的大量凭据,则可以对其进行加密并将密码存储在秘密存储中。
推荐阅读
- c# - 带有 httpResponseMessage 的 WebApi 2 下载文件返回未经授权的 401
- django - 从视图中设置字段表单值
- java - 什么时候在 Java 中使用 ArrayList、LinkedList 和 Stack?
- laravel - 如何使用 CRUDBooster 和 Laravel 制作网站?
- python - 在 Numpy 中比较两个数组
- arduino - 为什么在使用对数时显示 Esp32 “nan”?
- node.js - 架构是否必须完全匹配才能返回任何内容?(猫鼬)
- c++ - 基类数据成员类型取决于派生类
- javascript - 无法在 JS 的“while 循环”中检测到无限循环的原因
- php - 如何获取附加数据透视表的数据?