如何在不泄露应用程序的密钥和凭据的情况下打开我的Rails应用程序源代码

时间:2010-07-08 20:13:37

标签: ruby-on-rails git open-source github gitignore

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

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

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

有些用户甚至暴露他们的AWS秘密和密钥!其他人则将其AWS秘密设置为:

ENV['aws-secret']

虽然我不确定他们在什么时候设定了这个价值。

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

5 个答案:

答案 0 :(得分:15)

我最近使用自己的应用程序进行了此操作。我的解决方案是将任何秘密存储在git-ignored YAML配置文件中,然后使用initializers目录中的简单类访问该文件。配置文件存储在Capistrano部署的“shared”文件夹中,并在每次部署时复制到config。

配置商店: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/

答案 1 :(得分:9)

如果您正在使用工头,请在应用的根目录中放置.env文件。 (foreman docs)

.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. 手动添加密钥
  3. 使用heroku-config gem来同步本地环境变量。

答案 2 :(得分:4)

根本不存储任何秘密值。在Git回购历史的任何一点 这些值应存储在其他地方,只留下版本化的模板配置文件,以及能够执行的脚本:

  • 从外部仓库中读取正确的值
  • 并构建完整的配置文件(包含秘密值)

通过将两组数据分开(一方面的来源,另一方面的秘密值),您可以在不包含任何秘密的情况下开源来源回购。

答案 3 :(得分: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部署的专家(jeesh,甚至不是Heroku专业人员),但是这样做的一个例子就是做db:migrate for testing。

$ RAILS_ENV=test rake db:migrate

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

答案 4 :(得分:0)

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

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

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

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

此处提供更多信息:

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