如何在不泄露应用程序的密钥和凭据的情况下打开源我的Rails应用程序
我在GitHub上托管了许多Rails应用程序。 它们目前都是私有的,我经常会从它们的GitHub存储库中部署它们。 我希望能够将它们中的一些开源,就像你可以在http://opensourcerails.com上找到的那样。
我的问题是:如何在不泄露超级秘密凭证的情况下公开这些存储库?
例如,我可以查看/config/initializers/cookie_verification_secret.rb并查看几乎每一个的cookie秘密。 我不明白这是怎么接受的。 这些用户是否都在某种程度上在部署环境中更改这些值?
有些用户甚至暴露他们的AWS秘密和密钥! 其他人则将其AWS秘密设置为:
ENV['aws-secret']
虽然我不确定他们在什么时候设定了这个价值。
那么,在不影响应用程序安全性的情况下,开源Rails应用程序的最佳实践是什么?
我最近使用我自己的应用程序进行了此操作。 我的解决方案是将任何秘密存储在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/
如果您正在使用工头,请将.env
文件放在应用的根目录中。 (工头博士)
.env
将有
AWS_SECRET=xxx AWS_ACCESS=yyy
然后当您需要使用密钥时,插入:
ENV['AWS_SECRET'] ENV['AWS_ACCESS']
虽然重要的是你不要将此.env
提交给你的版本控制。 因此,如果您正在使用git,请将.env
添加到.gitignore
。
奖金回合 ! – Heroku
如果部署到Heroku,则需要在Heroku环境中配置这些环境变量。 有两种选择:
- 通过
heroku config:add
命令手动添加密钥 - 使用heroku-config gem来同步本地环境变量。
根本不存储任何秘密值。 在Git回购历史的任何一点。
这些值应该存储在其他地方,只留下版本化的模板配置文件,以及能够执行的脚本:
- 从外部仓库中读取正确的值
- 并构建完整的最终配置文件(其中包含秘密值)
通过将两组数据分开(一方面的来源,另一方面的秘密值),您可以在不包含任何秘密的情况下开源来源回购。
我实际上使用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进行测试。
$ RAILS_ENV=test rake db:migrate
在命令设置环境变量之前的KEY =值对,因此运行此命令, echo ENV['RAILS_ENV']
将打印test
。 因此,在您的环境中设置这是您将如何做到这一点。 但是,环境变量不在你的代码中,所以这就是诀窍。
[编辑 – 以下方法有一个烦恼,必须切换到生产分支运行“rails服务器”,以包括必要的cookie。 因此,在服务器很难的时候进行编辑……我仍然在寻找一个好的解决方案]
在进一步调查之后,我认为我正在寻找的解决方案是从我的Git repo的主分支中排除存储秘密值的任何东西(正如@VonC所说)。 但是,不是在单独的仓库中读取这些文件,而是简单地创建一个新的“生产”分支并将其添加到该分支中。
这样他们就被排除在师父之外,我可以把它推到Github或其他一些公共回购中。 当我准备部署时,我可以签出生产分支并将Master合并到其中并部署生产。
我需要能够这样做,因为Heroku和其他主机需要将一个git repo推送到他们的服务器。
更多信息:
http://groups.google.com/group/heroku/browse_thread/thread/d7b1aecb42696568/26d5249204c70574