ChatGPT解决这个技术问题 Extra ChatGPT

如何使用用户名和密码保护 MongoDB

我想为我的 MongoDB 实例设置用户名和密码身份验证,以便任何远程访问都会询问用户名和密码。我尝试了 MongoDB 网站上的教程并做了以下操作:

use admin
db.addUser('theadmin', '12345');
db.auth('theadmin','12345');

之后,我退出并再次运行 mongo。而且我不需要密码来访问它。即使我远程连接到数据库,也不会提示我输入用户名和密码。

更新这是我最终使用的解决方案

1) At the mongo command line, set the administrator:

    use admin;
    db.addUser('admin','123456');

2) Shutdown the server and exit

    db.shutdownServer();
    exit

3) Restart mongod with --auth

  $ sudo ./mongodb/bin/mongod --auth --dbpath /mnt/db/

4) Run mongo again in 2 ways:

   i) run mongo first then login:

        $ ./mongodb/bin/mongo localhost:27017
        use admin
        db.auth('admin','123456');

  ii) run & login to mongo in command line.

        $ ./mongodb/bin/mongo localhost:27017/admin -u admin -p 123456

用户名和密码对 mongodumpmongoexport 的工作方式相同。

这适用于 MongDB 版本 2.2.x
在 Mongo 3.0.4 中,创建用户的命令是 db.createUser()
请按照此在 Mongodb 3.0 docs.mongodb.org/v3.0/tutorial/add-user-administrator 上创建管理员用户
MongoDB 3.0+ 的更新:How to set up authentication in MongoDB 3.0
需要明确的是,这不会加密通过线路传递的字节。它仅用于访问控制。

P
Prashant Pokhriyal

设置用户后,您需要使用 --auth 选项启动 mongod

从 MongoDB 站点:

使用 --auth 选项运行数据库(mongod 进程)以启用安全性。您必须在使用 --auth 启动服务器之前将用户添加到 admin db,或者从 localhost 界面添加第一个用户。

MongoDB Authentication


我已经尝试过并按照示例进行操作。现在..我可以在使用--auth重新启动服务器后进行设置。但是,当我尝试登录时(./mongo -u theadmin -p 12345)我失败了。我无法登录。
如果之后您无法连接,那是因为您尝试在 admin 数据库上连接,请使用另一个数据库并重试。只有 userAdmin(AnyDatabase) 可以在 admin 上连接。
b
basickarl

哇,这里有这么多复杂/令人困惑的答案。

这是从 v3.4 开始的。

简短的回答。

在没有访问控制的情况下启动 MongoDB。 mongod --dbpath /data/db 连接实例。 mongo 创建用户。使用 some_db db.createUser({ 用户:“myNormalUser”,密码:“xyz123”,角色:[{角色:“readWrite”,db:“some_db”},{角色:“read”,db:“some_other_db”}] } ) 停止 MongoDB 实例并使用访问控制再次启动它。 mongod --auth --dbpath /data/db 以用户身份连接并进行身份验证。使用 some_db db.auth("myNormalUser", "xyz123") db.foo.insert({x:1}) 使用 some_other_db db.foo.find({})

长答案:如果您想正确理解,请阅读此内容。

这真的很简单。我将以下内容简化https://docs.mongodb.com/manual/tutorial/enable-authentication/

如果您想详细了解这些角色的实际作用,请在此处阅读更多内容:https://docs.mongodb.com/manual/reference/built-in-roles/

在没有访问控制的情况下启动 MongoDB。 mongod --dbpath /data/db 连接实例。 mongo 创建用户管理员。以下在 admin 身份验证数据库中创建用户管理员。用户是 some_db 数据库的 dbOwner,而不是 admin 数据库的 dbOwner,记住这一点很重要。使用管理员 db.createUser( { user: "myDbOwner", pwd: "abc123", roles: [ { role: "dbOwner", db: "some_db" } ] } )

或者,如果您想创建一个管理员,它是任何数据库的管理员:

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

停止 MongoDB 实例并使用访问控制再次启动它。 mongod --auth --dbpath /data/db 以用户管理员身份连接并验证 admin 身份验证数据库,而不是 some_db 身份验证数据库。用户管理员是在 admin 认证数据库中创建的,该用户在 some_db 认证数据库中不存在。使用管理员 db.auth("myDbOwner", "abc123")

