如何在Rails 4.1中使用secrets.yml for API_KEYS?

mar*_*nig 25 security capistrano ruby-on-rails

在我最近的一个项目中,我从.gitignoring包含秘密和环境变量的文件开始.所以整个项目都致力于repo,除了包含第三方秘密的文件,如Stripe,Twitter API或Facebook Graph或内部api_keys,./config/initializers/secret_token.rb文件等.

现在我正处于项目即将上线的地步(兴奋!)我需要使用Capistrano将所有环境变量移植到生产服务器上,即 cap production deploy.

[编辑4:是的,2018年]在initializers/secret_token.rb的情况下,很明显Rails 4.1有一种处理secrets.yml文件的新方法,该文件将:secret_key_base值拉入生产服务器.在这里,我建议使用capistrano-secrets-yml gem,它开箱即用,并且易于使用.

剩下的是将其他秘密(如API_KEYS,APP_ID等)传送到生产服务器而不检查任何进入仓库的方法.如何做到这一点,最推荐/最安全的方式或最佳做法是什么?

注意:随着时间的推移,我将编辑问题/我会更清晰.

EDIT1:Server是DigitalOcean上的Ubuntu/Linux VPS [回答丹尼斯,下面].

EDIT2:env_variables/secrets可以通过secrets.yml转发到服务器吗?会话的Secret_token毕竟不是唯一的秘密![在Edit3上回答]

编辑3:是的!根据这个博客,可以通过secrets.yml发送API_keys .将在某个时候分享我的发现.:-)

mar*_*nig 43

第一条规则:不要检查secrets.yml回购.

好吧,这是一个secret.yml看起来如何:

development:
  secret_key_base: 6a1ada9d8e377c8fad5e530d6e0a1daa3d17e43ee... 
  # Paste output of $ rake secret here for your dev machine.

test:
  secret_key_base: _your_secret_ as above

production:
  secret_key_base: <%= secure_token %>


  STRIPE_PUBLISHABLE_KEY: 'Put your stripe keys for production'
  STRIPE_SECRET_KEY: 'Put actual keys for production here'
  FB_APP_SECRET: 'same as above'
  FB_CALLBACK_URL: 'FB url here'
  FB_CALLBACK_UPDATE_URL: 'FB url here'
  GOOGLE_KEY: 'Put your keys for production'
  GOOGLE_SECRET: 'same as above'
  TWITTER_KEY: 'same as above'
  TWITTER_SECRET: 'same as above'
  TWITTER_USERNAME: 'same as above'
  LINKEDIN_KEY: 'same as above'
  LINKEDIN_SECRET: 'same as above'
Run Code Online (Sandbox Code Playgroud)

注意块secure_token中的那个production:.在生产服务器上,我正在使用初始化程序动态生成secret_tokens.

旁注:注意.yml文件中的空格和制表符.它必须正确格式化并间隔开(例如在':'符号后面有一个空格).

要在生产中进行设置,您可以直接从本地scp文件或使用capistrano-secrets-yml gem.

这不行.根据@ OddityOverseer的答案,查看更新的方法.

要访问应用中的环境变量,请environments/production.rb使用:

FB_APP_SECRET            = ENV['FB_APP_SECRET']
FB_CALLBACK_URL          = ENV['FB_CALLBACK_URL']
FB_CALLBACK_UPDATE_URL   = ENV['FB_CALLBACK_UPDATE_URL']
GOOGLE_KEY               = ENV['GOOGLE_KEY']
GOOGLE_SECRET            = ENV['GOOGLE_SECRET']
TWITTER_KEY              = ENV['TWITTER_KEY']
TWITTER_SECRET           = ENV['TWITTER_SECRET']
TWITTER_USERNAME         = ENV['TWITTER_USERNAME']
LINKEDIN_KEY             = ENV['LINKEDIN_KEY']
LINKEDIN_SECRET          = ENV['LINKEDIN_SECRET']
Run Code Online (Sandbox Code Playgroud)

2016年8月更新:

要访问应用中的环境变量,请environments/production.rb使用:

FB_APP_SECRET            = Rails.application.secrets.FB_APP_SECRET
FB_CALLBACK_URL          = Rails.application.secrets.FB_CALLBACK_URL
FB_CALLBACK_UPDATE_URL   = Rails.application.secrets.FB_CALLBACK_UPDATE_URL
GOOGLE_KEY               = Rails.application.secrets.GOOGLE_KEY
GOOGLE_SECRET            = Rails.application.secrets.GOOGLE_SECRET
TWITTER_KEY              = Rails.application.secrets.TWITTER_KEY
TWITTER_SECRET           = Rails.application.secrets.TWITTER_SECRET
TWITTER_USERNAME         = Rails.application.secrets.TWITTER_USERNAME
LINKEDIN_KEY             = Rails.application.secrets.LINKEDIN_KEY
LINKEDIN_SECRET          = Rails.application.secrets.LINKEDIN_SECRET
Run Code Online (Sandbox Code Playgroud)

就是这样.


dkn*_*fin 32

Rails.application.secrets.key_name


Den*_*ise 8

一种方法是将这些密钥存储在环境变量中.如何设置环境变量因您所使用的操作系统而异.对于Linux机器,通常您在主目录中编辑.bashrc或.bash_profile文件并添加如下所示的行:

export API_KEYS=apikeygoeshere
Run Code Online (Sandbox Code Playgroud)

你必须为任何用户运行rails编辑文件.

然后production.rb,您可以将这些环境变量称为:

ENV["API_KEYS"]
Run Code Online (Sandbox Code Playgroud)

另一个选择是使用红宝石宝石,基本上为你照顾,如figaro.它的工作方式是您创建另一个未签入的文件,figaro负责将它们设置为环境变量,然后您可以使用ENV["API_KEYS"]上述内容在development.rb/production.rb脚本中引用它们.因为您没有检入包含所有环境变量的文件,所以您必须找到一些方法将该文件放到运行代码的任何机器上.