你如何在rails中保密secrets..lll秘密?

时间:2015-07-29 01:13:39

标签: ruby-on-rails git ruby-on-rails-4 heroku

我对rails非常陌生,但我有一些使用PHP和其他语言编程的经验。我非常喜欢rails,而且我正在为我的公司开发一个应用程序,但我仍然不完全理解secrets.yml文件如何与git和heroku一起工作。我知道秘密用于身份验证,但是我还不清楚如何在通过git部署到heroku时保密它们。

第一个问题是,我真的需要保密我的开发和测试秘密吗? Rails自动将生产开发秘密设置为环境秘密(我仍然不完全理解),但是为什么人们知道我的开发和测试秘密是什么呢?

其次,什么是更好地理解使用secrets.yml文件与git一起使用的好资源? rails指南似乎没有很好地使用它(只有一个段落专门用于secrets.yml),这似乎是一个非常重要的主题,可能会导致应用程序中出现严重的安全漏洞。

最后,其他人如何保护自己的秘密?看看github上的几个示例应用程序,我注意到大多数人似乎没有采取任何措施将秘密文件保存在.gitignore中。这只是一种疏忽,还是因为它不像我认为的那样严重的安全问题?

我感谢任何帮助。我一直在研究这个特定的问题,并没有真正得到任何全面的解决方案。我想向我的公司展示我的项目,并解释使用git这样的版本控制系统的优势,但我也希望该应用程序足够安全,相信它能保证我公司的数据安全。

4 个答案:

答案 0 :(得分:5)

据我所知,Rails还没有解决这个问题(截至Rails 4.2)。

这是一个很棒的summary of the mess situation

从Rails 4.1开始,secrets.yml文件适用于您的所有秘密,但默认情况下它不在.gitignore。人们告诉你将它放入.gitignore,但这并不能帮助Heroku用户将其投入生产。有a gem可以帮助解决这个问题。如果你这样做,那么你也可以使用以更整洁的方式完成所有这些工作的Figaro gem

secrets.yml文件的默认内容看起来Rails开发人员希望将其包含在源代码存储库中,但是对于任何真实的秘密,您应该这样做使用环境变量并将其导入到秘密文件中,这几乎无法实现目的。

如果你想使用环境变量来保存秘密,这意味着底层操作系统会为你存储它们,当你需要使用它们时,你会向操作系统询问变量是什么,这就是它不在你的代码。在Heroku上设置环境变量的命令如下所示:

heroku config:set YOUR_SECRET_VAR_NAME=your_secret

这样做有一些缺点。如果你有很多秘密,事情会很快变得混乱,并且很难在新机器上安装它。

dotenv gem解决了这些问题,让您在没有所有缺点的情况下执行环境变量。我建议您将dotenv与secrets.yml结合使用,而不必在sectrets.yml中放置.gitignore并在Heroku上手动设置环境变量。

更新

Rails 5.2最终通过在Rails应用程序中加密你的所有秘密来解决这个问题,你只需要在环境变量中存储一个密钥。

答案 1 :(得分:5)

这是一个(希望很简单)分步指南FOR HEROKU,应该在将文件(secrets.yml)推送到GitHub或其他主机之前执行。

*我不是这方面的专家,但这对我来说效果很好,似乎是一个很好的解决方案。它结合了这个问题的答案中的信息以及这个问题的答案(Step by Step explanation for using Rails secrets.yml without exposing keys to public repo when deploying to Heroku),以提供一个简单的指南:)

1)将secrets.yml复制到另一个名为secrets_backup.yml

的文件中

您现在应该拥有两个与secrets.yml

相同内容的文件

2)将secrets_backup.yml添加到.gitignore

3)将secrets.yml中的文字更改为以下

development:
  secret_key_base: <%= ENV["SECRET_KEY_BASE_DEV"] %>
test:
  secret_key_base: <%= ENV["SECRET_KEY_BASE_TEST"] %>
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

4)cd到命令行上的rails项目文件夹

5)在终端类型heroku config:set SECRET_KEY_BASE_TEST=<pasted key>中, 应从<pasted key>

中的test: secret_key_base:<key>复制和粘贴secrets_backup.yml的位置

6)在终端类型heroku config:set SECRET_KEY_BASE_DEV=<pasted key>中, 应从<pasted key>

中的development: secret_key_base:<key>复制和粘贴secrets_backup.yml的位置

7)我的secrets.yml文件已经有了SECRET_KEY_BASE而不是实际密钥,所以我怀疑你的文件也是如此。但如果没有,请将SECRET_KEY_BASE变量设置为上面设置的其他两个变量。

8)将你的回购推送到GitHub和Heroku

9)笑,因为你是G.O.A.T并炫耀你的甜蜜网站!

答案 2 :(得分:2)

所有非常好的问题。虽然不保证开发和测试机密可能没有严重的危害,但这样做是很好的做法。在揭示信息方面没有任何好处,这可能使不良行为者更容易访问您的应用程序代码或数据。

从Rails 4.1开始,config/secrets.yml可用于管理所有应用程序机密。这在Rails 4.1 release notes中有所描述。如果你在这个文件中管理你的秘密,你绝对应该在.gitignore中包含该文件,这样你的秘密就不会出现在你的代码库中,即使它当前是私有的。您永远不知道您是否希望将来开源代码或与其他协作者共享您的私人存储库。您可能知道,一旦您将文件放在git中,它可以是一个涉及的过程来删除它的所有痕迹。或者,您可以在git中维护一个secrets.yml模板,以便您拥有秘密文件格式的源代码控制权,但将实际机密保存在单独的文件中。

如何管理生产中的秘密取决于您的部署平台。如果部署到您自己的服务器,您只需确保您有一个机制来单独维护secrets.yml的部署,因为它在您的git存储库中不可用。您应该可以使用CapistranoMina等工具在整个部署过程中对此进行管理。如果部署到Heroku,则需要通过Heroku CLI或Heroku仪表板设置配置变量,如documentation中所述。

希望这有帮助。

答案 3 :(得分:1)

首先,我总是将所有.yml个文件添加到我的.gitignore文件中,如下所示:

*.yml

这可以保留任何配置文件不受git的影响。但是,我还创建了“分发文件”来继续使用git。基本上,将somefile.yml克隆到somefile.yml.dist并删除实际值,但保持结构/键完好无损,因此使用您的代码的任何其他人都可以“填补空白”。

保持您的开发/测试机密的秘密并不重要,只要它们与您的生产机密不同即可。一些秘密(如果您使用的是Cloudinary)对于所有环境都是相同的,因此您不希望共享这些秘密。