您现在已通过 some_db 数据库验证为 dbOwner。因此,现在如果您希望直接向 some_db 数据库读取/写入/执行操作,您可以更改为它。

use some_db
//...do stuff like db.foo.insert({x:1})
// remember that the user administrator had dbOwner rights so the user may write/read, if you create a user with userAdmin they will not be able to read/write for example.

有关角色的更多信息:https://docs.mongodb.com/manual/reference/built-in-roles/

如果您希望添加不是用户管理员且只是普通用户的其他用户,请继续阅读下面的内容。

创建普通用户。该用户将在下面的 some_db 身份验证数据库中创建。使用 some_db db.createUser({ 用户:“myNormalUser”,密码:“xyz123”,角色:[{角色:“readWrite”,db:“some_db”},{角色:“read”,db:“some_other_db”}] } ) 退出 mongo shell,重新连接,以用户身份进行身份验证。使用 some_db db.auth("myNormalUser", "xyz123") db.foo.insert({x:1}) 使用 some_other_db db.foo.find({})

最后但并非最不重要的一点是,由于用户没有正确阅读我发布的关于 --auth 标志的命令,如果您不希望将其设置为标志,可以在 mongoDB 的配置文件中设置此值。


最后,我知道了真正发生的事情。
我发现自己希望接受的答案可以在 SO 上得到刷新。这是截至 2017 年 7 月最相关的解决方案。
请更新您的答案!我不知道你从哪里得到 userAdminAnyDatabase 但它不起作用。该角色是对所有数据库的管理员访问权限的 root。
@AakashVerma docs.mongodb.com/manual/reference/built-in-roles/… ;) 除非出于开发目的,您知道自己不会受到损害,否则切勿使用 ROOT! (tbh 只是从不使用 root 哈哈)
C
CoderUni

首先,取消注释 mongod 配置文件中以 #auth=true 开头的行(默认路径 /etc/mongod.conf)。这将为 mongodb 启用身份验证。

然后,重新启动 mongodb:sudo service mongod restart


默认路径是 /etc/mongod.conf 而不是 /etc/mongo.conf
或者,首先取消注释,然后重新启动:)))
更新:现在重新启动服务:sudo service mongodb restart
配置文件位置和名称为:/etc/mongodb.conf
在配置文件中,它的 authorization: enabled 是 4.4 版。请参阅 Mongodb authentication 段落 4 使用访问控制重新启动 MongoDB 实例 还要确保取消注释 #security:示例security: authorization: enabled
J
JohnAllen

此答案适用于 Mongo 3.2.1 Reference

1号航站楼:

$ mongod --auth

2号航站楼:

db.createUser({user:"admin_name", pwd:"1234",roles:["readWrite","dbAdmin"]})

如果你想添加没有角色(可选):

db.createUser({user:"admin_name", pwd:"1234", roles:[]})

检查是否经过身份验证:

db.auth("admin_name", "1234")

它应该给你:

1

别的 :

Error: Authentication failed.
0

旧版本(例如 2.4)将使用 db.addUser
我必须在 createUser 之前输入 use admin,否则会出错。
C
Camilo Martin

这是添加用户的javascript代码。

使用 --auth = true 启动 mongod 从 mongo shell 访问管理数据库并传递 javascript 文件。 mongo admin "Filename.js" "Filename.js" // 添加管理员用户 db.addUser("admin_username", "admin_password"); // 验证管理员用户 db.auth("admin_username", "admin_password"); // 使用来自 java 脚本的数据库代码 db = db.getSiblingDB("newDatabase"); // 添加新数据库数据库用户 db.addUser("database_username", "database_password");现在用户添加完成,我们可以验证从 mongo shell 访问数据库


在文件中设置用户名和密码看起来不太安全。
Javascript。不是“java脚本”。
javascript文件的目的是什么?
@CamiloMartin JavaScript,而不是“Javascript”。
A
Ali Ozkara

https://docs.mongodb.com/manual/reference/configuration-options/#security.authorization

编辑mongo设置文件;

sudo nano /etc/mongod.conf

添加行:

security.authorization : enabled

重启服务

sudo service mongod restart

问候


