mongoDB程序员

Mongo安全 之 鉴权

2017-06-01  本文已影响119人  诺之林

目录

引言

对于刚刚使用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

上述命令参数较多 主要有以下几个

其中 和Mongo相关的参数就是"--auth" 它将开启Mongo的鉴权

关于Docker中的�镜像和容器的理解 笔者有一个最简单的解释: 镜像即安装盘 容器即安装完系统运行的PC 想要了解关于更多Docker可以参考官方文档

访问控制

在开启了Mongo的鉴权之后 就可以实现访问控制了

Mongo的访问控制是基于角色(Role)的

例如 Mongo常见的内置角色有

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

参考

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

上一篇 下一篇

猜你喜欢

热点阅读