如何使用用户名和密码保护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

用户名&password对于mongodumpmongoexport的作用相同。

566563 次浏览

您需要切换到您希望用户使用的数据库(而不是admin db)…

use mydatabase

查看这篇文章以获得更多帮助…https://web.archive.org/web/20140316031938/http://learnmongo.com/posts/quick-tip-mongodb-users/

你需要在设置用户后使用--auth选项启动mongod

来自MongoDB站点:

运行数据库(mongod进程),使用--auth选项启用 安全。您必须在之前向admin db中添加了一个用户 --auth启动服务器,或者从 主机接口。< / p >

MongoDB Authentication

下面是添加用户的javascript代码。

  1. --auth = true启动mongod

  2. 从mongo shell访问admin数据库,并传递javascript文件。

    mongo admin“Filename.js”

    “Filename.js”

    // Adding admin user
    db.addUser("admin_username", " admin_password");
    // Authenticate admin user
    db.auth("admin_username ", " admin_password ");
    // use  database code from java script
    db = db.getSiblingDB("newDatabase");
    // Adding newDatabase database user
    db.addUser("database_username ", " database_ password ");
    
  3. Now user addition is complete, we can verify accessing the database from mongo shell

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

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

这个答案是为了Mongo 3.2.1 参考 < / p >

终端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

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

编辑mongo设置文件;

sudo nano /etc/mongod.conf

加一行:

security.authorization : enabled

重新启动服务

sudo service mongod restart

问候

首先在终端上运行mongoDB

mongod

现在运行mongo shell use下面的命令

    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/

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

这是从v3.4开始的。

简短的回答。

  1. 在没有访问控制的情况下启动MongoDB (/data/db或你的db所在的位置)。

    mongod --dbpath /data/db
    
  2. 连接实例。

    mongo
    
  3. 创建用户。

    use some_db
    db.createUser(
    {
    user: "myNormalUser",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "some_db" },
    { role: "read", db: "some_other_db" } ]
    }
    )
    
  4. 停止MongoDB实例,使用访问控制重新启动。

    mongod --auth --dbpath /data/db
    
  5. 作为用户连接并进行身份验证。

    use some_db
    db.auth("myNormalUser", "xyz123")
    db.foo.insert({x:1})
    use some_other_db
    db.foo.find({})
    

长话短说:如果你想正确理解,请阅读这篇文章。

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

如果你想了解更多关于角色的实际工作,请阅读这里:https://docs.mongodb.com/manual/reference/built-in-roles/

  1. 启动没有访问控制的MongoDB。

    mongod --dbpath /data/db
    
  2. 连接实例。

    mongo
    
  3. 创建administrator用户。下面在__ABC0身份验证数据库中创建一个管理员用户。用户是__ABC2数据库上的dbOwner,而不是__ABC0数据库上的dbOwner,记住这一点很重要。

    use admin
    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" } ]
}
)
  1. 停止MongoDB实例,使用访问控制重新启动。

    mongod --auth --dbpath /data/db
    
  2. 作为用户管理员连接并验证admin身份验证数据库,而不是some_db身份验证数据库。管理员用户是在__ABC0认证数据库中创建的,该用户在some_db认证数据库中不存在。

    use admin
    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/

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

  1. 创建普通用户。这个用户将在下面的some_db身份验证数据库中创建。

    use some_db
    db.createUser(
    {
    user: "myNormalUser",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "some_db" },
    { role: "read", db: "some_other_db" } ]
    }
    )
    
  2. 退出mongo shell,重新连接,以用户身份验证。

    use some_db
    db.auth("myNormalUser", "xyz123")
    db.foo.insert({x:1})
    use some_other_db
    db.foo.find({})
    

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

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

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

为特定数据库创建用户和密码以确保数据库访问安全:

use dbName


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

这些步骤对我很有效:

  1. 在CMD上输入mongod—端口27017
  2. 然后连接到mongo shell: mongo—端口27017
  3. 创建用户admin: 使用管理 db.createUser ( { 用户:“myUserAdmin”, pwd:“abc123”, 角色:[{角色:"userAdminAnyDatabase", db: "admin"}] } 李)< / >
  4. 断开mongo shell
  5. 重新启动mongodb: mongod——auth——port 27017
  6. start mongo shell: mongodb——port 27017 -u "myUserAdmin" -p "abc123"——authenticationDatabase "admin"
  7. 连接后验证,将mongo shell连接到mongod: Mongo—port 27017
  8. 切换到认证数据库: 使用管理 db。auth("myUserAdmin", "abc123"
  9. . auth("myUserAdmin", "abc123"

连接mongoDB的最佳实践如下:

  1. 初始安装后,

    use admin

  2. 执行以下脚本创建admin用户

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

下面的脚本将为DB创建admin用户。

  1. 日志到db.admin使用

    mongo -u YourUserName -p YourPassword admin

  2. 登录后,重复1 ~ 3可以创建N个相同或不同的管理证书的数据库。

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

按顺序执行以下步骤

  • 该任务指导管理员通过CLI创建用户
use admin
db.createUser(
{
user: "admin",
pwd: "admin123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
  • 启用身份验证,你怎么做取决于你的操作系统,如果你使用的是windows,你可以简单地mongod --auth,如果是linux,你可以编辑/etc/mongod.conf文件来添加security.authorization : enabled,然后重新启动mongd服务
  • 通过cli mongo -u "admin" -p "admin123" --authenticationDatabase "admin"连接。就是这样

你可以查看这篇文章来了解更多细节,并学习使用猫鼬连接到它。

这是我在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

你可以改变/etc/mongod.conf

之前

#security:

security:
authorization: "enabled"

然后sudo service mongod restart

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

  1. 在终端输入mongo启动mongo shell。

  2. 使用数据库:

use admin
  1. 创建一个新用户并分配你想要的角色:
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
  1. exit mongo并将以下行添加到etc/mongod.conf中:
security:
authorization: enabled
  1. 重启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' }])

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

security:
authorization: enabled

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

  1. 没有自定义配置文件:这是前一个auth标志适用的时候。像这样启动mongod: usr/bin/mongod --auth
  2. 使用自定义配置文件:这是指后一种配置必须出现在自定义配置文件中。像这样启动mongod: usr/bin/mongod --config <config file path>

连接到mongo shell认证: mongo -u <user> -p <password> --authenticationDatabase admin < / p >

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

详细信息请参考https://docs.mongodb.com/manual/tutorial/enable-authentication/

很多重复的答案,但我认为他们忽略了一个重要的注意:

即使正确启用了身份验证,您也可以在没有用户名/密码的情况下连接到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")
}
}
}

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 service

sudo service mongod restart

这对我来说很管用。