2

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

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

问题是你如何配置你的参数,以便你可以在开发中轻松开发,但在开发中没有生产秘密可用

理想情况下,将有一个可以在 ruby​​ 和 jruby 环境和 PaaS 中工作的 gem,它允许我在 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 %>

get_secure_config 帮助程序从 Ruby 或 jRuby 获取值的ENV位置java.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
4

2 回答 2

3

看看费加罗。这几乎正​​是你所追求的。

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

于 2012-10-04T17:52:31.873 回答
2

正如丹尼尔赖特在上面建议的那样,费加罗很棒!它可以完成我在 Rails 上运行 ruby​​ 所需的一切。我还需要通过 Cloudbees PaaS 服务的 JVM 系统属性对 JRuby on rails 和属性提供相同的支持。我已经分叉了 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上的应用程序的配置方式。因此,如果您使用 配置您的 Rails 应用程序ENV,您已经准备好部署到 Heroku。对于 Cloudbees,您可以使用ENV类似的 JVM 属性FigaroSettings.<property>

它如何与 Cloudbees 配合使用?

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

cloudbees通常,要配置可通过 JVM 系统属性访问的应用程序参数,您可以使用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 任务来做到这一点!赶紧跑:

rake figaro:cloudbees

或者,您可以传入 Cloudbees 应用程序的名称:

rake figaro:cloudbees[my-awesome-app]

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

于 2012-10-10T13:09:28.793 回答