繁体   English   中英

尝试配置Rails Ruby或jRuby应用程序时,密钥在YAML文件中可见。 是否有一个可以在运行时提供此功能的宝石?

[英]When trying to configure Rails Ruby or jRuby app the secret key is visible in the YAML file. Is there a gem that will provide this at runtime?

在公共云和PaaS环境中运行时,应用程序在生产中需要保护很多秘密。 常见的是mysql用户和密码的database.yml条目,但是可以有其他条目。 您的Google App密码,facebook应用程序密码...等等。 没有明确的方法来保护这些本质上的配置参数。 希望将它们放在文件中,因为不能保证谁可以访问它。

在Heroku中,您可以通过环境变量指定事物。 在Cloudbees(Java PaaS)中,您可以将它们指定为Java System属性。 Heroku和Cloudbees都具有用于上传此配置参数的命令行实用程序,但是不支持在开发和生产中轻松进行此工作。

问题是如何配置参数,以便您可以轻松地在开发中进行开发,而又没有开发中的生产秘密

理想情况下,将有一个可以在ruby和jruby环境以及PaaS中工作的宝石,该宝石可以让我在具有开发设置的YML文件中指定我的机密,但实际的机密是从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

看看Figaro 这几乎就是您所追求的。

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

正如丹尼尔·赖特(Daniel Wright)所说,费加罗报很棒! 它完成了我需要的所有红宝石。 我还需要通过Cloudbees PaaS服务的JVM系统属性在JRuby on rails和属性上提供相同的支持。 我已经将Figaro分叉并进行了这些扩展,并向Laserlemon / Figaro发送了拉取请求。 同时,您可以在gem文件中使用git指令将其拉出。

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

主要差异记录如下

它是如何工作的?

它真的很好。

那里有一些类似的解决方案,还有许多本土尝试。 大多数名称空间是在Config (或类似)名称空间下进行的Config 很好,但是已经有一个描述应用程序环境的地方…… ENV

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

然后,还可以将这些配置参数用作FigaroSettings对象的属性。 因此,如果您有一个名为MY_PROP的属性, MY_PROP可以使用FigaroSettings.my_propFigaroSettings.MY_PROP在代码或配置文件中使用FigaroSettings.MY_PROP

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

另外,这就是在HerokuCloudbees上配置应用程序的方式。 因此,如果您使用ENV配置Rails应用程序,则已经设置为部署到Heroku。 对于Cloudbee,您可以类似地使用FigaroSettings.<property>使用ENV或JVM属性FigaroSettings.<property>

它如何与Cloudbees配合使用?

Cloudbees以类似的方式提供应用程序配置

通常,要配置可通过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

但是Figaro提供了一个完成这项任务的任务! 赶紧跑:

rake figaro:cloudbees

(可选)您可以输入Cloudbees应用程序的名称:

rake figaro:cloudbees[my-awesome-app]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM