前篇我们知道了如果bind_ip设置为0.0.0.0, 那么所有ip都可以访问, 这是一个非常非常不好的行为, 常年有黑客广撒网肆意删库勒索, 也总是有人偷懒, 不对访问ip加以限制, 总有人中招, 黑客乐了. 总之, 数据的重要性不言而喻.

ps: 如果某一天你被勒索了, 请不要支付赎金, 黑客谎称可以恢复, 其实只是骗钱, 它们100%直接删库了.

提高安全性的三种方式:

  1. 身份认证
  2. 不允许远程访问
  3. 添加ip访问限制

常用权限

权限 说明
read 允许用户读取数据库
readWrite 允许用户读写指定数据库
userAdmin 允许用户向system.users集合写入, 可以在指定数据库创建, 删除和管理用户
dbAdmin 允许用户在指定数据库中执行管理函数或访问system.profile
clusterAdmin 必须在admin数据库中定义, 赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase 必须在admin数据库中定义, 赋予用户所有数据库的读权限
readWriteAnyDatabase 必须在admin数据库中定义, 赋予用户所有数据库的读写权限
userAdminAnyDatabase 必须在admin数据库中定义, 赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 必须在admin数据库中定义, 赋予用户所有数据库的dbAdmin权限
root 必须在admin数据库中定义, 超级账号, 超级权限

查看/创建用户

1
2
3
4
5
use admin
# 查看用户
show users
# 用户信息是json格式
db.createUser(用户信息)
1
2
3
4
5
6
7
8
9
10
11
12
db.createUser(
{
user:"uaad",
pwd:"uaad",
roles:[
{
role:"userAdminAnyDatabase",
db:"admin"
}
]
}
)

添加认证

1
vim /etc/mongodb.conf

添加:

1
auth = true

启动:

1
2
mongod -f /etc/mongodb.conf 
mongo
1
2
3
> use admin
> show dbs
# 此时会提示没有权限

验证:

1
2
3
4
5
> db.auth(
"uaad",
"uaad"
)
# 用户名 + 密码

更新用户

更新角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
db.updateUser(
"uaad",
{
"roles": [
{
role: "userAdminAnyDatabase",
db: "admin"
},
{
role: "readWriteAnyDatabase",
db: "admin"
},
{
role: "dbAdminAnyDatabase",
db: "admin"
}
]
}
)
更改密码
1
2
db.changeUserPassword("用户名", "新密码");
db.updateUser("用户名", {"pwd": "新密码"})

删除用户

注意: 需要使用狙有userAdmin或userAdminDatabase或root角色的用户才可以删除其他用户

1
db.dropUser("用户名")