24

我在 GitHub 上托管了许多 Rails 应用程序。它们目前都是私有的,我经常会从他们的 GitHub 存储库中部署它们。我希望能够将其中一些开源,就像您可以在http://opensourcerails.com上找到的一样。

我的问题是:如何在不泄露超级机密凭据的情况下公开这些存储库?

例如,我可以查看 /config/initializers/cookie_verification_secret.rb 并查看几乎每一个的 cookie 秘密。我不明白这是怎么接受的。这些用户是否都以某种方式在他们的部署环境中更改了这些值?

一些用户甚至公开了他们的 AWS 秘密和密钥!其他人会将他们的 AWS 密码设置为:

ENV['aws-secret']

尽管我不确定他们在什么时候设置了该值。

那么,在不影响应用程序安全性的情况下开源 Rails 应用程序的最佳实践是什么?

4

5 回答 5

16

我最近用我自己的一个应用程序来解决这个问题。我的解决方案是将任何秘密存储在 git 忽略的 YAML 配置文件中,然后使用初始化程序目录中的简单类访问该文件。配置文件存储在 Capistrano 部署的“共享”文件夹中,并在每次部署时复制到配置中。

配置存储:http: //github.com/tsigo/jugglf/blob/master/config/initializers/juggernaut.rb

用法示例:https ://github.com/tsigo/jugglf/blob/6b91baae72fbe4b1f7efa2759bb472541546f7cf/config/initializers/session_store.rb

您可能还希望从源代码控制中删除使用这些秘密值的文件的所有历史记录。这是我在 Git 中使用的指南:http: //help.github.com/removing-sensitive-data/

于 2010-07-08T22:44:02.497 回答
10

如果您使用的是工头,请将.env文件放在应用程序的根目录中。(工头文档)

.env会有

AWS_SECRET=xxx
AWS_ACCESS=yyy

然后当您需要使用密钥时,插入:

ENV['AWS_SECRET']
ENV['AWS_ACCESS']

尽管重要的是您不要将其提交.env给您的版本控制。因此,如果您使用 git,.env请将.gitignore.


奖金回合!- Heroku

如果部署到 Heroku,这些环境变量也需要在 Heroku 环境中配置。有两种选择:

  1. heroku config:add通过命令手动添加密钥
  2. 使用heroku-config gem 来同步你的本地环境变量,双向。
于 2012-02-16T13:03:32.277 回答
4

根本不存储任何秘密值。在 Git 存储库历史上的任何时候。
这些值应该存储在其他地方,只留下版本化的模板配置文件,以及一个脚本能够:

  • 从外部回购中读取正确的值
  • 并构建完整的最终配置文件(其中包含秘密值)

通过将这两组数据分开(一侧是源,另一侧是秘密值),您可以在不包含任何秘密的情况下开源源代码库。

于 2010-07-08T20:16:55.267 回答
3

实际上,我使用 ENV 从您的问题中得到了提示。

我有三个不同的秘密值,我不想让它们可用。它们当然是应用程序的秘密令牌,也是 Twitter 的消费者密钥和秘密。在我的秘密令牌初始化程序中:

KinTwit::Application.config.secret_token = ENV['SECRET_TOKEN']

Twitter.consumer_key                     = ENV['CONSUMER_KEY']
Twitter.consumer_secret                  = ENV['CONSUMER_SECRET']

我在 Heroku 上托管我的项目,所以我将这些作为配置变量添加到 Heroku。

[03:07:48] [william@enterprise ~/dev/rwc/kintwit]$ heroku config:add CONSUMER_KEY=ub3rs3cr3tk3y
Adding config vars and restarting app... done, v7
  CONSUMER_KEY => ub3rs3cr3tk3y
[03:08:40] [william@enterprise ~/dev/rwc/kintwit]$ heroku config:add CONSUMER_SECRET=ub3rs3cr3tk3y
Adding config vars and restarting app... done, v8
  CONSUMER_SECRET => ub3rs3cr3tk3y
[03:08:57] [william@enterprise ~/dev/rwc/kintwit]$ heroku config:add SECRET_TOKEN=ub3rs3cr3tk3y
Adding config vars and restarting app... done, v9
  SECRET_TOKEN => ub3rs3cr3tk3y

现在,这些值已在我的下一次推送中准备就绪。但是,如果你不使用 Heroku 怎么办?我显然不是每一个 Rails 部署的专家(天哪,甚至不是 Heroku 专业人士),但一个例子就是做一个 db:migrate 进行测试。

$ RAILS_ENV=test rake db:migrate

命令之前的 KEY=value 对设置环境变量,因此运行此命令echo ENV['RAILS_ENV']将打印test. 因此,无论如何,这是在您的环境中设置的,这就是您将如何做到的。但是,环境变量不在您的代码中,所以这就是诀窍。

于 2012-02-15T09:22:30.423 回答
0

[编辑 - 以下方法令人烦恼,必须切换到生产分支以运行“rails 服务器”以包含必要的 cookie。因此,在服务器很困难的情况下进行编辑......我仍在寻找一个好的解决方案]

经过进一步调查,我认为我正在寻找的解决方案是从我的 Git 存储库的主分支中排除任何存储秘密值的东西(正如@VonC 所说)。但是,我没有在单独的存储库中读取这些文件,而是创建了一个新的“生产”分支并将它们添加到其中。

这样他们就被排除在 Master 之外,我可以将其推送到 Github 或其他一些公共 repo 就好了。当我准备好部署时,我可以签出生产分支并将 Master 合并到其中并部署生产。

我需要能够做到这一点,因为 Heroku 和其他主机需要一个 git repo 才能推送到他们的服务器。

更多信息在这里:

http://groups.google.com/group/heroku/browse_thread/thread/d7b1aecb42696568/26d5249204c70574

于 2010-07-11T17:48:42.087 回答