你如何保护database.yml?

时间:2008-08-20 16:12:47

标签: ruby-on-rails security deployment

在Ruby on Rails应用程序中,database.yml是一个存储数据库凭据的纯文本文件。

当我部署我的Rails应用程序时,我在Capistrano中有一个After deploy回调 在应用程序的/ config目录中为database.yml文件创建符号链接的配方。文件本身存储在标准Capistrano / releases目录结构之外的单独目录中。我chmod 400该文件所以它只能由创建它的用户读取。

  • 这足以将其锁定吗?如果没有,你还做了什么?
  • 有人在加密他们的database.yml文件吗?

6 个答案:

答案 0 :(得分:39)

我解决这个问题的方法是将数据库密码放在一个文件中,该文件只对我运行应用程序的用户具有读取权限。然后,在database.yml中,我使用ERB来读取文件:

production:
  adapter: mysql
  database: my_db
  username: db_user
  password: <%= begin IO.read("/home/my_deploy_user/.db") rescue "" end %>

努力享受。

答案 1 :(得分:12)

您还需要确保您的SSH系统安全可靠,以防止人们以 登录您的Capistrano僵尸程序。我建议限制访问受密码保护的密钥对。

加密服务器上的.yml文件是没用的,因为你必须给机器人一个密钥,它将被存储。 。 。在同一台服务器上。在您的机器上加密它可能是一个好主意。 Capistrano可以在发送之前对其进行解密。

答案 2 :(得分:10)

看看这个github解决方案:https://github.com/NUBIC/bcdatabase。 bcdatabase提供加密存储,其中密码可以与yaml文件分开。

  

bcdatabase

     

bcdatabase是一个库和实用程序   它提供数据库配置   Ruby on Rails的参数管理   应用。它提供了一个简单的   分离数据库的机制   配置属性来自   应用程序源代码这样   没有诱惑可以检查   密码进入版本控制   系统。它集中了   单个服务器的参数,以便   它们之间可以轻松共享   多个应用程序,轻松   由一位管理员更新。

答案 3 :(得分:3)

即使您保护了database.yml文件,如果人们可以更改应用程序的代码,人们仍然可以使用相同的凭据进行编写。

另一种看待这种情况的方法是:Web应用程序是否必须访问数据库。如果为true则降低权限。为应用程序提供足够的权限。这样攻击者只能执行Web应用程序能够执行的操作。

答案 4 :(得分:1)

如果您非常关心yml文件的安全性,我不得不问:它是否存储在您的版本控制中?如果是这样,那是攻击者可以获得的另一个点。如果你正在通过非SSL进行结账/签到,有人可以拦截它。

此外,对于某些版本控制(例如svn),即使您将其删除,它仍然存在于历史记录中。因此,即使您在过去的某个时候删除它,更改密码仍然是个好主意。

答案 5 :(得分:1)

迟到总比没有好,我要发布我的答案,因为问题仍然很重要。对于Rails 5.2+,可以使用加密的文件certificate.yml.enc保护任何敏感信息。

Rails将机密存储在config/credentials.yml.enc中,该机密已加密,因此无法直接编辑。我们可以通过运行以下命令来编辑凭据:

$ EDITOR=nano rails credentials:edit

secret_key_base: 3b7cd727ee24e8444053437c36cc66c3
production_dbpwd: my-secret-password

现在,可以使用Rails.application.credentials访问这些机密了。

因此您的database.yml将如下所示:

production:
  adapter: mysql
  database: my_db
  username: db_user
  password: <%= Rails.application.credentials.production_dbpwd %>

您可以了解有关此here

的更多信息