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

Ruby on rails 公共rails应用程序中的敏感数据存储位置?,ruby-on-rails,environment-variables,credentials,api-key,Ruby On Rails,Environment Variables,Credentials,Api Key,我的个人rails项目使用了一些API,我将API密钥/机密作为全局变量存储在config/environments/production.yml和development.yml中。我现在想把这个项目推到github上,让其他人使用,但我不希望他们有这些敏感数据。我也不希望此文件位于.gitignore中,因为它是应用程序运行所必需的。我已经考虑过把它们放在数据库的某个地方,但我希望找到更好的解决方案。它们可能最好放在初始化器(config/initializers/api.yaml)中,尽管我

我的个人rails项目使用了一些API,我将API密钥/机密作为全局变量存储在config/environments/production.yml和development.yml中。我现在想把这个项目推到github上,让其他人使用,但我不希望他们有这些敏感数据。我也不希望此文件位于.gitignore中,因为它是应用程序运行所必需的。我已经考虑过把它们放在数据库的某个地方,但我希望找到更好的解决方案。

它们可能最好放在初始化器(config/initializers/api.yaml)中,尽管我认为你做的很好。将实际密钥添加到.gitignore文件中,然后运行
git rm config/environments/production.yml
从repo中删除该敏感数据。公平警告,它也将删除该文件,所以请先备份它

然后,只需在实际文件旁边创建一个config/environments/production.yml.example文件,其中包含相关细节,但忽略了敏感数据。当你把它拉出来投入生产时,只需复制不带.example的文件,并替换相应的数据。

这个怎么样

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

更新.gitignore以包括production.yml和development.yml

将占位符值替换为机密

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

任何人都可以克隆您的repo,而无需执行任何额外步骤来创建丢失的文件(他们只需像您那样替换占位符值)


这是否符合您的目标?

TLDR:使用环境变量

我认为@Bryce's提供了一个答案,我将把它冲洗掉。一种方法似乎是使用环境变量存储敏感信息(API密钥字符串、数据库密码)。所以,检查一下您的代码,看看哪些代码中有敏感数据。然后创建存储sensivite数据值的环境变量(例如,在.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
只需让Heroku为其创建环境变量:

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

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

使用环境变量。

在Ruby中,它们的可访问性如下:

ENV['S3_SECRET']
原因有二:

  • 这些值不会进入源代码管理
  • “敏感数据”又名密码往往会因环境而异。e、 g.对于开发和生产,您应该使用不同的S3凭据
  • 这是最佳做法吗?
    是的:

    如何在本地使用它们?
    而且都很简单。或者,编辑您的

    如何在生产中使用它们?
    这在很大程度上取决于情况。但对于Rails来说,这是一场轻松的胜利

    平台即服务怎么样?
    任何PaaS都应该为您提供设置它们的方法。例如,Heroku:

    这是否会使为项目设置新开发人员变得更加复杂?

    也许吧,但这是值得的。您始终可以将.env.sample文件签入源代码管理,其中包含一些示例数据。在您的项目自述中添加一个关于它的注释。

    Rails 4.1现在有了一个惯例。你把这些东西藏在秘密里。这样你就不会在你的应用程序中出现一些分散的全局环境调用

    此yaml文件类似于已解析的database.yml erb,因此您仍然可以在此处使用ENV调用。在这种情况下,您可以将其置于版本控制之下,然后将其用作必须使用ENV vars的文档。但您也可以从版本控制中删除它,并将实际的秘密存储在那里。在这种情况下,您可以将一些secrets.yml.default或类似内容放入公共回购协议中,以供记录

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

    在本集开始时详细讨论了这一点

    是的,我听到了,但正如前面所说的,我正试图找到一个解决方案,不涉及从存储库中删除这些文件。出于兴趣,为什么?您是否部署到heroku或其他类似的地方,而这些地方不容易将文件直接复制到服务器上?是的。我希望其他人能够尽可能简单地运行我的代码。配置文件是传统的,不会给需要运行代码的人带来任何障碍。Heroku提供了一些关于如何在他们的环境中设置它们的文档:不是真的,因为当我向那些文件中添加一些确实需要进入其他存储库的内容时会发生什么?如果这种情况不经常发生,只需恢复占位符值,从.gitignore中删除行,将更改提交给GitHub,编辑文件以还原您的机密,编辑.gitignore以再次隐藏您的机密。可能有更聪明的解决方案,但这种方法很简单。这是迄今为止这里提出的最佳解决方案。安全、简单、有效的跨平台、高性能。无法要求更多。@yuvilio我有一个后续问题:如何使所述环境变量可访问带有Apache2/Phusion Passenger的Ubuntu上运行的Ruby on Rails?@YoLudke对于通过Apache直接指向的应用程序,我将使用Apache主机文件中的指令。例如:
    SetEnv S3\u按加密键
    。环境变量也可以通过ENV全局变量ENV['S3_KEY']获得。请注意,当您将Phusion Passenger与Apache2一起使用时,您可以将其Apache配置中的Phusion Passenger引导到在运行ruby之前导出变量的脚本,而不是直接运行ruby,这对我来说非常有效/bin/sh导出示例\u VAR=EXAMPLE\u value exec”/path/to/rvm/.rvm/wrappers/r
    development: 
       s3_secret: 'foo'
    production: 
       s3_secret: <%= ENV['S3_SECRET']%>
    
    Rails.application.secrets.s3_secret