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