1. 简介
MongoDB是一款非关系型数据库,使用面向文档的数据模型来存储数据。MongoDB提供了对用户权限管理的支持,对于需要对MongoDB数据库和集合进行管控的应用来说,这一点非常重要。
用户权限管理的目的是确保只有经过授权的用户可以访问数据库。MongoDB提供的权限管理功能可以通过内部身份验证系统或外部身份验证系统(LDAP、ActiveDirectory等)进行管理。本文主要介绍如何使用MongoDB进行内部身份验证。
2. 用户权限
2.1. 角色
MongoDB用户权限控制是通过“角色”来实现的。角色是一组对数据库或集合拥有特定权限的权限集合。例如,管理员可以具有所有数据库和集合的读/写权限,但开发人员只能访问开发团队的集合。
MongoDB预定义了很多内置角色,并将这些角色组织成多个角色组。用户可以向角色组分配角色,也可以向用户直接分配角色。所有集合和数据库的权限由系统角色控制。
2.2. 用户
用户是MongoDB中的身份标识,对于MongoDB来说,一个用户就是一个可以使用数据库的实体。每个用户包含一个用户名和相应的密码,这些是必须的,否则用户将无法访问数据库。
当管理员创建用户时,必须将用户与至少一个角色相关联。这些角色将指定用户可以执行的操作。
3. 设置用户权限
3.1 创建管理员
在开始使用MongoDB用户权限时,您需要创建一个管理员用户。
首先,需要打开MongoDB的控制台:
mongo
使用以下命令创建管理员用户:
use admin
db.createUser({
user: "admin",
pwd: "admin_password",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
这将创建一个名为“admin”的用户,使用“admin_password”作为密码,该用户将具有“userAdminAnyDatabase”角色。此角色允许用户创建和管理任何数据库上的所有账户。
3.2 创建其他用户
要创建其他用户,请使用以下代码:
use database_name
db.createUser({
user: "username",
pwd: "password",
roles: [
{ role: "readWrite", db: "database_name" },
{ role: "read", db: "other_database_name" }
]
})
这将在特定数据库“database_name”中创建一个名为“username”的用户,该用户的密码为“password”,并指派以下角色:
readWrite:允许用户读取和写入“database_name”中的所有集合。
read:允许用户读取“other_database_name”中的所有集合。
用户将无法访问未授权的数据库,也无法进行未授权的操作。
3.3 删除用户
要删除用户,请使用以下命令:
db.dropUser("username")
请记住,只有拥有“userAdminAnyDatabase”角色的用户才能删除其他用户。
3.4 列出用户
要列出已创建的所有用户,请使用以下命令:
show users
请注意,必须使用特定的数据库才能列出该数据库的用户。
4. 验证用户身份
MongoDB将创建的每个用户的信息存储在数据库的“system.users”集合中。用户成功登录后,系统会查找该用户的角色,并查看该角色是否允许用户使用所请求的资源。
要验证用户,请使用以下命令:
mongo --username username --password password --authenticationDatabase database_name
其中,username和password是您创建的用户的凭证,database_name是需要进行身份验证的数据库名称。
5. 建议
在将MongoDB用于生产环境之前,应启用安全功能。建议您的MongoDB部署使用SSL/TLS进行加密通信,并使用固定的端口。
还应创建一个只有必要“最小权限”用户的安全策略。应该使用最少的特权来限制安全漏洞的影响。
6. 总结
MongoDB的用户权限功能可以确保只有经过授权的用户才可以访问数据库。用户角色是MongoDB权限管理的核心,可定义用户的操作权限。必须先创建管理员用户,然后才能创建其他用户,并将它们与角色关联和分配。
验证用户身份是确保安全访问数据库的重要一环,在正式启用生产环境前,请务必启用MongoDB的安全功能。