你如何保护database.yml?

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

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

  • 这足以locking它吗? 如果不是的话,你还做什么?
  • 有人正在encryption他们的database.yml文件?

您还需要确保您的SSH系统安全,防止人们 Capistrano机器人身份login。 我build议限制访问密码保护密钥对。

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

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

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

作品一种享受。

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

bcdatabase

bcdatabase是一个为Ruby on Rails应用程序提供数据库configuration参数pipe理的库和实用程序。 它提供了一个简单的机制来将数据库configuration属性从应用程序源代码中分离出来,这样就没有检查密码到版本控制系统的诱惑。 它集中了单个服务器的参数,使其可以轻松地在多个应用程序之间共享,并由一名pipe理员轻松更新。

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

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

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

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