认识权限管理,说明主要概念及关系
与大多数数据库一样,Mongodb同样提供了一套权限管理机制。
为了体验Mongodb 的权限管理,我们找一台已经安装好的Mongodb,可以参见这里搭建一个单节点的Mongodb。
直接打开mongo shell:
尝试执行stats命令以查看appdb数据库的状态:
此时的提示正是说明你当前的操作没有获得许可,使用appdb预创建的用户进行鉴权:
可以发现,在通过验明身份之后,stats操作的鉴权获得了许可。
上述案例非常浅显,目的在于抛砖引玉,说明数据库鉴权是如何发生作用,接下来开始进入概念,这个叫基于角色的权限控制
[图-角色权限控制]
先解释下图中的几个实体:
权限定义了对某些资源的某些操作,角色则可以拥有多个权限; 用户User可以被赋予多个角色,从而获得这些角色所拥有的权限以操作某些资源。
对于Mongodb来说,只要开启鉴权,所有的DB访问操作都需要通过权限检查。而大致的操作流程跟下图类似
[图-mongo鉴权]
1. Mongodb 的用户归属于某个数据库,用户需要在所属的数据库中进行鉴权;
2. 一旦通过鉴权,当前的会话(连接)中所有操作将按照用户被赋予的角色权限执行检查。
阐述Mongodb支持的几种鉴权方式
鉴权方式是指Mongodb如何识别接入用户,如何检查权限是否合法的一系列校验机制。
SCRAM-SHA-1 是当前推荐使用的鉴权方式,既然如此,有必要上图继续解释:
步骤解读
1. 客户端发起一个SCRAM鉴权请求; 鉴权参数中带上用户名、客户端随机字符串(防止重放攻击);
2. 服务端发出一个挑战响应; 服务侧先检查用户名,通过后生成一个salt因子、迭代数、合并字符串(包含客户端随机串和服务端随机串)
3. 客户端响应一个proof(证明数据)和合并字符串; 响应的 proof数据根据服务所给的随机参数以及客户端密钥生成,是一个客户端签名与密钥异或计算后的结果;
4. 服务端将存储的密钥结合随机参数,使用同样的算法生成签名并校验客户端 proof数据; 若校验通过,服务端采用类似方式发送自己的签名;
5. 客户端校验服务端签名数据。 可以看到,SCRAM鉴权时也类似SSL/TLS 的握手过程,但相比之下简单许多,同时在性能方面也要具备优势;
然后我们看看安全性部分:
另外SCRAM-SHA-1 相比MONGODB-CR的优势还有:
副本集、分片集群内鉴权方式
内部鉴权是指 Mongo集群内部节点之间进行访问的鉴权方式,比如副本集内主备之间的访问、分片集群内Mongos 与Mongod之间的访问。
内部鉴权目前支持两种方式:
1. KeyFiles
密钥文件方式,采用SCAM-SHA-1 的鉴权机制,文件内包含了一个共享密钥,由集群内所有成员共同持有。 通常,密钥的长度在6-1024字符内,采用Base64编码。
2. X.509 证书
证书鉴权,用于SSL/TLS加密连接通道。
针对Mongodb数据库中的各种角色进行说明
数据库访问
角色名称 | 拥有权限 |
---|---|
read | 允许读取指定数据库的角色 |
readWrite | 允许读写指定数据库的角色 |
数据库管理
角色名称 | 拥有权限 |
---|---|
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
userAdmin | 允许管理当前数据库的用户,如创建用户、为用户授权 |
dbOwner | 数据库拥有者(最高),集合了dbAdmin/userAdmin/readWrite角色权限 |
集群管理
角色名称 | 拥有权限 |
---|---|
clusterAdmin | 集群最高管理员,集合clusterManager/clusterMonitor/hostManager角色权限 |
clusterManager | 集群管理角色,允许对分片和副本集集群执行管理操作,如addShard,resync等 |
clusterMonitor | 集群监控角色,允许对分片和副本集集群进行监控,如查看serverStatus |
hostManager | 节点管理角色,允许监控和管理节点,比如killOp、shutdown操作 |
备份恢复
角色名称 | 拥有权限 |
---|---|
backup | 备份权限,允许执行mongodump操作 |
restore | 恢复权限,允许执行mongoresotre操作 |
数据库通用角色
角色名称 | 拥有权限 |
---|---|
readAnyDatabase | 允许读取所有数据库 |
readWriteAnyDatabase | 允许读写所有数据库 |
userAdminAnyDatabase | 允许管理所有数据库的用户 |
dbAdminAnyDatabase | 允许管理所有数据库 |
特殊角色
角色名称 | 拥有权限 |
---|---|
root | 超级管理员,拥有所有权限 |
__system | 内部角色,用于集群间节点通讯 |
基本是这些,有兴趣可看看官方的内置角色。
Mongodb 的用户及角色数据一般位于当前实例的 admin数据库,system.users存放了所有数据;
存在例外的情况是分片集群,应用接入mongos节点,鉴权数据则存放于config节点。因此有时候为了方便分片集群管理,会单独为分片内部节点创建独立的管理操作用户。
简单列举用户权限相关的常用操作
授权启动
./bin/mongod --auth
默认为非授权启动
也可以通过security.authorization配置指定
创建管理员用户
创建用户
授予权限
删除权限
原因:当前连接未鉴权或用户没有操作权限 解决:为用户分配适当权限,并执行auth操作,如下:
db.eval( ) 是一个全局操作,可执行任意数据库脚本;
执行该命令需要拥有anyAction或anyResource的权限,通常不建议为数据库用户赋予这样的权限。
该命令存在安全风险,已不建议使用(mongodb 3.0之后已经过期)。
作者简介:
zale 唐卓章,华为技术专家,多年互联网研发/架设经验,关注NOSQL中间件高可用及弹性扩展,在分布式系统架构性能优化有丰富的实践经验,目前从事物联网平台研发工作,致力于打造大容量高可用的物联网服务。
本文分享自 Mongoing中文社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!