Mongodb默认是不开启认证的,对于数据库来说,这有很大的安全隐患,下面记录下生产中Mongodb权限认证的方法。
一,环境
阿里云:CentOS Linux release 7.4.1708 (Core)
Mongodb版本: 3.6.2
二,添加超级用户
Mongodb的权限认证是基于数据库的,要想创建普通用户,必须要通过管理员来操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| > use admin > db.createUser( { user: "root", pwd: "123456", roles: [ { role: "root", db: "admin" } ] } ) #结果如下 Successfully added user: { "user" : "root", "roles" : [ { "role" : "root", "db" : "admin" } ] }
|
查看用户
1 2 3 4 5 6 7 8 9 10 11 12
| > show users { "_id" : "admin.root", "user" : "root", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ] }
|
三,添加普通用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| > user db1 # 为db1库创建用户 > db.createUser( { user: "test", pwd: "123456", roles: [ { role: "readWrite", db: "test" }], } ) #执行结果 Successfully added user: { "user" : "test", "roles" : [ { "role" : "readWrite", "db" : "test" },] }
|
四,配置Mongodb开启验证
两种方式,一种是mongodb启动时加入–auth参数,另一种是修改配置文件。这里采用修改配置文件的方式。
vi mongo.conf
1 2 3 4 5 6 7 8 9
| logpath=/mnt/mongodb/logs/mongodb.log logappend=false dbpath=/mnt/mongodb/data/db fork=true # Enable the HTTP interface (Defaults to port 28017). #httpinterface=true bind_ip=192.168.1.54 port=27017 auth=true #添加auth配置
|
重启mongodb:
1 2
| ps -ef | grep -v grep | grep mongo | awk '{print $2}' | xargs kill -HUP mongod -f /opt/mongodb/etc/mongo.conf
|
这时再用默认方式登录Mongodb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| mongo MongoDB shell version v3.6.2 connecting to: mongodb://192.168.1.54:27017/test MongoDB server version: 3.6.2 > show dbs 2018-03-02T11:55:38.884+0800 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0, $db: \"admin\" }", "code" : 13, "codeName" : "Unauthorized" } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1 shellHelper.show@src/mongo/shell/utils.js:813:19 shellHelper@src/mongo/shell/utils.js:703:15 @(shellhelp2):1:1 >
|
会提示没有权限操作。这时需要auth方法去认证。
1 2 3 4
| > use admin switched to db admin > db.auth('root', '123456') 1
|
返回1说明认证通过。同理,认证test则需要进入test数据库中,再执行auth方法
1 2 3 4
| > use test switched to db test > db.auth('test', '123456') 1
|
当然也可以在mongo客户端连接时指定用户名密码,如下:
1
| mongo -u test -p 123456 --authenticationDatabase test
|
参数比较简单,这里就不做说明了。
最后,介绍下Mongodb中角色的定义:
角色说明:
1 2 3 4 5 6 7 8 9 10
| read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限 readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限 userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 root:只在admin数据库中可用。超级账号,超级权限
|
Mongodb官方关于角色的定义:https://docs.mongodb.com/manual/core/security-built-in-roles/