10

我目前正在使用 MongoDB 来记录应用程序日志,虽然我对性能和能够将任意结构化数据转储到日志记录中都非常满意,但我对存储后的日志记录的可变性感到困扰。

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

但是,我一直无法找到一种方法来限制对 MongoDB 数据库或集合的操作超出MongoDB wiki 上的安全主题中记录的三种访问级别(无访问、只读、“上帝模式”) 。

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

4

3 回答 3

10

我想说最好的选择是将对 MongoDB 的访问封装在一个服务层中,该服务层执行您的特定合同。我们在细粒度的访问控制方面做的不多,因为有很多不同的情况,要正确解决所有这些情况是很棘手的。因此,在大多数情况下,实现这些控件是由应用程序层决定的。

于 2010-03-08T21:53:58.047 回答
3

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

假设您希望有一个用户只能写入(仅插入)到某个数据库上的某个集合。

创建一个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的用户,并且该用户对数据库的yourdb集合col1具有只写访问权限。

这样做的副作用是创建了角色rolename。如果您的现有用户应该对同一集合具有只写访问权限,请将角色rolename授予该现有用户。

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

于 2016-02-11T06:46:18.630 回答
0

在 MongoDB 1.3.2+ 中,您可以在 user 中添加一些限制:

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

但它只是现在存在并没有更好。也许您可以添加一些功能请求

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

于 2010-03-08T21:03:31.383 回答