MongoDB用户管理简单上手

MongoDB的用户管理非常复杂,下面记录从新建数据库实例到可以安全使用的中间步骤。

管理员账户配置

  • MongoDB安装好后第一次进入是不需要密码的,也没有任何用户。
  • 在数据库中创建的第一个用户应该是具有管理其他用户的权限的用户管理员。 
  • admin数据库用来管理管理员账户,拥有admin数据库权限的账户同时拥有所有数据库的读写权限,所以在admin数据库中创建root账户,之后再通过–auth开启数据库验证,就可以避免其他人非法访问数据库。
  • MongoDB数据库启动时即使添加了–auth参数,但是admin数据库中admin、system、users用户都未添加时,不进行任何认证就可以做任何操作(不管是否是以–auth 参数启动),直到在admin、system、users中添加了一个用户后,MongoDB数据库的认证和授权才生效。

非docker:

mongo
use admin
db.createUser(
  {
    user: "root",
    pwd: "rootpwd",
    roles: [ { role: "root", db: "admin" } ]
  }
)
db.adminCommand( { shutdown: 1 } )
关闭shell
mongod --auth

docker:

docker run --name my-mongo --restart=always -v $(pwd)/data:/data/db -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=rootpwd -d mongo

docker环境中只要有MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD这两个环境变量,并且当前目录是空的不存在已有的数据库,那么就会自动以mongod –auth模式启动

如果要为docker中的已存在($(pwd)/data目录不为空)的未配置管理员账户的数据库添加管理员账户,需要先进入命令行,再按照非docker中的方法配置管理员账户,之后再用docker命令启动数据库的时候,就可以加上MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD这两个环境变量了

docker exec -it my-mongo /bin/sh
mongo
use admin
db.createUser(
  {
    user: "root",
    pwd: "rootpwd",
    roles: [ { role: "root", db: "admin" } ]
  }
)
docker stop my-mongo
docker rm my-mongo
docker run --name my-mongo --restart=always -v $(pwd)/data:/data/db -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=rootpwd -d mongo

之后便可以以root身份登录

非docker:

mongo -u root -p rootpwd admin

docker:

docker exec -it my-mongo /bin/sh
mongo -u root -p rootpwd admin

创建应用数据库,并分配应用数据库的用户

use app
db.createUser(
  {
    user: "owner",
    pwd: "ownerpwd",
    roles: [ { role: "dbOwner", db: "sensor" } ]
  }
)

之后便可以以owner身份登录app数据库

非docker:

mongo -u owner -p ownerpwd app

docker:

docker exec -it my-mongo /bin/sh
mongo -u owner -p ownerpwd app

之后的连接uri为:

mongodb://owner:ownerpwd@localhost:27017/app

附录

各种角色:

角色介绍
read提供读取所有非系统的集合(数据库)
readWrite提供读写所有非系统的集合(数据库)和读取所有角色的所有权限
dbAdmin提供执行管理任务的功能,例如与架构相关的任务,索引编制,收集统计信息。此角色不授予用户和角色管理权限。
dbOwner提供对数据库执行任何管理操作的功能。此角色组合了readWrite,dbAdmin和userAdmin角色授予的权限。
userAdmin提供在当前数据库上创建和修改角色和用户的功能。由于userAdmin角色允许用户向任何用户(包括他们自己)授予任何权限,因此该角色还间接提供对数据库的超级用户访问权限,或者,如果作用于管理数据库,则提供对群集的访问权限。
clusterAdmin提供最佳的集群管理访问。此角色组合了clusterManager,clusterMonitor和hostManager角色授予的权限。此外,该角色还提供了dropDatabase操作。
readAnyDatabase仅在admin 数据库中使用,提供所有数据库的读权限。
readWriteAnyDatabase仅在admin 数据库中使用,提供所有数据库的读写权限
userAdminAnyDatabase仅在admin 数据库中使用,提供与userAdmin相同的用户管理操作访问权限,允许用户向任何用户(包括他们自己)授予任何权限,因此该角色还间接提供超级用户访问权限。
dbAdminAnyDatabase仅在admin 数据库中使用,提供与dbAdmin相同的数据库管理操作访问权限,该角色还在整个群集上提供listDatabases操作。
root仅在admin 数据库中使用,提供超级权限

参考文献:

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

https://docs.mongodb.com/manual/reference/program/mongod/#cmdoption-mongod-auth

https://hub.docker.com/_/mongo?tab=description&page=1

https://www.runoob.com/mongodb/mongodb-connections.html

https://www.cnblogs.com/sz-wenbin/p/11010403.html

https://blog.csdn.net/xiaoxiangzi520/article/details/81094378

https://www.cnblogs.com/yzrw/p/8286696.html

https://www.cnblogs.com/keme/p/11004955.html#81-%E6%8E%88%E6%9D%83%E4%BB%8B%E7%BB%8D

Share

You may also like...

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注