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

时间:2011-02-02 23:35:52

标签: authentication 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的工作方式相同。

18 个答案:

答案 0 :(得分:102)

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

来自MongoDB网站:

  

使用--auth选项运行数据库(mongod进程)以启用   安全。您必须先将用户添加到admin db   使用--auth启动服务器,或添加第一个用户   localhost接口。

MongoDB Authentication

答案 1 :(得分:59)

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

然后,重启mongodb:sudo service mongod restart

答案 2 :(得分:59)

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

这是 v3.4

简短回答。

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

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)创建用户管理员。 以下内容在admin身份验证数据库中创建用户管理员。用户是dbOwner数据库上的some_db而不是admin数据库,这一点非常重要。

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" } ]
  }
)

4)停止MongoDB实例并使用访问控制再次启动它。

mongod --auth --dbpath /data/db

5)以admin身份验证数据库的用户管理员身份进行身份验证,而不是some_db身份验证数据库。 用户管理员是在admin身份验证数据库中创建的,some_db身份验证数据库中不存在该用户。

use admin
db.auth("myDbOwner", "abc123")

您现在已通过dbOwner数据库身份验证为some_db。所以现在如果您希望直接读取/写入/执行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/

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

6)创建普通用户。 此用户将在下面的some_db身份验证数据库中创建。

use some_db
db.createUser(
  {
    user: "myNormalUser",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "some_db" },
             { role: "read", db: "some_other_db" } ]
  }
)

7)退出mongo shell,重新连接,以用户身份进行身份验证。

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

答案 3 :(得分:42)

这个答案适用于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

答案 4 :(得分:26)

以下是添加用户的JavaScript代码。

  1. 使用mongod

  2. 开始--auth = true
  3. 从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 ");
    
  4. 现在用户添加完成,我们可以验证从mongo shell访问数据库

答案 5 :(得分:11)

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

编辑mongo设置文件;

sudo nano /etc/mongod.conf

添加以下行:

security.authorization : enabled

重启服务

sudo service mongod restart

此致

答案 6 :(得分:7)

首先使用

在终端上运行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/

答案 7 :(得分:3)

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

use dbName

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

答案 8 :(得分:3)

您可以更改/etc/mongod.conf

之前

#security:

之后

security:
    authorization: "enabled"

然后sudo service mongod restart

答案 9 :(得分:3)

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

use mydatabase

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

答案 10 :(得分:2)

这些步骤对我有用:

  1. 在cmd上写mongod --port 27017
  2. 然后连接到mongo shell:mongo --port 27017
  3. 创建用户admin: 使用管理员 db.createUser( { 用户:" myUserAdmin", pwd:" abc123", 角色:[{role:" userAdminAnyDatabase",db:" admin" }] } )
  4. 断开mongo shell
  5. 重启mongodb:mongod --auth --port 27017
  6. 启动mongo shell: mongo --port 27017 -u" myUserAdmin" -p" abc123" --authenticationDatabase" admin"
  7. 要在连接后进行身份验证,请将mongo shell连接到mongod: mongo --port 27017
  8. 切换到身份验证数据库: 使用管理员 db.auth(" myUserAdmin"," abc123"

答案 11 :(得分:2)

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

security:
  authorization: enabled

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

  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

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

详情请参阅https://h50146.www5.hpe.com/products/software/oe/linux/mainstream/support/whitepaper/pdfs/a00039147enw.pdf

答案 12 :(得分:1)

连接到mongoDB的最佳做法如下:

  1. 初始安装后,

    use admin

  2. 然后运行以下脚本来创建管理员用户

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

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

  1. 使用

    登录db.admin

    mongo -u YourUserName -p YourPassword admin

  2. 登录后,通过重复1到3,您可以创建N个具有相同管理员凭证或不同管理员凭证的数据库。

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

答案 13 :(得分:1)

按顺序执行以下步骤

  • 使用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"连接。就这样

您可以查看this post来了解更多详细信息,并学习如何使用猫鼬进行连接。

答案 14 :(得分:1)

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

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

这是我为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. 退出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' }])

答案 17 :(得分:0)

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

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