你如何在铁轨中保密秘密?

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

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

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

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

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

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

*我不是这方面的专家,但这对我来说效果很好,似乎是一个很好的解决方案。 它结合了这个问题的答案中的信息以及这个问题的答案( 使用Rails secrets.yml的逐步解释,而不是在部署到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= ,其中应该从test: secret_key_base:复制并粘贴heroku config:set SECRET_KEY_BASE_TEST= ,它位于secrets_backup.yml

6)在终端类型heroku config:set SECRET_KEY_BASE_DEV= ,其中应该从development: secret_key_base:复制和粘贴development: secret_key_base: ,它位于secrets_backup.yml

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

8)将您的仓库推送到GitHub和Heroku

9)微笑因为你是GOAT并炫耀你的甜蜜网站!

据我所知,Rails还没有解决这个问题(从Rails 4.2开始)。

这是一个关于混乱局面的精彩总结

从Rails 4.1开始,有一个secrets.yml文件可以保存所有秘密,但默认情况下不在.gitignore 。 人们告诉你把它放入.gitignore但这对Heroku用户无法生产。 有一颗gem可以帮助你。 如果你这样做那么你也可以使用费加罗gem以更整洁的方式完成所有这些工作。

secrets.yml文件的默认内容看起来Rails开发人员希望它包含在源代码存储库中,但是对于任何真正的秘密,你应该使用环境变量并将它们导入到秘密文件中,这几乎是打败了目的。

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

 heroku config:set YOUR_SECRET_VAR_NAME=your_secret 

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

dotenv gem解决了这些问题,让你做环境变量而没有它们的所有缺点。 我建议您将dotenv与secrets.yml结合使用,而sectrets.yml.gitignore放置sectrets.yml并在Heroku上手动设置环境变量。

UPDATE

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

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

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

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

希望这可以帮助。

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

 *.yml 

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

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