MongoDB 默认直接连接,无须身份验证,如果当前机器可以公网访问,且不注意 Mongodb 端口(默认 27017
)的开放状态,那么 Mongodb 就会产生安全风险,被利用此配置漏洞,入侵数据库。
创建管理账号密码
现在需要创建一个帐号,该账号需要有 grant
权限,即:账号管理的授权权限。 注意一点 ,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)。
> use admin
switched to db admin
> db.createUser(
... {
... user: "dba",
... pwd: "dba",
... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
... }
... )
Successfully added user: {
"user" : "dba",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
user:用户名
pwd:密码
roles :指定用户的角色,可以用一个空数组给新用户设定空角色;在 roles 字段,可以指定内置角色和用户定义的角色。roles 角色有:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile
userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
Mongodb 用户验证登陆
启动带访问控制的 Mongodb
#新建终端
mongod --auth --port 27017 --dbpath /data/db1
现在有两种方式进行用户身份的验证
第一种 (类似 MySql)
客户端连接时,指定用户名,密码,db 名称。
mongo --port 27017 -u "adminUser" -p "adminPass" --authenticationDatabase "admin"
第二种
客户端连接后,再进行验证
mongo --port 27017
use admin
db.auth("adminUser", "adminPass")
// 输出 1 表示验证成功
创建普通用户
过程类似创建管理员账户,只是 role 有所不同。
use foo
db.createUser(
{
user: "simpleUser",
pwd: "simplePass",
roles: [ { role: "readWrite", db: "foo" },
{ role: "read", db: "bar" } ]
}
)
现在我们有了一个普通用户
用户名:simpleUser
密码:simplePass
权限:读写数据库 foo
, 只读数据库 bar
。
URI 形式的访问(DSN)
生产中常用 URI 形式对数据库进行连接
mongodb://ip:27017/foo
添加用户名密码验证
mongodb://simpleUser:simplePass@ip:27017/foo