MongoDB - 管理员用户未授权

Posted

技术标签:

【中文标题】MongoDB - 管理员用户未授权【英文标题】:MongoDB - admin user not authorized 【发布时间】:2014-07-19 13:37:08 【问题描述】:

我正在尝试向我的 MongoDB 添加授权。 我正在使用 MongoDB 2.6.1 在 Linux 上执行所有这些操作。 我的 mongod.conf 文件是旧的兼容格式 (这就是它的安装方式)。

1) 我按照 (3) 中的描述创建了管理员用户

http://docs.mongodb.org/manual/tutorial/add-user-administrator/

2) 然后我通过取消注释这一行来编辑 mongod.conf

auth = true

3) 最后我重新启动了 mongod 服务并尝试使用以下命令登录:

/usr/bin/mongo localhost:27017/admin -u sa -p pwd

4) 我可以连接,但连接时会显示。

MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:47:16 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command  getLog: "startupWarnings" 

5) 现在看来我创建的这个sa 用户根本没有权限。

root@test02:~# mc
MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:57:03 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command  getLog: "startupWarnings" 
[admin] 2014-05-29 17:57:03.011 >>> use admin
switched to db admin
[admin] 2014-05-29 17:57:07.889 >>> show collections
2014-05-29T17:57:10.377-0400 error: 
        "$err" : "not authorized for query on admin.system.namespaces",
        "code" : 13
 at src/mongo/shell/query.js:131
[admin] 2014-05-29 17:57:10.378 >>> use test
switched to db test
[test] 2014-05-29 17:57:13.466 >>> show collections
2014-05-29T17:57:15.930-0400 error: 
        "$err" : "not authorized for query on test.system.namespaces",
        "code" : 13
 at src/mongo/shell/query.js:131
[test] 2014-05-29 17:57:15.931 >>>

有什么问题?我将整个过程重复了 3 次,然后 我想我按照 MongoDB 文档中的规定做了所有的事情。但它不起作用。 我期待这个 sa 用户被授权做任何事情,以便 然后他可以创建其他用户并赋予他们更具体的权限。

【问题讨论】:

这很烦人或记录不充分。我在那里苦苦挣扎。最后,我有一个具有全局“root”角色的用户,但仍然无法执行某些操作,例如执行命令... 【参考方案1】:

这有点令人困惑 - 我相信您需要授予自己 readWrite 权限才能查询数据库。具有 dbadmin 或 useradmin 的用户可以管理数据库(包括授予自己额外的权限),但不能执行查询或写入数据。

所以授予自己读写权限,你应该没问题 -

http://docs.mongodb.org/manual/reference/built-in-roles/#readWrite

【讨论】:

我不确定这个答案是否与问题相关,但无论哪种方式,它都提供了不正确的信息。 dbOwner 角色包括 readWrite 角色:docs.mongodb.org/manual/reference/built-in-roles/#dbOwner 答案是正确的 - dbadmin 和 useradmin 角色(这是原始发帖人询问的)不包括 readWrite。 dbOwner 确实如此,但这不是原始海报使用和询问的内容。 你说得对。道歉。我花了太长时间为角色争吵,弄得一头雾水。 所以你可以让一个管理员用户访问实际的 mongodb 服务器,然后让其他用户访问特定的数据库?【参考方案2】:

我也在为同样的问题摸不着头脑,在添加第一个管理员用户时将角色设置为 root 后一切正常。

use admin
db.createUser(
  
    user: 'admin',
    pwd: 'password',
    roles: [  role: 'root', db: 'admin'  ]
  
);
exit;

如果您已经创建了admin 用户,您可以像这样更改角色:

use admin;
db.grantRolesToUser('admin', [ role: 'root', db: 'admin' ])

有关完整的身份验证设置参考,请参阅我在互联网上经过数小时研究后编写的steps。

【讨论】:

WTF?!为这种愚蠢的事情浪费了一个小时。为什么他们在文档中添加 userAdminAnyDatabase 而不是 root 这个想法是您首先创建一个仅用于管理其他用户的用户(因此该角色以“userAdmin”开头),然后才创建您的普通用户。这有点道理,但我第一次也没有得到它......@akostadinov 这对我在 MongoDB v3.4.7 上不起作用:db.grantRolesToUser('admin',[ role: "root", db: "admin" ]) @Cerin 这个代码 DID 为我工作:db.grantRolesToUser('admin',[ role: "root", db: "admin" ]),这让我很困惑。我无权运行命令,但我可以运行命令使自己成为 root,然后然后运行该命令。很奇怪:S 我知道上游文档提到了它,如果你正在寻找它,要进行身份验证,你必须像这样“使用”管理数据库:use admin; 然后db.auth("username", "password");希望这对某人有所帮助。【参考方案3】:

