[mongo] [security] 9.2 mongodb访问控制 (Access Control)
概述
在MongoDB部署上启用访问控制会强制执行身份验证,要求用户证明自己。访问启用访问控制的MongoDB时,用户只能执行其角色定义的操作。
用户管理员(User Administrator)
启用访问控制后,请确保您在数据库admin
中具有用户 userAdmin
或userAdminAnyDatabase
角色 。该用户可以管理用户和角色,例如:创建用户,向用户授予或撤消角色以及创建、修改自定义角色。
程序
以下过程首先将用户管理员添加到在没有访问控制的情况下运行的MongoDB实例,然后启用访问控制。
注意
示例MongoDB实例使用端口27017和数据目录/var/lib/MongoDB。
该示例假设存在数据目录/var/lib/mongodb。根据需要指定其他数据目录。
创建用户管理员。
在mongoshell中,在admin数据库中添加一个具有userAdminAnyDatabase角色的用户。包括此用户所需的其他角色。例如,下面使用userAdminAnyDatabase角色和readWriteAnyDatabase角色在管理数据库中创建用户myUserAdmin。
建议
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,仍然可以像使用早期版本的mongo
Shell一样直接指定密码 。
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
注意
在其中创建用户的数据库(在此示例中 admin
)是用户的身份验证数据库。尽管用户将对此数据库进行身份验证,但是该用户可以在其他数据库中扮演角色;即用户的身份验证数据库不限制用户的权限。
使用访问控制重新启动MongoDB实例。
-
关闭
mongod
实例。例如,在mongo shell中
:
db.adminCommand( { shutdown: 1 } )
-
退出
mongo
sehll。 -
在
mongod
启用访问控制的情况下启动。-
如果
mongod
从命令行启动,需要添加--auth
命令行选项:
mongod --auth --port 27017 --dbpath / var / lib / mongodb
-
如果使用 配置文件开启 mongo,请添加
security.authorization
配置文件:security:
authorization: enabled
-
连接到此实例的客户端现在必须将自己验证为MongoDB用户。客户端只能执行由其分配的角色确定的操作。
以用户管理员身份连接并进行身份验证。
使用mongo
sehll:
- 连接时,通过用户凭据进行身份验证,或
- 连接时不进行身份验证,然后发出
db.auth()
进行身份验证的 方法。
使用-u<username>、-p和--authenticationDatabase<database>命令行选项启动mongo shell:
mongo --port 27017 --authenticationDatabase "admin" -u "myUserAdmin" -p
出现提示时输入密码。
mongo --port 27017
在mongo
shell中,切换到身份验证数据库(在本例中为admin
),然后使用 db.auth(<username>, <pwd>)进行身份验证:
建议
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,仍然可以像使用早期版本的mongo
Shell一样直接指定密码 。
use admin
db.auth("myUserAdmin", passwordPrompt()) //或明文密码
出现提示时输入密码。
根据部署需要创建其他用户。
身份验证为用户管理员后,使用数据库创建用户()以创建其他用户。您可以将任何内置角色或用户定义的角色分配给用户。
以下操作将用户myTester添加到测试数据库中,该用户在测试数据库中具有readWrite角色,在报告数据库中具有read角色。
建议
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,仍然可以像使用早期版本的mongo
Shell一样直接指定密码 。
use test
db.createUser(
{
user: "myTester",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "reporting" } ]
}
)
注意
创建用户(在本例中为test)的数据库是该用户的身份验证数据库。尽管用户将对此数据库进行身份验证,但用户可以在其他数据库中拥有角色;即,用户的身份验证数据库不限制用户的权限。
创建其他用户后,断开mongo shell
连接 。
连接到实例并以身份验证myTester
。
以断开mongo
外壳 myUserAdmin
连接后,以重新连接myTester
。您可以:
- 通过用户凭据身份验证,或
- 首先连接而不进行身份验证,然后发出
db.auth()
进行身份验证的 方法。
mongo --port 27017 -u "myTester" --authenticationDatabase "test" -p
出现提示时输入用户密码。
建议
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,仍然可以像使用早期版本的mongo
Shell一样直接指定密码 。
use test
db.auth("myTester", passwordPrompt()) //或明文密码
出现提示时输入用户密码。
插入文档
myTester
用户有权在test
数据库中执行读取和写入操作(以及在数据库中执行读取操作reporting
)。身份验证为后 myTester
,将文档插入test
数据库的集合中。例如,您可以在test
数据库中执行以下插入操作:
db.foo.insert( { x: 1, y: 1 } )
扩展
其他注意事项
副本集和分片群集
启用访问控制后,副本集和分片群集要求成员之间进行内部身份验证。有关更多详细信息,请参阅内部/成员身份验证。
Localhost exception
您可以在启用访问控制之前或之后创建用户。如果在创建任何用户之前启用访问控制,则MongoDB将提供 localhost exception,该规则允许在admin
数据库中创建用户管理员。创建后,您必须通过用户管理员身份验证才能根据需要创建其他用户。
- 点赞
- 收藏
- 关注作者
评论(0)