我不明白为什么每个人都不提这个。这太重要了
可能是最重要的答案。我们的服务器被黑了,因为其他答案没有提到这一点。
P
Prashant Sharma

您可以更改 /etc/mongod.conf

#security:

security:
    authorization: "enabled"

然后sudo service mongod restart


W
WAF

首先使用在终端上运行 mongoDB

mongod

现在运行 mongo shell 使用以下命令

    use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

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

mongod --auth

现在使用命令行从命令行验证自己

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

我从

https://docs.mongodb.com/manual/tutorial/enable-authentication/


我用root定义了一个用户,然后添加越来越多,直到我找到你,MongoDB Enterprise > db.system.users.find() { "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SC RAM-SHA-1" : { "iterationCount" : 10000, "salt" : "k96PCEflidMY5seVju+gAw==", "s toredKey" : "CabQTnJtny7cv0wT5X8oX9QOn3A=", "serverKey" : "RJyCdnlIhyIfj2+d44L61 bYK+MU=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" }, { "role" : "dbAdmin", "db" : "admin" }, { "role" : "userAdmin", "db" : "admin" }, { "role" : "root", "db" : "admin" } ] }仍然身份验证失败
我什至使用了 db.changeUserPassword() 或其他任何东西,即使在那之后,当我调用 db.auth('admin', 'my pass') 或您的操作方式时,它说用户管理员的身份验证失败
使用 root 角色提供对以下角色组合的操作和所有资源的访问... role root
J
Jinmin

这是我在 Ubuntu 18.04 上所做的:

$ sudo apt install mongodb
$ mongo
> show dbs
> use admin
> db.createUser({  user: "root",  pwd: "rootpw",  roles: [ "root" ]  })  // root user can do anything
> use lefa
> db.lefa.save( {name:"test"} )
> db.lefa.find()
> show dbs
> db.createUser({  user: "lefa",  pwd: "lefapw",  roles: [ { role: "dbOwner", db: "lefa" } ]  }) // admin of a db
> exit
$ sudo vim /etc/mongodb.conf
auth = true
$ sudo systemctl restart mongodb
$ mongo -u "root" -p "rootpw" --authenticationDatabase  "admin"
> use admin
> exit
$ mongo -u "lefa" -p "lefapw" --authenticationDatabase  "lefa"
> use lefa
> exit

H
Hasib Kamal Chowdhury

使用特定数据库的密码创建用户以保护数据库访问:

use dbName

db.createUser(
   {
     user: "dbUser",
     pwd: "dbPassword",
     roles: [ "readWrite", "dbAdmin" ]
   }
)

r
rahil471

请按以下步骤操作

使用 CLI 创建用户

use admin
db.createUser(
  {
    user: "admin",
    pwd: "admin123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

启用身份验证,您的操作方式因您的操作系统而异,如果您使用的是 Windows,您可以简单地 mongod --auth 在 linux 的情况下您可以编辑 /etc/mongod.conf 文件以添加 security.authorization :启用然后重新启动蒙古服务

通过 cli mongo -u "admin" -p "admin123" --authenticationDatabase "admin" 连接。而已

您可以查看 this post 以了解更多详细信息并学习使用 mongoose 连接到它。


m
ma_jafari

这就是我为 ubuntu 20.04 和 mongodb enterprise 4.4.2 所做的:

通过在终端中输入 mongo 来启动 mongo shell。使用管理数据库:

use admin

创建一个新用户并分配您的预期角色:

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

退出 mongo 并将以下行添加到 etc/mongod.conf:

security:
    authorization: enabled

重启mongodb服务器

(可选) 6.如果您希望您的用户具有 root 访问权限,您可以在创建用户时指定它,例如:

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

或者您可以使用以下方法更改用户角色:

db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])

B
Binita Bharati

一些答案是在使用 --auth 命令行标志或设置配置文件属性之间发送混合信号。

security:
  authorization: enabled

我想澄清这方面。首先,两种情况下的身份验证凭据(即用户/密码)都必须通过在默认的 admin 数据库上执行 db.createUser 查询来创建。获取凭据后,有两种启用身份验证的方法:

没有自定义配置文件:这是以前的身份验证标志适用的情况。像这样启动 mongod: usr/bin/mongod --auth 使用自定义配置文件:这是后一个配置必须存在于自定义配置文件中的时候。像这样启动 mongod: usr/bin/mongod --config

