尝试配置Rails Ruby或jRuby应用程序时,密钥在YAML文件中可见。有没有一个gem会在运行时提供这个?

时间:2012-10-04 17:45:49

标签: ruby-on-rails security heroku jruby cloudbees

在公共云和PaaS环境中运行时,应用程序需要在生产中保护许多秘密。常见的一个是mysql用户和密码的database.yml条目,但也可以有其他条目。你的谷歌应用程序秘密,Facebook应用程序秘密,...列表继续。没有明确的方法来保护这些基本配置参数。你不要想把它们放在一个文件中,因为无法保证谁有权访问它。

在Heroku中,您可以通过环境变量指定内容。在Cloudbees(Java PaaS)中,您可以将它们指定为Java System属性。 Heroku和Cloudbees都有一个命令行实用程序来上传这些配置参数,但是不支持在开发和生产中轻松完成这项工作。

问题是如何配置参数,以便您可以在开发中轻松开发,但不能在开发中使用生产秘密

理想情况下,有一个宝石可以在ruby和jruby环境和PaaS中工作,这将允许我在开发中具有开发设置但从ENVjava.lang.System.getProperty

##
# file: config/secure_config.yml
development:
  db:
    user_id: 'dev_mysql_user'
    password: 'my_dev_pwd'
  google:
    app_id: 'xxxxx' # this is the secret for the dev app so it can be visible
    app_secret: 'xxxxx'
# ...
production:
  db:
    user_id: <%= get_secure_config %>
    password: <%= get_secure_config %>
  google:
    app_id: <%= get_secure_config %>
    app_secret: <%= get_secure_config %>

在Ruby或jRuby的情况下,get_secure_config帮助程序从ENVjava.lang.System.getProperty获取值。最后,您可以根据需要在您的应用中使用它们。例如,在database.yml或设计代码中使用google进行身份验证。

# config/database.yml
# ...
production:
  adapter: mysql2
  username: <%= SecureConfig.db.user_id %>
  password: <%= SecureConfig.db.password %>

然后为了额外的酷,gem还应该给我一个可执行文件,允许我将配置推送到我的PaaS

~/work/myproject> bundle exec secure_config -push_to_heroku

~/work/myproject> bundle exec secure_config -push_to_cloudbees

2 个答案:

答案 0 :(得分:3)

结帐Figaro。它几乎就是你所追求的。

您将敏感数据放在git-ignored YAML文件中,然后在ENV中将其提供给应用程序。它还提供了一个rake任务,用于使用变量配置Heroku实例。

答案 1 :(得分:2)

正如Daniel Wright所说,费加罗上面很棒!它为轨道上的红宝石做了我需要的一切。我还需要通过Cloudbees PaaS服务的JVM系统属性在JRuby上获得对rails和属性的相同支持。我有forked Figaro并进行了这些扩展,并向laserlemon / Figaro发送了拉取请求。同时你可以在你的gem文件中使用git指令来拉它。

gem 'figaro', '0.4.2', :git => "git://github.com/RedMicaInc/figaro.git"

主要差异记录如下

它是如何工作的?

效果很好。

有一些类似的解决方案,以及许多本土尝试。大多数命名空间配置在Config(或类似)命名空间下。这很好,但是已经有了一个描述应用程序环境的地方...... ENV

ENV是一组简单的字符串键/值对,它非常适合应用程序配置。

然后,这些配置参数也可用作FigaroSettings对象的属性。因此,如果您有一个名为MY_PROP的属性,则可以使用FigaroSettings.my_propFigaroSettings.MY_PROP

在代码或配置文件中使用它

对于基于JRUBY的应用程序,存储在JVM系统属性中的属性也以类似的方式提供。例如,如果您有一个名为MY_JAVA_PROP的属性,则可以FigaroSettings.MY_JAVA_PROP访问它。 Java属性区分大小写。

作为一个额外的好处,这正是HerokuCloudbees上的应用的配置方式。因此,如果您使用ENV配置Rails应用程序,则已经设置为部署到Heroku。对于Cloudbees,您可以使用ENV

类似地使用FigaroSettings.<property>或JVM属性

它如何与Cloudbees一起使用?

Cloudbees以类似的方式提供应用configuration

通常,要配置可通过JVM系统属性访问的应用程序参数,可以使用cloudbees sdk从命令行执行以下操作:

cloudbees config:set -a <my_app> PUSHER_APP_ID=8926
cloudbees config:set -a <my_app> PUSHER_KEY=0463644d89a340ff1132
cloudbees config:set -a <my_app> PUSHER_SECRET=0eadfd9847769f94367b

但费加罗提供了一项耙子任务!跑吧:

rake figaro:cloudbees

您可以选择传递Cloudbees应用程序的名称:

rake figaro:cloudbees[my-awesome-app]

如果您只想查看使用的命令,可以运行rake figaro:heroku_test