我在 Windows 环境中遇到了类似的问题:我安装了 Bitnami DreamFactory,它还安装了另一个在系统启动时启动的 MongoDb。我正在运行我的 MongoDbService(启动时没有任何错误),但在浪费了很多时间后我注意到我实际上是在连接 Bitnami 的 MongoDb 服务。请看一下您的服务器上是否没有运行其他 mongoDB 实例。

祝你好运!

【讨论】:

我不知道为什么这个答案被否决了;这是一个合理的建议。例如,我遇到了一个在后台运行 Tomcat 的管理控制台。如果您启动本地服务器(任何类型),您可能会通过尝试连接来检查它是否正在运行。第一次连接将成功。然后,您将与“隐藏”服务器搏斗,然后再检查服务器的日志并注意到您的服务器无法绑定到所需的端口。【参考方案4】:

这可能是因为你没有在 mongodb.conf 中设置 noAuth=true

# Turn on/off security.  Off is currently the default
noauth = true
#auth = true

设置后重启服务使用

服务 mongod 重启

【讨论】:

用户明确表示他想开始使用授权,因此他取消了 auth=true 的注释。为什么建议禁用授权!? 我猜你没有读懂问题...OP 想要 auth,结合 s-hunter 的设置用户响应和 jremi 连接到自定义配置的响应【参考方案5】:

也许一个关于如何更改当前用户的简单示例会对某人有所帮助。这就是我真正想要的。

根据@JohnPetrone 的建议,我使用grantRolesToUser 将readWrite 角色添加到我的管理员用户中

> use admin
> db.grantRolesToUser("admin",["readWrite"])
> show collections
system.users
system.version

【讨论】:

执行此操作时我收到了Error: not authorized on admin to execute command【参考方案6】:

此外,请注意,如果您的 mongo shell 客户端无法正确连接到 mongod 实例,您可能会收到此类“Permission Denied”错误。

通过检查连接端口确保您的客户端打开了连接,同时您在mongod 中使用的端口未在使用中。您可以在 shell 和进程中使用 --port <port> 参数来设置不同的端口。

【讨论】:

【参考方案7】:

您可以尝试:使用 --authenticationDatabase 标志会有所帮助。

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

【讨论】:

【参考方案8】:

我知道这个答案在这个帖子中来得很晚,但我希望你看看。

您收到该错误的原因是基于您授予用户的特定角色,您现在已经收集到了,是的,给该用户角色 root 将解决您的问题,但您必须首先了解这些角色在将它们授予用户之前就完成了。

在教程中,您授予用户userAdminAnyDatabase 角色,这基本上使用户能够管理所有数据库的用户。 您尝试对用户执行的操作超出了其角色定义。

root 角色在其定义中包含此角色,还有 readWriteAnyDatabasedbAdminAnyDatabase 和其他角色使其成为超级用户(基本上是因为您可以用它做任何事情)。

您可以查看角色定义,了解您需要为用户提供哪些角色才能完成某些任务。 https://docs.mongodb.com/manual/reference/built-in-roles/ 不建议让所有用户都成为超级用户 :)

【讨论】:

那么,如果不是root,你建议用什么角色来解决这个问题? 您好@HendyIrawan,我建议您确定您希望每个用户能够做什么,并赋予他们使他们能够做到这一点的角色。例如,如果您只想让用户阅读(这是问题试图与show collections 做的事情),您应该赋予它这种能力,而不是其他roles: [ role: "read", db: "admin" ]。请注意,此处的角色已读取,这是特定于数据库的,除此之外您不能做任何事情。查看此链接以了解其他角色 docs.mongodb.com/manual/reference/built-in-roles 所以这里问题的答案(不是“例如”)是“阅读”? 是的。请注意,用户只能读取指定的数据库。【参考方案9】:

这是一个简单的问题。

    您必须切换目标数据库 NOT admin,这一点很重要。

