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安全的认识 大家一起讨论和完善

参考

更多文章, 请支持我的个人博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容