美文网首页mongoDB程序员
Mongo安全 之 鉴权

Mongo安全 之 鉴权

作者: 诺之林 | 来源:发表于2017-06-01 15:44 被阅读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

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

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

参考

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

相关文章

  • Mongo安全 之 鉴权

    目录 引言 安装安装Docker安装加速器下载Mongo运行Mongo 访问控制注册�超级管理员登录超级管理员注册...

  • Kubernetes 安全框架

    Kubernetes 安全框架 鉴权(Authentication) 授权(Authentication) 准入控...

  • 谈谈鉴权与授权

    目录 鉴权场景实现 授权场景实现 鉴权 鉴权(authentication): 你是谁 场景 实现 关于鉴权的示例...

  • 常见的鉴权方式,你真的不想知道吗

    主要内容 鉴权的作用 几种常见的鉴权 各个鉴权的适用场景 一、什么是鉴权 鉴权是指验证用户是否有权利访问系统的行为...

  • 云调用,小程序鉴权-方案

    目录:一、无处不在的鉴权 现实生活中的身份鉴权方法 简单的密码鉴权体系二、鉴权优化 频繁的鉴权场景下的优化方案 第...

  • 鉴权与Web安全

    什么是鉴权 鉴权(authentication)是指验证用户是否拥有访问系统的权利。传统的鉴权是通过密码来验证的。...

  • Mongo安全 之 SSL

    目录 引言 安装安装Mongo运行Mongo 普通连接 SSL连接制作证书更新配置下载证书连接数据库 小结 引言 ...

  • JWT鉴权 Session鉴权

    JWT鉴权:image.png session鉴权:image.png

  • mongo(十八:安全架构)

    MongoBD安全架构:认证鉴权审计加密 MongoDB 用户认证方式 MongoDB 集群节点认证 传输加密 落...

  • 04-15动态路由的实现与优化

    Vue中后台鉴权的另一种思路 - 动态路由的实现与优化 鉴权-前端路由 VS 鉴权-动态路由 前端路由鉴权相信只要...

网友评论

    本文标题:Mongo安全 之 鉴权

    本文链接:https://www.haomeiwen.com/subject/lcdefxtx.html