使用你的数据库

    通过检查您的数据库身份验证

显示用户

    如果您得到一个 空对象,这就是问题所在。你只需要输入

db.createUser( 用户:“你的用户”, 密码:“密码”, 角色:[“readWrite”,“dbAdmin”] )

db.grantRolesToUser('yourUser',[ role: "dbAdmin", db: "yourDB" ])

【讨论】:

【参考方案10】:

我遇到了这个问题,因为我的 MongoDB Compass 中的主机名指向 admin 而不是我的项目。通过在主机名后添加 /projectname 来修复:) 试试这个:

    在MongoDB atlas website中选择您的项目 与 MongoDB Compass 连接/连接 下载 Compass/选择您的操作系统 我使用的是 Compass 1.12 或更高版本 在 Compass 1.12 或更高版本下复制连接字符串。 打开 MongoDB Compass/Connect(左上角)/Connect To 检测到连接字符串/是/ 在主机名后附加您的项目名称:cluster9-foodie.mongodb.net/项目名称 使用 POSTMAN 连接并测试 API。 成功。

在您的代码中也使用相同的连接字符串:

    之前: mongodb+srv://projectname:password@cluster9-foodie.mongodb.net/admin 之后: mongodb+srv://projectname:password@cluster9-foodie.mongodb.net/projectname

祝你好运。

【讨论】:

【参考方案11】:

使用 mydb db.createUser( user: "test", pwd: "secret", roles: [ "readWrite", "dbAdmin"],passwordDigestor:"server" )

【讨论】:

【参考方案12】:

同意您必须获得管理员数据库的身份验证,并且至少需要一个具有正确权限的角色,以避免来自数据库的“本地主机异常”(这是用于 mongoDB 的本地托管),尽管您拥有一切在访问使用 Mongo Atlas 创建的 mongoDB 时,几乎每个命令都出现未授权异常,那么这里是您可能知道原因的地方,为什么:

https://dba.stackexchange.com/questions/219003/not-authorized-on-admin-to-execute-command-mongodb-atlas-m0-free-tier-cluster?newreg=471a9a26108243d78d4ca74a87e7a115

如果您在 mongo Atlas 上托管过 mongoDB,请检查此项:

https://docs.atlas.mongodb.com/unsupported-commands/

【讨论】:

【参考方案13】:
Use Admin :
    use admin

Create a super user : 

    db.createUser(
    
    user: "master",
    pwd: "test@123",
    roles: [ 
     
    role: "readWriteAnyDatabase", 
    db: "admin" 
    , 
    
    "role" : "dbAdminAnyDatabase",
    "db" : "admin"
    ,
    
    "role" : "clusterAdmin",
    "db" : "admin"
    ,
    "userAdminAnyDatabase" 
    ]
    
    )

【讨论】:

感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。【参考方案14】:

我在 Centos 7 for MongoDB 4.2 上遵循了这些步骤。 (远程用户)

更新 mongod.conf 文件

vi /etc/mongod.conf
   net:
     port: 27017
     bindIp: 0.0.0.0 
   security:
     authorization: enabled

启动 MongoDB 服务恶魔

systemctl start mongod

打开 MongoDB 外壳

mongo

在 shell 上执行此命令

use admin
db.createUser(
  
    user: 'admin',
    pwd: 'YouPassforUser',
    roles: [  role: 'root', db: 'admin'  ]
  
);

远程根用户已创建。现在,您可以使用开发机器上的任何 MongoDB GUI 工具来测试此数据库连接。赞Robo 3T

【讨论】:

【参考方案15】:

对于 MongoDB shell 版本 v4.2.8,我尝试了不同的方法来使用身份验证备份我的数据库,我的获胜解决方案是

mongodump -h <your_hostname> -d <your_db_name> -u <your_db_username> -p <your_db_password> --authenticationDatabase admin -o /path/to/where/i/want

【讨论】:

【参考方案16】:

我在这个帖子中遇到了类似的问题,但我的问题是我使用了集合名称而不是数据库名称。

【讨论】:

以上是关于MongoDB - 管理员用户未授权的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb 之 用户授权数据库管理

为mongodb加用户授权并使用RockMongo进行管理

MongoDB用户授权和管理

MongoDB用户授权和管理

MongoDB用户及权限管理:用户管理

MongoDB用户角色和权限管理