[mongo] [security] 9.3.1 用户(users)
要在MongoDB中对客户端进行身份验证,必须将相应的用户添加到MongoDB中。
用户管理界面
要添加用户,MongoDB提供了db.createUser() 命令。添加用户时,您可以为用户分配角色以授予权限。
注意
在数据库中创建的第一个用户应该是具有管理其他用户权限的用户管理员。请参阅 启用访问控制。
您还可以更新现有用户,例如更改密码以及授予或回收角色。有关用户管理方法的完整列表,请参阅《 用户管理》。
用户由用户名和关联的身份验证数据库唯一标识。从MongoDB 4.0.9开始,为MongoDB管理的用户分配了一个唯一 userId。[1]
扩展
数据库验证
添加用户时,可以在特定数据库中创建用户。该数据库是用户身份验证的数据库。
用户可以在不同的数据库中拥有权限;也就是说,用户的权限不限于其身份验证数据库。通过分配其他数据库中的用户角色,在一个数据库中创建的用户可以具有跨数据库执行操作的权限。有关角色的更多信息,请参见基于角色的访问控制。
用户名和身份验证数据库用作该用户的唯一标识符。[1]即,如果两个用户具有相同的名称,但在不同的数据库中创建,则它们是两个单独的用户。如果打算让一个用户在多个数据库上具有权限,请在适用的数据库中创建一个具有角色的单个用户,而不是在不同的数据库中多次创建该用户。
[1] | (1,2) 从4.0.9版开始,MongoDB userId 在MongoDB中创建用户时将其与唯一身份相关联 。 在LDAP服务器上创建的LDAP管理用户在system.users集合中没有关联的文档,因此没有 userId 与之关联的字段。 |
用户验证
要以用户身份进行身份验证,必须提供用户名,密码以及 与该用户关联的身份验证数据库。
要使用mongo shell 进行身份验证,请执行以下任一操作:
-
连接到mongod或mongos实例时,请使用mongo命令行身份验证选项(--username、--password和--authenticationDatabase),或者
-
首先连接到mongod或mongos实例,然后运行authenticate命令或db.auth() 针对身份验证数据库的方法。
重要
多次作为不同的用户进行身份验证不会删除以前经过身份验证的用户的凭据。这可能导致连接的权限超过用户的预期权限,并导致逻辑会话中的操作引发错误。
有关使用MongoDB驱动程序进行身份验证的示例,请参阅 驱动程序文档。
集中用户数据
对于在MongoDB中创建的用户,mongodb在admin数据库的system.users集合中存储了所有的用户信息,包括名称,密码和授权数据库。
不要直接访问此集合,而要使用用户管理命令。
分片群集用户
要为分片群集创建用户,请连接到 mongos实例并添加用户。然后,客户端通过mongos实例对这些用户进行身份验证。在分片群集中,MongoDB将用户配置数据存储在 config servers 的 admin 数据库中。
本地分片用户
然而,一些维护操作,如cleanupOrphaned, compact,rs.reconfig(),需要分片集群特定的碎片直接连接。要执行这些操作,您必须直接连接到分片并以本地分片 管理用户身份进行身份验证。
要创建分片本地管理用户,请直接连接到分片并创建该用户。MongoDB将分片本地用户存储在分片本身的admin数据库中。
这些分片本地用户与通过添加到分片集群的用户完全独立mongos。分片本地用户是分片本地用户,无法通过进行访问mongos。
与分片的直接连接仅应用于分片特定的维护和配置。通常,客户端应通过来连接到分片群集mongos。
Localhost Exception
localhost exception 允许您启用访问控制,然后在系统中创建第一个用户。除了localhost异常,在启用访问控制后,连接到localhost接口并在admin
数据库中创建第一个用户。第一个用户必须具有创建其他用户的特权,例如具有userAdmin 或 userAdminAnyDatabase角色的用户 。使用localhost exception的连接只能访问在admin数据库上创建第一个用户。
在版本3.4中进行了更改: MongoDB 3.4扩展了localhost exception ,以允许执行该 db.createRole() 方法。该方法允许用户通过LDAP授权在MongoDB内部创建一个角色,该角色映射到LDAP中定义的角色。有关更多信息,请参见LDAP授权。
localhost exception 仅在MongoDB实例中没有创建用户的情况下适用。
对于分片群集,localhost exception 适用于每个分片,也适用于整个群集。创建分片群集并通过 mongos 实例添加用户管理员后,您仍必须防止未经授权而访问各个分片。对集群中的每个分片执行以下步骤之一:
- 创建一个管理用户
- 在启动时禁用localhost exception 。要禁用localhost exception ,请将
enableLocalhostAuthBypass
参数设置为0
。
添加用户 (Add Users)
概述
MongoDB采用基于角色的访问控制(RBAC)来确定用户的访问权限。向用户授予一个或多个角色,这些角色决定用户对MongoDB资源的访问或权限以及用户可以执行的操作。用户应该只拥有确保系统运行具有最低权限以及所需的最小权限集。
MongoDB系统的每个应用程序和用户都应该映射到不同的用户。这种访问隔离有助于访问撤销和在线用户维护。
前提条件
如果启用了访问控制,则可以使用 localhost exception 在系统中创建第一个用户。该用户必须具有创建其他用户的特权。从MongoDB 3.0开始,除了localhost之外,您只能在admin
数据库上创建用户。创建第一个用户后,您必须验证为该用户才能添加后续用户。 启用访问控制提供有关在为部署启用访问控制时添加用户的更多详细信息。
对于常规用户创建,您必须拥有以下权限:
-
要在数据库中创建新用户,必须对该数据库资源执行createUser操作。
-
要将角色授予用户,必须对角色的数据库执行grantRole操作。
内置角色 userAdmin 和 userAdminAnyDatabase 在各自的资源上提供 createUser 和 grantRole 操作。
例子
要在MongoDB部署中创建用户,请连接后使用db.createUser() 方法或createUser命令来添加用户。
用户名/密码认证
以下操作在 reporting 数据库中创建具有指定名称、密码和角色的用户。
建议
从mongoshell的4.2版开始,您可以将passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用来提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以像使用早期版本的mongoshell一样直接指定密码。
use reporting
db.createUser(
{
user: "reportsUser",
pwd: passwordPrompt(), // or cleartext password
roles: [
{ role: "read", db: "reporting" },
{ role: "read", db: "products" },
{ role: "read", db: "sales" },
{ role: "readWrite", db: "accounts" }
]
}
)
启用访问控制提供了有关对MongoDB部署强制执行身份验证的更多详细信息。
Kerberos身份验证
将使用外部身份验证机制(如Kerberos)向MongoDB进行身份验证的用户必须在$external数据库中创建,该数据库允许mongos或mongod查询外部源进行身份验证。
在版本3.6.3中进行了更改:要与$external 授权用户(即Kerberos、LDAP、x.509用户)使用会话,用户名不能大于10k字节。
对于Kerberos身份验证,必须添加Kerberos主体作为用户名。您不需要指定密码。
下面的操作添加Kerberos主体reportingapp@EXAMPLE.NET报告以只读方式访问记录数据库。
use $external
db.createUser(
{
user: "reportingapp@EXAMPLE.NET",
roles: [
{ role: "read", db: "records" }
]
}
)
MongoDB在Linux上的Kerberos身份验证 和MongoDB在windows上的Kerberos身份验证提供了有关设置Kerberos身份验证您的MongoDB部署的更多细节。
LDAP认证
必须在$external数据库中创建将使用外部身份验证机制(如LDAP)向MongoDB进行身份验证的用户,该数据库允许mongos或mongod查询外部源进行身份验证。
在版本3.6.3中进行了更改:要与$external 授权用户(即Kerberos、LDAP、x.509用户)使用会话,用户名不能大于10k字节。
对于LDAP身份验证,必须指定用户名。您不需要指定密码,因为这是由LDAP服务处理的。
以下操作添加了对记录数据库具有只读访问权限的报告用户。
use $external
db.createUser(
{
user: "reporting",
roles: [
{ role: "read", db: "records" }
]
}
)
Authenticate Using SASL and LDAP with ActiveDirectory and Authenticate Using SASL and LDAP with OpenLDAP 提供更多信息。
x.509客户端证书认证
必须在$external数据库中创建将使用外部身份验证机制(如x.509客户端证书身份验证)向MongoDB进行身份验证的用户,该数据库允许mongos或mongod查询外部源进行身份验证。
在版本3.6.3中进行了更改:要与$external authentication用户(即Kerberos、LDAP、x.509用户)使用会话,用户名不能大于10k字节。
对于x.509客户端证书身份验证,必须以MongoDB用户的身份从客户端证书中添加subject的值。每个唯一的x.509客户端证书对应于一个MongoDB用户。您不需要指定密码。
下面的操作添加客户端证书subject CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry user以只读方式访问记录数据库。
use $external
db.createUser(
{
user: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry",
roles: [
{ role: "read", db: "records" }
]
}
)
使用x.509证书对客户端进行身份验证提供了有关为MongoDB部署设置x.509客户端证书身份验证的详细信息。
- 点赞
- 收藏
- 关注作者
评论(0)