[mongo] [security] 9.2 mongodb访问控制 (Access Control)

举报
dber 发表于 2021/01/27 18:45:03 2021/01/27
【摘要】 概述在MongoDB部署上启用访问控制会强制执行身份验证,要求用户证明自己。访问启用访问控制的MongoDB时,用户只能执行其角色定义的操作。以下在单独mongod实例上启用访问控制, 并使用默认的身份验证机制。有关所有受支持的认证机制,请参阅 认证机制。用户管理员(User Administrator)启用访问控制后,请确保您在数据库admin中具有用户 userAdmin或userAdm...

概述

在MongoDB部署上启用访问控制会强制执行身份验证,要求用户证明自己。访问启用访问控制的MongoDB时,用户只能执行其角色定义的操作。

以下在单独mongod实例上启用访问控制, 并使用默认的身份验证机制。有关所有受支持的认证机制,请参阅 认证机制

用户管理员(User Administrator

启用访问控制后,请确保您在数据库admin中具有用户 userAdminuserAdminAnyDatabase角色 。该用户可以管理用户和角色,例如:创建用户,向用户授予或撤消角色以及创建、修改自定义角色。

程序

以下过程首先将用户管理员添加到在没有访问控制的情况下运行的MongoDB实例,然后启用访问控制。

注意

示例MongoDB实例使用端口27017和数据目录/var/lib/MongoDB。

该示例假设存在数据目录/var/lib/mongodb。根据需要指定其他数据目录。

1个

在没有访问控制的情况下启动MongoDB。

启动单独mongod,未开启访问控制。

例:

mongod --port 27017 --dbpath /var/lib/mongodb 
2

连接到实例。

mongo --port 27017 

根据需要指定其他命令行选项以将mongoShell连接 到您的部署,例如--host

3

创建用户管理员。

在mongoshell中,在admin数据库中添加一个具有userAdminAnyDatabase角色的用户。包括此用户所需的其他角色。例如,下面使用userAdminAnyDatabase角色和readWriteAnyDatabase角色在管理数据库中创建用户myUserAdmin。

建议

mongoShell的4.2版本开始,您可以将该passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,仍然可以像使用早期版本的mongoShell一样直接指定密码 。

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: passwordPrompt(), // or cleartext password
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

注意

在其中创建用户的数据库(在此示例中 admin)是用户的身份验证数据库。尽管用户将对此数据库进行身份验证,但是该用户可以在其他数据库中扮演角色;即用户的身份验证数据库不限制用户的权限。

4

使用访问控制重新启动MongoDB实例。

  1. 关闭mongod实例。例如,在mongo shell中


    db.adminCommand( { shutdown: 1 } ) 
  2. 退出mongosehll。

  3. mongod启用访问控制的情况下启动。

连接到此实例的客户端现在必须将自己验证为MongoDB用户。客户端只能执行由其分配的角色确定的操作。

5

以用户管理员身份连接并进行身份验证。

使用mongo sehll:

  • 连接时,通过用户凭据进行身份验证,或
  • 连接时不进行身份验证,然后发出db.auth()进行身份验证的 方法。


使用-u<username>、-p和--authenticationDatabase<database>命令行选项启动mongo shell:

mongo --port 27017  --authenticationDatabase "admin" -u "myUserAdmin" -p 

出现提示时输入密码。

mongo shell 连接到 mongod

mongo --port 27017 

mongo shell中,切换到身份验证数据库(在本例中为admin),然后使用 db.auth(<username>, <pwd>)进行身份验证:

建议

mongoShell的4.2版本开始,您可以将该passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,仍然可以像使用早期版本的mongoShell一样直接指定密码 。

use admin
db.auth("myUserAdmin", passwordPrompt()) //或明文密码

出现提示时输入密码。


6

根据部署需要创建其他用户。

身份验证为用户管理员后,使用数据库创建用户()以创建其他用户。您可以将任何内置角色或用户定义的角色分配给用户。

以下操作将用户myTester添加到测试数据库中,该用户在测试数据库中具有readWrite角色,在报告数据库中具有read角色。

建议

mongoShell的4.2版本开始,您可以将该passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,仍然可以像使用早期版本的mongoShell一样直接指定密码 。

use test
db.createUser(
  {
    user: "myTester",
    pwd:  passwordPrompt(),   // or cleartext password
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)

注意

创建用户(在本例中为test)的数据库是该用户的身份验证数据库。尽管用户将对此数据库进行身份验证,但用户可以在其他数据库中拥有角色;即,用户的身份验证数据库不限制用户的权限。

创建其他用户后,断开mongo shell连接 。

7

连接到实例并以身份验证myTester

以断开mongo外壳 myUserAdmin连接后,以重新连接myTester。您可以:

  • 通过用户凭据身份验证,或
  • 首先连接而不进行身份验证,然后发出db.auth()进行身份验证的 方法。



mongo --port 27017 -u "myTester" --authenticationDatabase "test" -p 

出现提示时输入用户密码。

mongo-端口27017

建议

mongoShell的4.2版本开始,您可以将该passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,仍然可以像使用早期版本的mongoShell一样直接指定密码 。

use test
db.auth("myTester", passwordPrompt()) //或明文密码

出现提示时输入用户密码。

8

插入文档

myTester用户有权在test数据库中执行读取和写入操作(以及在数据库中执行读取操作reporting)。身份验证为后 myTester,将文档插入test 数据库的集合中。例如,您可以在test数据库中执行以下插入操作:

db.foo.insert( { x: 1, y: 1 } ) 

其他注意事项

副本集和分片群集

启用访问控制后,副本集和分片群集要求成员之间进行内部身份验证。有关更多详细信息,请参阅内部/成员身份验证

Localhost exception

您可以在启用访问控制之前或之后创建用户。如果在创建任何用户之前启用访问控制,则MongoDB将提供 localhost exception,该规则允许在admin数据库中创建用户管理员。创建后,您必须通过用户管理员身份验证才能根据需要创建其他用户。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。