50

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

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

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

6 回答 6

39

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

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

工作一种享受。

于 2009-06-16T13:29:02.210 回答
12

您还需要确保您的 SSH 系统得到很好的保护,以防止人们以Capistrano 机器人的身份登录。我建议限制对受密码保护的密钥对的访问。

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

于 2008-08-20T16:41:15.220 回答
10

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

数据库

bcdatabase 是一个库和实用程序,它为 Ruby on Rails 应用程序提供数据库配置参数管理。它提供了一种简单的机制,用于将数据库配置属性与应用程序源代码分开,这样就不会试图将密码检查到版本控制系统中。它集中了单个服务器的参数,以便它们可以在多个应用程序之间轻松共享,并由单个管理员轻松更新。

于 2010-08-09T20:38:11.450 回答
3

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

另一种看待这个问题的方式是:Web 应用程序是否需要大量访问数据库。如果为 true,则降低权限。给应用程序足够的权限。这样,攻击者只能做 Web 应用程序能够做的事情。

于 2009-05-25T18:09:09.747 回答
3

迟到总比没有好,我发布我的答案,因为问题仍然相关。对于 Rails 5.2+,可以使用加密文件 credentials.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 %>

您可以在此处阅读有关此内容的更多信息

于 2020-07-16T15:40:47.643 回答
1

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

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

于 2008-10-29T16:26:42.283 回答