如何保护database.yml?


50

在Ruby on Rails应用程序中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。 29 10月. 082008-10-29 21:05:07

  0

任何在文件中存储秘密并将其上传到版本控制的人都应该被打屁股。 06 10月. 162016-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上设置应用程序用户的读取权限? 16 6月. 092009-06-16 20:36:42

+2

我采用了这种方法,因为:a)密码不在database.yml中,因此不提交给源代码控制; b)除了只将密码放在生产服务器上的文件中,没有其他工作需要 - 没有Capistrano任务,没有主结构之外的文件等。 17 6月. 092009-06-17 10:39:33

+1

我觉得database.yml不应该放在版本库中,因为每个开发人员都应该能够定义他们自己的工作环境。 08 10月. 092009-10-08 04:07:07

+1

如果每个开发人员都使用应用程序本地sqlite数据库而不是数据库服务器进行开发,并且如果只有一个规范生产部署(在多个相同配置的服务器上)而不是多个生产部署,那么保留' config/database.yml'在源代码控制中。这是在Rails中完成的默认方式。如果您的设置比这更复杂,那么您可能无法在源代码控制中保留'config/database.yml'。 09 8月. 102010-08-09 20:44:40


10

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

bcdatabase

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

+3

更新:bcdatabase现在位于https://github.com/NUBIC/bcdatabase。 26 9月. 112011-09-26 16:09:51

  0

这看起来像是一个死了的项目。是否有任何替代或备用解决方案被积极维护? 14 10月. 162016-10-14 16:23:04

  0

@Streamline - 最后一次提交是2014年,那不是很久以前。 15 10月. 162016-10-15 12:15:54