在公共rails应用程序中存储敏感数据的位置?

时间:2011-05-24 15:40:30

标签: ruby-on-rails environment-variables credentials api-key

我的个人rails项目使用了一些API,我将API密钥/秘密存储在config / environments / production.yml和development.yml中作为全局变量。我现在想把这个项目推到github供其他人使用,但我不希望他们拥有那些敏感数据。我也不想在.gitignore中使用此文件,因为应用程序需要运行该文件。我曾考虑将它们放在DB的某个地方,但我希望能找到更好的解决方案。

5 个答案:

答案 0 :(得分:49)

TLDR :使用环境变量!

我认为@ Bryce的comment提供了一个答案,我只是将其清除。似乎一种方法Heroku recommends是使用环境变量来存储敏感信息(API密钥字符串,数据库密码)。因此,请调查您的代码,看看您有敏感数据。然后创建存储敏感数据值的环境变量(例如,在.bashrc文件中)。例如,对于您的数据库:

export MYAPP_DEV_DB_DATABASE=myapp_dev
export MYAPP_DEV_DB_USER=username
export MYAPP_DEV_DB_PW=secret

现在,在本地框中,只需在需要敏感数据时引用环境变量即可。例如,在database.yml:

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: <%= ENV["MYAPP_DEV_DB_DATABASE"] %>
  pool: 5
  username: <%= ENV["MYAPP_DEV_DB_USER"] %>
  password: <%= ENV["MYAPP_DEV_DB_PW"] %>
  socket: /var/run/mysqld/mysqld.sock

我认为database.yml只是在应用程序的初始化或重新启动时进行解析,所以这不应该影响性能。因此,这将解决您的本地开发和公共存储库的问题。剥离敏感数据,您现在可以像私下一样为公众使用相同的存储库。如果您使用的是VPS,它也可以解决问题。只需ssh到它并在生产主机上设置环境变量,就像在开发框中一样。

与此同时,如果您的生产设置涉及一个不需要部署的生产服务器,就像Heroku那样,您需要了解如何远程设置环境变量。对于Heroku,这是使用heroku config:add完成的。因此,根据同一篇文章,如果您将S3集成到您的应用中,并且您从环境变量中获得了敏感数据:

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

让Heroku为它创建环境变量:

heroku config:add S3_KEY=8N022N81 S3_SECRET=9s83159d3+583493190

这个解决方案的另一个优点是它的语言中立,而不仅仅是Rails。适用于任何应用程序,因为它们都可以获取环境变量。

答案 1 :(得分:3)

这个怎么样......

  

创建一个新项目,并使用占位符值在production.yml和development.yml文件中将其检入GitHub。

     

更新.gitignore以包含production.yml和development.yml。

     

将占位符值替换为您的秘密。

现在,您可以将代码检入GitHub,而不会泄露您的秘密。

任何人都可以克隆您的仓库而无需任何额外步骤来创建丢失的文件(它们只会像您一样替换占位符值)。

这符合你的目标吗?

答案 2 :(得分:1)

他们可能最好放入初始化器(config / initializers / api.yaml),虽然我认为你已经煮熟的东西很好。将实际密钥添加到.gitignore文件并运行git rm config/environments/production.yml以从您的仓库中删除该敏感数据。公平的警告,它会删除该文件,所以首先备份它。

然后,只需在实际文件旁边创建一个config / environments / production.yml.example文件,其中包含相关详细信息,但遗漏了敏感数据。当您将其拉出到生产环境时,只需复制没有.example的文件并替换相应的数据。

答案 3 :(得分:1)

使用环境变量。

在Ruby中,他们可以这样访问:

ENV['S3_SECRET']

有两个原因:

  1. 这些值不会进入源代码管理。
  2. &#34;敏感数据&#34;无论如何,密码往往会在每个环境的基础上改变。例如您应该使用不同的S3凭证进行开发与生产。
  3. 这是最佳做法吗?
    是的:http://12factor.net/config

    如何在本地使用它们?
    foremandotenv都很简单。或者,修改shell

    如何在制作中使用它们?
    很大程度上,这取决于。但是对于Rails来说,dotenv是一个轻松的胜利。

    平台即服务怎么样?
    任何PaaS都应该为您提供设置它们的方法。例如Heroku:https://devcenter.heroku.com/articles/config-vars

    这不会使为项目设置新的开发人员变得更复杂吗?
    或许,但这是值得的。您始终可以将.env.sample文件检入源控件,并在其中包含一些示例数据。在项目的自述文件中添加一个关于它的说明。

答案 4 :(得分:1)

Rails 4.1现在已经有了它的约定。你将这些东西存放在secrets.yml中。因此,您最终不会在您的应用程序中分散一些全局ENV调用。

这个yaml文件就像解析了database.yml erb一样,所以你仍然可以在这里使用ENV调用。在这种情况下,您可以将其置于版本控制之下,然后它将作为必须使用ENV vars的文档。但是你也可以从版本控制中驱逐它并在那里存储实际的秘密。在这种情况下,您可以将一些secretts.yml.default等放入公共仓库进行记录。

development: 
   s3_secret: 'foo'
production: 
   s3_secret: <%= ENV['S3_SECRET']%>

你可以在

下访问这些内容
Rails.application.secrets.s3_secret

this剧集

的开头详细讨论
相关问题