MongoDB 用户管理

https://blueprints.launchpad.net/trove/+spec/mongodb-users

启用 MongoDB 用户管理功能。

问题描述

MongoDB 客体代理不支持用户管理功能。允许用户创建、列出和删除用户,启用/检查 root 访问权限,以及通过 API 授予/撤销用户访问权限至关重要。

MongoDB 用户是每个数据库独有的。用户由其名称和数据库共同标识。因此,需要用户名值的 Trove 操作需要使用以下字符串格式:“<数据库>.<用户名>”。MongoDB 不允许在数据库名称中使用以下字符:/. “$

提议的变更

对 MongoDB 的调用将通过 Python 使用 PyMongo 库进行,该库需要在客体上预先安装。

特性

将为 MongoDB 数据存储启用多个 Trove 命令。此外,MongoDB 的身份验证协议将默认启用,从而使数据库安全。

功能

多个标准 Trove 命令将为 MongoDB 启用。以下是所有允许参数对应的 CLI 命令

user-create <instance> <database>.<name> <password>
user-list <instance>
user-delete <instance> <database>.<name>
user-show <instance> <database>.<name>
root-enable <instance>
root-show <instance>
user-grant-access <instance> <database>.<name> <access_databases>
user-revoke-access <instance> <database>.<name> <access_database>
user-show-access <instance> <database>.<name>

代码更改将实现一个新的类 service.MongoAdmin 及其作为类成员的相应方法。manager.Manager 的方法将被更新为调用 admin 函数。

安全性

当前 MongoDB 数据存储会创建一个不安全的数据库。为了使上述功能有用,客体代理的 MongoDB 服务器将被设为安全。这将通过启用身份验证并在服务器上默认创建 Trove 用户 ‘os_admin’ 来完成。Trove 用户将具有用户和数据库管理员权限,但没有读/写权限。当客体首次启动时,客体代理将生成密码并连接(由于 localhost 异常)到服务器。然后它将运行以下操作(以下是 Mongo shell 代码,但它将使用 PyMongo 实现)

use admin
db.createUser(
    {
        user: "os_admin",
        pwd: "<generated_password>",
        roles: [
            { role: "userAdminAnyDatabase", db: "admin" },
            { role: "dbAdminAnyDatabase", db: "admin" },
            { role: "cluserAdmin", db: "admin" }
        ]
    }
)

身份验证将默认启用。要禁用它,可以使用具有选项 {‘auth’: ‘false’} 的配置组。

注意:在 MongoDB 上启用身份验证会影响集群,因为分片需要使用共享密钥文件才能相互连接。因此,在创建集群期间将生成一个新的加密安全密钥,供分片使用。该密钥值将被推送到每个分片,并在那里存储以供连接使用。密钥不会存储在控制器上。当添加新分片时,控制器将要求现有的集群客体提供密钥。

配置

mongodb 配置文件将具有 ‘auth’ 设置为 ‘on’,以在服务器上启用身份验证。

将在 ~/.mongorc.js 创建一个新的 MongoDB RC 脚本。该文件将存储用户名和生成的密码,允许本地 MongoDB 客户端使用这些凭据自动连接。

数据库

这里不会添加新的项目。

公共 API

没有 API 更改。

公共 API 安全

没有 API 安全性更改。

Python API

无 (合并后添加的空部分)

CLI (python-troveclient)

无 (合并后添加的空部分)

内部 API

没有内部 API 更改。

Guest Agent

修改的文件

trove/guestagent/db/models.py - add a MongoDBUser class.
trove/guestagent/datastore/experimental/mongodb/manager.py - enable functions.
trove/guestagent/datastore/experimental/mongodb/service.py - add functions.
trove/guestagent/datastore/experimental/mongodb/system.py - store system constants.

客体代理将被更改为支持以下管理器函数

  • 创建用户 - 使用 ‘createUser()’

  • 列出用户 - 查询 admin 数据库的 system.users 集合

  • 删除用户 - 使用 ‘dropUser()’

  • 显示用户 - 使用 ‘getUser()’

  • 启用 root - 创建用户 “root” 并授予 “root” 角色

  • 检查是否启用 root - 检查用户 “root” 是否存在

  • 授予用户对数据库的访问权限 - 使用 ‘updateUser()’

  • 撤销用户对数据库的访问权限 - 使用 ‘updateUser()’

  • 显示用户对数据库的访问权限 - 使用 ‘getUser()’

备选方案

授予 os_admin “root” 角色以获取完全访问权限。

实现

负责人

Matthew Van Dijk

里程碑

liberty-1

工作项

工作将被分为四个交付成果

  1. 在服务器上启用身份验证

  2. 创建/列出/显示/删除用户

  3. 启用/检查 root

  4. 授予/显示/撤销访问权限

升级影响

将没有升级影响。

依赖项

没有对正在进行的其他工作的依赖关系。

测试

将添加单元测试以验证非平凡的代码路径。如有必要,可以添加集成测试。

文档影响

需要文档来解释 MongoDB 客体上启用了身份验证。可以更新 MongoDB 数据存储文档以反映启用的功能。

参考资料

MongoDB 手册