2008-08-20 65 views
50

在Ruby on Rails应用程序中database.yml是存储数据库凭证的纯文本文件。如何保护database.yml?

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

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

回答

12

你还需要确保你的SSH系统十分安全,防止有人伐木您Capistrano的机器人。我建议限制访问密码保护密钥对。

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

1

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

另外,有些版本控制(例如svn,例如),即使删除它,它仍然存在于历史中。所以,即使您在过去某个时候删除了它,但更改密码仍然是一个好主意。

+0

我从来没有在我的源代码控制库中存储database.yml。 – 2008-10-29 21:05:07

+0

任何在文件中存储秘密并将其上传到版本控制的人都应该被打屁股。 – 2016-10-06 00:14:33

3

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

另一种看待这个问题的方法是:Web应用程序是否必须访问数据库。如果真的降低权限。给应用程序提供足够的权限。这样攻击者只能做web应用程序能够做的事情。

38

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

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

作品一个款待。

+2

如何改进直接在database.yml上设置应用程序用户的读取权限? – 2009-06-16 20:36:42

10

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

bcdatabase

bcdatabase是一个库和效用 ,其上的Rails 应用程序提供数据库配置 参数管理为Ruby。它提供了一个简单的 机制,用于分离数据库 配置属性 应用程序源代码,以便 没有诱惑将 密码复制到版本控制系统 中。它集中了单个服务器的 参数,因此它们可以轻松地在多个应用程序之间共享 ,并且易于由单个管理员更新 。