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” 角色以获取完全访问权限。
升级影响¶
将没有升级影响。
依赖项¶
没有对正在进行的其他工作的依赖关系。
测试¶
将添加单元测试以验证非平凡的代码路径。如有必要,可以添加集成测试。
文档影响¶
需要文档来解释 MongoDB 客体上启用了身份验证。可以更新 MongoDB 数据存储文档以反映启用的功能。