要通过身份验证连接到 mongo shell:mongo -u <user> -p <password> --authenticationDatabase admin

--authenticationDatabase 这里是创建用户的数据库名称。 mongorestoremongodump 等所有其他 mongo 命令都接受附加选项,即 -u <user> -p <password> --authenticationDatabase admin

详情请参阅https://docs.mongodb.com/manual/tutorial/enable-authentication/


t
turivishal

连接 mongoDB 的最佳实践如下:

初始安装后,使用 admin 然后运行以下脚本创建 admin 用户

    db.createUser(
     {
         user: "YourUserName",
         pwd: "YourPassword",
         roles: [
                   { role: "userAdminAnyDatabase", db: "admin" },
                   { role: "readWriteAnyDatabase", db: "admin" },
                   { role: "dbAdminAnyDatabase", db: "admin" },
                   { role: "clusterAdmin", db: "admin" }
                ]
     })

以下脚本将为数据库创建管理员用户。

使用 mongo -u YourUserName -p YourPassword admin 登录 db.admin 登录后,您可以通过重复 1 到 3 创建 N 个具有相同或不同管理员凭据的数据库。

这允许您为在 MongoDB 中创建的不同集合创建不同的用户和密码


在此之后转到 sudo nano /etc/mongod.conf 并输入这一行 security.authorization: enabled,您可以在此处查看参考链接:stackoverflow.com/a/57384027/3904109
P
Pang

这些步骤对我有用:

在 cmd 上写入 mongod --port 27017 然后连接到 mongo shell: mongo --port 27017 创建用户 admin :使用 admin db.createUser( { user: "myUserAdmin", pwd: "abc123", roles: [ { role: " userAdminAnyDatabase", db: "admin" } ] } ) 断开 mongo shell 重启 mongodb : mongod --auth --port 27017 启动 mongo shell : mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase " admin" 要在连接后进行身份验证,请将 mongo shell 连接到 mongod: mongo --port 27017 切换到身份验证数据库:使用 admin db.auth("myUserAdmin", "abc123"


F
Fusseldieb

您需要切换到您希望用户使用的数据库(不是管理员数据库)...

use mydatabase

有关更多帮助,请参阅此帖子... https://web.archive.org/web/20140316031938/http://learnmongo.com/posts/quick-tip-mongodb-users/


不需要,因为设置 db = db.getSiblingDB("newDatabase");
我无法想象为什么应该在 admin 以外的其他数据库中创建用户
R
Rajat Mishra

创建新用户后,请不要忘记授予用户grant read/write/root 权限。你可以试试

cmd: db.grantRolesToUser('yourNewUsername',[{ role: "root", db: "admin" }])


K
Kelvin Wang

MongoDB 4.4.13 社区

1.创建数据库用户

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

1.2 验证工作

> db.auth('myUserAdmin','abc123')

< { ok: 1 }

如果它失败了,你会得到

> db.auth('myUserAdmin','amongus')

MongoServerError: Authentication failed.

2.修改/etc/mongod.conf

nano /etc/mongod.conf

改变:

#security:

至:

security:
  authorization: enabled

3.重启mongod服务

sudo service mongod restart

这对我有用。


W
Wernfried Domscheit

许多重复的答案,但我认为他们错过了一个重要的注意事项:

即使正确启用了身份验证,您也可以在没有用户名/密码的情况下连接到 Mongo 数据库!

但是,您只能执行无害的命令,例如 db.help()db.getMongo()db.listCommands() 等。

$ mongo 
MongoDB shell version v4.4.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f662858b-8658-4e33-a735-120e3639c131") }
MongoDB server version: 4.4.3
mongos> db.getMongo()
connection to 127.0.0.1:27017
mongos> db
test
mongos> db.version()
4.4.3
mongos> db.runCommand({connectionStatus : 1})
{
        "authInfo" : {
                "authenticatedUsers" : [ ],
                "authenticatedUserRoles" : [ ]
        },
        "ok" : 1,
        "operationTime" : Timestamp(1618996970, 2),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1618996970, 2),
                "signature" : {
                        "hash" : BinData(0,"Kre9jvnJvsW+OVCl1QC+eKSBbbY="),
                        "keyId" : NumberLong("6944343118355365892")
                }
        }
}