使用机制“SCRAM-SHA-1”的 Mongoexport 身份验证错误

Leo*_*rak 19 mongodb

我已经接管了未记录的 Mongo 4.4.8 集群(PSA)。我正在努力整理它并彻底测试。

\n

原始连接字符串:

\n
MONGODB_URI=mongodb://${USER}:${PASS}@10.0.0.3:27017,10.0.0.6:27017,10.0.0.2:27017/bud?replicaSet=bud-replica&authSource=admin\n
Run Code Online (Sandbox Code Playgroud)\n

我已启用本地主机和套接字连接。我可以从 cmdline 登录

\n
mongo -u ${USER} -p ${PASS}\nMongoDB shell version v4.4.8\nconnecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb\nImplicit session: session { "id" : UUID("492e331b-417e-458a-83c7-9db6eaae0869") }\nMongoDB server version: 4.4.8\n
Run Code Online (Sandbox Code Playgroud)\n

我可以将 db 切换到bud并执行查询。但如果我只是跑

\n
mongo\n
Run Code Online (Sandbox Code Playgroud)\n

那么使用相同凭据的身份验证将不起作用:

\n
bud-replica:PRIMARY> db.auth('admin','admin');\nError: Authentication failed.\n0\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试搜索用户,但显示没有:

\n
bud-replica:PRIMARY> db.getUsers()\n[ ]\nbud-replica:PRIMARY> use bud\nswitched to db bud\nbud-replica:PRIMARY> db.getUsers()\n[ ]\n
Run Code Online (Sandbox Code Playgroud)\n

这是mongod.conf安全部分:

\n
security:\n   authorization: enabled\n   keyFile: "/etc/bud-rs"\n
Run Code Online (Sandbox Code Playgroud)\n

最后我需要在做实验之前导出数据。尽管命令行界面看起来相似,但 mongoexport 无法获取数据,无论我设置用户/密码还是跳过这些参数。

\n
mongoexport -h localhost --db=bud -u ${USER} -p ${PASS} -c=accidents --jsonArray > accidents.json\n2021-08-25T19:30:30.631+0200    could not connect to server: connection() error occured during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-1": (AuthenticationFailed) Authentication failed.\nmongoexport -h localhost --db=bud -u ${USER} -p ${PASS} -c=accidents --jsonArray --authenticationDatabase \xe2\x80\x9cadmin\xe2\x80\x9d > accidents.json\n2021-08-25T19:36:18.738+0200    could not connect to server: connection() error occured during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-1": (AuthenticationFailed) Authentication failed.\nroot@10:~# mongoexport -h localhost --db=bud -u ${USER} -p ${PASS} -c=accidents --jsonArray --authenticationDatabase \xe2\x80\x9cbud\xe2\x80\x9d > accidents.json\n2021-08-25T19:38:21.174+0200    could not connect to server: connection() error occured during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-1": (AuthenticationFailed) Authentication failed.\n
Run Code Online (Sandbox Code Playgroud)\n

我真的很困惑,我没能在 Google 或 SO 上找到解决方案。

\n

第二个相关问题:

\n

如果我需要创建新用户,我应该在所有副本上创建还是自动同步?

\n

第一次更新

\n

这是解决方法,但我的问题仍然有效。我想明白。

\n
root@10:~# mongoexport --db=bud -u ${USER} -p ${PASS} -c=accidents --jsonArray "mongodb://admin:admin@10.0.0.3:27017/bud?authSource=admin" > accidents.json\n2021-08-25T20:46:54.777+0200    connected to: mongodb://[**REDACTED**]@10.0.0.3:27017/bud?authSource=admin\n2021-08-25T20:46:55.778+0200    [........................]  bud.accidents  0/4379  (0.0%)\n2021-08-25T20:46:56.497+0200    [########################]  bud.accidents  4379/4379  (100.0%)\n2021-08-25T20:46:56.497+0200    exported 4379 records\n
Run Code Online (Sandbox Code Playgroud)\n

第二次更新

\n
bud-replica:PRIMARY> use admin\nbud-replica:PRIMARY> show collections\nsystem.keys\nsystem.users\nsystem.version\nbud-replica:PRIMARY> db.system.users.find()\n{ "_id" : "admin.admin", "userId" : UUID("769e4f5c-6f46-4153-857e-47d7d8730066"), "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "32/AP4019eome36j8n\n
Run Code Online (Sandbox Code Playgroud)\n

Joe*_*Joe 82

用户凭证是在管理数据库中创建的。

use admin与mongo shell连接时,运行前切换db.auth

authSource=admin在连接字符串中使用的 mongoexport 命令有效。

添加--authenticationDatabase=admin到另一个命令行以指示它也使用管理数据库进行身份验证。


小智 14

下面的整个示例命令对我有用。

Mongodb 版本:5.xx,也适用于 Mongodb 版本:8.xx

mongodump --authenticationDatabase=admin --uri mongodb://username:password@mongodb-host/db-name?ssl=false&authSource=admin
Run Code Online (Sandbox Code Playgroud)