数据库安全 —— 身份验证之用户
目录:
- 用户管理接口
- 身份验证数据库
- 验证一个用户
- 集中用户数据
- 分片集群用户
- 本地主机异常
在MongoDB中,要验证MongoDB中的客户端,必须向MongoDB中添加相应地用户。
用户管理接口
MongoDB提供了db.createUser()
方法来添加用户。添加用户时可以为用户分配角色来授予权限。
注: 在数据库中创建的第一个用户应该是具有管理其他用户权限的用户管理员。
您还可以更新现有用户,例如更改密码和授予或撤消角色。有关用户管理方法的完整列表,请参见用户管理。
用户由用户名和相关的身份验证数据库唯一标识。从MongoDB 4.0.9开始,MongoDB管理的用户被分配一个唯一的userId
。[1]
另见:添加用户
身份验证数据库
添加用户时,将在特定数据库中创建用户。此数据库是用户的身份验证数据库。
用户可以跨不同的数据库拥有权限;也就是说,用户的权限不限于其身份验证数据库。通过分配给其他数据库中的用户角色,在一个数据库中创建的用户可以对其他数据库具有操作权限。有关角色的详细信息,请参见基于角色的访问控制(RBAC)。
用户名和身份验证数据库用作该用户的唯一标识符。[1] 也就是说,如果两个用户具有相同的名称,但在不同的数据库中创建,则它们是两个独立的用户。如果要让单个用户对多个数据库具有权限,请在适用的数据库中创建具有角色的单个用户,而不是在不同的数据库中多次创建该用户。
验证一个用户
要作为用户进行身份验证,必须提供用户名、密码和与该用户关联的身份验证数据库。
要使用mongo shell进行身份验证,请执行以下任一操作:
- 连接到mongod或mongos实例时,使用mongo命令行身份验证选项(
--username
、--password
和--authenticationDatabase
) - 首先连接到mongod或mongos实例,然后对身份验证数据库运行
authenticate
命令或db.auth()
方法
重要:
作为不同的用户进行多次身份验证不会删除先前已验证用户的凭据。这可能会导致连接具有超出用户预期的权限,并导致逻辑会话中的操作引发错误。
有关使用MongoDB驱动程序进行身份验证的示例,请参阅驱动程序文档。
集中用户数据
对于在MongoDB中创建的用户,MongoDB将所有用户信息(包括名称、密码和用户的身份验证数据库)存储在admin
数据库的system.users
集合中。
不要直接访问此集合,而是使用用户管理命令。
分片集群用户
要为分片集群创建用户,请连接到mongos实例并添加用户。然后,客户端通过mongos实例对这些用户进行身份验证。在分片集群中,MongoDB将用户配置数据存储在配置服务器的admin
数据库中。
分片本地用户
但是,某些维护操作(如cleanupornined
、compact
、rs.reconfig()
)需要直接连接到碎片集群(shards)中的特定碎片。要执行这些操作,必须直接连接到shard并作为shard本地管理用户进行身份验证。
要创建shard本地管理用户,请直接连接到shard并创建用户。MongoDB将shard本地用户存储在shard本身的admin
数据库中。
这些shard本地用户完全独立于通过mongos添加到shard集群的用户。Shard本地用户是Shard的本地用户,mongos无法访问。
直接连接到shard应该只用于特定于shard的维护和配置。一般来说,客户端应该通过mongos连接到分片集群。
本地主机异常
localhost异常允许您启用访问控制,然后在系统中创建第一个用户。对于localhost异常,启用访问控制后,连接到localhost接口并在管理数据库中创建第一个用户。第一个用户必须具有创建其他用户的权限,例如具有userAdmin
或userAdminAnyDatabase
角色的用户。使用localhost异常的连接只能在管理数据库上创建第一个用户。
在版本3.4中的更改: MongoDB 3.4扩展了localhost异常以允许执行db.createRole()
方法。此方法允许通过LDAP授权的用户在MongoDB内部创建映射到LDAP中定义的角色的角色。有关详细信息,请参阅LDAP授权。
只有在MongoDB实例中没有创建用户时,才会应用本地主机异常。
在分片集群的情况下,localhost异常分别应用于每个分片,也应用于整个集群。创建分片集群并通过mongos实例添加用户管理员后,仍然必须防止未经授权访问各个分片。对集群中的每个碎片执行以下步骤之一:
- 创建管理员账户
- 启动禁用本地主机异常。要禁用本地主机异常,请将
enableLocalhostAuthBypass
参数设为0