MongoDB 认证机制详解
MongoDB 认证机制是保障数据库安全的重要环节,无论是初学者还是经验丰富的开发者,本文都将带你深入了解如何保护你的 MongoDB 数据库。从认证机制的理解到实现基于角色的访问控制(RBAC),本文将为你提供全面的指导。
一、认证与授权
认证与授权都是数据安全的重要组成部分,它们允许自动数据系统的安全性防护。认证过程验证用户的身份以授予系统访问权限,而授权过程则验证用户的权限以访问资源。认证发生在授权之前,而授权则在认证之后发生。
二、认证
1、配置 MongoDB 认证
在 MongoDB 中,我们需要先创建一个管理员用户,该用户可以管理其他用户及其角色,然后再启用认证。
创建管理员用户
-
使用 Robo 3T 创建管理员用户
查看以下截图,了解如何使用 Robo 3T 创建管理员用户。
-
使用 MongoDB Shell 创建管理员用户
test> use admin
admin> db.createUser(
{
user: "myUserAdmin", // 用户名
pwd: "abc123", // 密码
roles: [ // 角色
{ role: "userAdminAnyDatabase", db: "admin" }
]
}
)
启用认证
创建完管理员用户后,需要启用认证。为此,需要更新位于 C:\Program Files\MongoDB\Server\\bin
的 mongod.cfg
文件。
Security:
Authorization: enabled
重启 MongoDB 服务。打开服务应用程序(Win + R > services.msc)。找到 MongoDB 服务并重启。
未认证尝试
现在尝试在没有认证的情况下执行命令,会抛出 MongoServerError
错误:“command find requires authentication”。
认证用户
-
使用 Robo 3T 进行认证
使用 Robo 3T 可以在连接时设置认证信息,如下图所示。
-
使用 MongoDB Shell 进行认证
使用以下连接字符串认证用户。
mongodb://admin:admin@321@localhost:27017/
三、授权
授权是指对已认证的用户进行权限分配。MongoDB 中有多种角色,以下是部分角色的介绍。
1、read:提供对所有非系统集合和 system.js 集合的读取权限。
2、readWrite:提供 read 角色的所有权限,加上修改所有非系统集合和 system.js 集合的能力。
3、dbAdmin:提供执行诸如模式相关任务、索引和收集统计信息等管理任务的能力。此角色不授予用户和角色管理权限。
4、dbOwner:数据库所有者可以执行数据库上的任何管理操作。此角色结合了 readWrite、dbAdmin 和 userAdmin 角色的授权。
5、userAdmin:提供在当前数据库上创建和修改角色和用户的能力。由于 userAdmin 角色允许用户授予任何权限给任何用户,包括他们自己,因此该角色还间接提供了超级用户访问权限,无论是针对数据库还是,如果作用域为 admin 数据库,则针对整个集群。
6、readAnyDatabase:提供除 local 和 config 之外的所有数据库的只读权限。该角色还提供在集群级别上的 listDatabases 操作。
7、readWriteAnyDatabase:提供除 local 和 config 之外的所有数据库上的 readWrite 角色相同的权限。
8、userAdminAnyDatabase:提供除 local 和 config 之外的所有数据库上的 userAdmin 角色相同的访问权限。
9、dbAdminAnyDatabase:提供除 local 和 config 之外的所有数据库上的 dbAdmin 角色相同的权限。该角色还在集群级别上提供 listDatabases 操作。
10、超级用户角色:以下角色提供了在任何数据库上为任何用户分配任何权限的能力,这意味着具有其中一个角色的用户可以在任何数据库上为自己分配任何权限。
-
当作用域为 admin 数据库时的 dbOwner 角色 -
当作用域为 admin 数据库时的 userAdmin 角色 -
userAdminAnyDatabase 角色
实例
让我们通过创建用户并赋予角色的方式来看一个例子。
创建具有读取权限的用户
使用 Robo 3T 创建一个仅具有读取权限的用户。
使用 Robo 3T 连接用户并尝试访问/读取任何数据库中的集合
尝试写入/插入相同集合
db.products.insert( { Name : "Product_1", ProductType: "Simple products", Description:"Product sample description", ProductValidityPeriod:"1 Year" } )
创建具有读写权限的用户
db.createUser(
{
user: "ManagementUser", // 用户名
pwd: "12345678", // 密码
roles: [ // 角色
{ role: "readWrite", db: "ECommerceDB" }
]
}
)
使用新创建的用户登录
使用以下连接字符串登录。
读取集合中的数据
写入集合中的数据
四、总结
可以在启用访问控制之前或之后创建用户。如果在建立任何用户之前激活了访问控制,MongoDB 支持 localhost 例外,这允许你在 admin 数据库中建立用户管理员。一旦创建了用户,就必须作为用户管理员登录以根据需要添加其他用户。