Mongo安全 之 鉴权
目录
引言
对于刚刚使用Mongo的开发者来说 常常都是处于"裸奔"的状态 即通过Mongo的地址和端口直接访问和操作整个Mongo
显然 这种做法非常危险并不可取 因此 本文就讨论一下Mongo的安全问题 包括
本文重点讨论Mongo安全中的鉴权 系列文章后续会继续添加
安装
在正式开始讨论鉴权问题之前 我们先搭建Mongo服务 以验证鉴权问题
安装Docker
安装Mongo有很多种方法 可以直接下载安装文件 还可以基于Docker安装
安装Docker的方法详见Docker官网 在此就不赘述了
安装加速器
由于Docker的服务器也是在国外的 so 下载速度比较慢 因此 我们有必要配置Docker国内源即加速器
安装加速器后的效果如下
mongo-auth-01.png安装�加速器后需要重启Docker才能生效
下载Mongo
使用Docker下载Mongo的方法非常简单 只需要如下一行命令即可
docker pull mongo
上述下载Mongo的Docker仓库地址: docker mongo
运行Mongo
使用Docker运行Mongo的方法同样非常简单 只需要如下一行命令
docker run --name some-mongo -p27017:27017 -d mongo --auth
上述命令参数较多 主要有以下几个
-
"--name some-mongo": 指定运行的容器名称
-
"-p27017:27017": 将容器的27017端口映射到主机的27017端口 其中前面是主机端口后面是容器端口
-
"-d": 后台运行容器
-
"mongo": 指定运行容器的镜像名称
-
"--auth": 指定运行容器的参数
其中 和Mongo相关的参数就是"--auth" 它将开启Mongo的鉴权
关于Docker中的�镜像和容器的理解 笔者有一个最简单的解释: 镜像即安装盘 容器即安装完系统运行的PC 想要了解关于更多Docker可以参考官方文档
访问控制
在开启了Mongo的鉴权之后 就可以实现访问控制了
Mongo的访问控制是基于角色(Role)的
例如 Mongo常见的内置角色有
-
read: 只能读取数据
-
readwrite: 能够读写数据
-
useradmin: 能够管理角色 但是不能操作数据
-
dbOwner: 不管能够操作数据 还能够管理角色
关于Mongo内置角色的详细介绍可以参考Built-In Roles
每一个账号都有相应的角色 通过角色的权限来实现访问权限控制
注册�超级管理员
在开启Mongo鉴权之后正式使用Mongo之前 首先需要创建超级管理员
这里的超级管理并不是root 而是指管理所有数据库用户和角色的账号
# 连接mongo
mongo
# 切换至admin数据库
use admin
# 创建超级管理员
db.createUser({user: "superadmin", pwd: "superpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }]})
超级管理员superadmin的userAdminAnyDatabase角色是指: 有权操作所有数据库的用户和角色
在Mongo终端中 可以使用"db"命令查看当前所在数据库名称
登录超级管理员
# 切换至admin数据库
use admin
# 登录超级管理员
db.auth("superadmin", "superpassword")
登录账号的方法是db.auth 如果登录和鉴权成功 返回1 否则登录和鉴权失败
另外 如果已经退出mongo还可以再重新建立连接时直接登录超级管理员
mongo -u "superadmin" -p "superpassword" --authenticationDatabase "admin"
注册数据库管理员
创建了超级管理员后 我们再来创建数据库管理员 这个管理员只能对指定数据库的数据进行读写
# 切换至auth数据库 如果没有该数据库则新建
use auth
# 注册有权读写auth数据库数据的管理员authadmin
db.createUser({user: "authadmin", pwd: "authpassword", roles: [{ role: "readWrite", db: "auth" }]})
为了验证注册是否成功 我们还可以使用superadmin账号来查询
# 切换至admin数据库
use admin
# 登录超级管理员
db.auth("superadmin", "superpassword")
# 查询所有账号
db.system.users.find()
从上述查询账号的例子中 我们需要注意的是
Mongo访问控制详细限制了每一个角色能够访问的范围: 包括数据库 以及到底是能够操作用户还是用户
因此在进行操作的时候 需要切换到相应的数据库并通过鉴权
登录数据库管理员
创建了数据库管理员后 首先登录该账号
# 切换至auth数据库
use auth
# 登录auth数据库管理员
db.auth("authadmin", "authpassword")
登录和鉴权成功后 就可以操作数据库的数据了
# 创建collection "users"
db.createCollection("users")
# 向collection "users"插入数据
db.users.insert({"email": "test@test.com", "password": "password"})
# 从collection "users"查询数据
db.users.find()
小结
作为Mongo安全的第一步 也是最基础的一步 开启Mongo的鉴权是非常必要的 虽然 这只是Mongo安全"万里长征"的一小步
后续笔者还会分享更多关于Mongo安全的注意事项 也欢迎读者能够分享对Mongo安全的认识 大家一起讨论和完善
参考
更多文章, 请支持我的个人博客