0%

Mongodb之权限认证管理

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/