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

tyb*_*103 39 ruby-on-rails credentials environment-variables api-key

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

yuv*_*lio 49

TLDR:使用环境变量!

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

export MYAPP_DEV_DB_DATABASE=myapp_dev
export MYAPP_DEV_DB_USER=username
export MYAPP_DEV_DB_PW=secret
Run Code Online (Sandbox Code Playgroud)

现在,在本地框中,只需在需要敏感数据时引用环境变量即可.例如在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
Run Code Online (Sandbox Code Playgroud)

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

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

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

让Heroku为它创建环境变量:

heroku config:add S3_KEY=8N022N81 S3_SECRET=9s83159d3+583493190
Run Code Online (Sandbox Code Playgroud)

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

  • @yuvilio我有一个后续问题:如何使用Apache2/Phusion Passenger在Ubuntu上运行的Ruby on Rails上访问环境变量? (2认同)