2010-03-08 102 views
9

我目前使用MongoDB来记录应用程序日志,虽然我对性能以及能够将任意结构化数据转储到日志记录中感到满意,但我很困扰日志记录一旦存储就可变。MongoDB中的只写集合

在传统的数据库中,我会为我的日志表构建授权,这样应用程序用户具有INSERT和SELECT权限,但不具有UPDATE或DELETE权限。同样,在CouchDB中,我可以编写一个更新验证器函数,拒绝所有修改现有文档的尝试。

但是,我一直无法找到一种方法来限制在MongoDB wiki上的security topic中记录的三个访问级别(无法访问,只读,“神模式”)之外的MongoDB数据库或集合上的操作。

是否有其他人将MongoDB作为文档存储部署在文档的不变性(或至少更改跟踪)需求的设置中?您使用了哪些技巧或技巧来确保写得不好或恶意的应用程序代码无法修改或销毁现有的日志记录?我是否需要将我的MongoDB日志记录包装在强制执行只写策略的服务层中,还是可以使用某些配置,查询黑客行为和复制的组合来确保维护一致的可审计记录?

+0

由于似乎没有一个预置的方式,我实际上实现了一个位于MongoDB前面的简单TCP代理,并通过检查操作码来过滤发送到服务器的消息: http:// gist.github.com/328486 – rcoder 2010-03-11 01:23:38

+0

感谢您发表主旨。您的代理设置非常酷,可以用于我可能正在处理的几乎相同的事务(审计跟踪)的企业类型项目。 – 2011-08-26 13:46:05

+0

我一直在寻找这个完全相同的东西。恕我直言,这是MongoDB目前最大的失败。 – 2012-09-22 16:09:55

回答

8

我要说最好的选择将是包裹在强制执行特定合同的服务层的访问MongoDB的。我们在细粒度的访问控制方面做得并不多,因为有很多不同的情况,正确地解决所有这些问题是非常棘手的。所以大部分是由应用层来实现这些控件。

+0

这就是我所怀疑的。我现在通过在应用程序代码中的任何位置不暴露原始连接到数据库来有效地实施只读访问。这并不能完全保护我们免于用户错误或恶意更新,但是我们将制定出另一种持久审计日志解决方案。 – rcoder 2010-03-09 17:39:19

0

在MongoDB中1.3.2+您可以在用户添加一些限制:

db.addUser("guest", "passwordForGuest", true)

但它只是现在已有不是更好。也许你可以添加一些功能要求

看到MongoDB的文档中的信息:http://www.mongodb.org/display/DOCS/Security+and+Authentication

+1

正如我在我的问题中提到的,我不想添加只读用户;相反,我想添加一个只能*写*记录的用户,而不能在事后修改或删除它们。 – rcoder 2010-03-08 21:11:48

1

要添加一个只写(在集合级别)用户到MongoDB执行以下操作。

说你想有只能在某些数据库上写(仅insert)到特定集合用户。

与以下内容创建一个文件createuser.js

function createCollectionWriter(database, username, password, rolename, collection) 
{ 
    db.getSiblingDB(database).createUser({ 
     user : username, 
     pwd : password, 
     roles : [ ] 
    }); 

    db.getSiblingDB(database).createRole({ 
     role : rolename, 
     privileges : [ 
     { 
      resource : { db : database, "collection" : collection }, 
      actions : [ "insert" ] 
     } 
     ], 
     roles : [] 
    }); 

    db.getSiblingDB(database).grantRolesToUser(username, [ rolename ]); 
} 

而且从命令行执行此

$ mongo --eval="load('createuser.js'); createCollectionWriter('yourdb', 'user1', 'pass1', 'rolename', 'col1')"

这将创建用户名的用户USER1与密码PASS1和此用户有只写访问数据库ase's yourdb collection col1

这样做的副作用是创建角色角色名称。如果您的现有用户应该只能访问同一个集合,请将角色角色名称授予该现有用户。

随意使用和修改上面提供的代码:)。