淘宝店标,动漫剧场版,尼克斯直播
前言
本文主要给大家介绍了mongodb认证鉴权的一些相关内容,通过设置认证鉴权会对大家的mongodb安全进一步的保障,下面话不多说了,来一起看看详细的介绍吧。
一、mongodb 的权限管理
认识权限管理,说明主要概念及关系
与大多数数据库一样,mongodb同样提供了一套权限管理机制。 为了体验mongodb 的权限管理,我们找一台已经安装好的mongodb,可以搭建一个单节点的mongodb。
直接打开mongo shell:
./bin/mongo --port=27017
尝试执行stats命令以查看appdb数据库的状态:
mongodb enterprise > use appdb mongodb enterprise > db.stats() { "ok" : 0, "errmsg" : "not authorized on nscl to execute command { dbstats: 1.0, scale: undefined }", "code" : 13 }
此时的提示正是说明你当前的操作没有获得许可,使用appdb预创建的用户进行鉴权:
> db.auth('appuser','yourpassword') 1 > db.stats() { "db" : "appdb", "collections" : 0, "views" : 0, "objects" : 0, "avgobjsize" : 0, "datasize" : 0, "storagesize" : 0, "numextents" : 0, "indexes" : 0, "indexsize" : 0, "filesize" : 0, "ok" : 1 }
可以发现,在通过验明身份之后,stats操作的鉴权获得了许可。
以上例子可能让你对数据库鉴权有了点浅显认识,那么接下来开始说点概念了,大致是叫基于角色的权限控制
[图-角色权限控制]
先解释下图中的几个实体:
噢,关于图的简单解释: 权限定义了对某些资源的某些操作,角色则可以拥有多个权限; 用户user可以被赋予多个角色,从而获得这些角色所拥有的权限以操作某些资源。
对于mongodb来说,只要开启鉴权,所有的db访问操作都需要通过权限检查。而大致的操作流程跟下图类似
[图-mongo鉴权]
mongodb 的用户归属于某个数据库,用户需要在所属的数据库中进行鉴权;
一旦通过鉴权,当前的会话(连接)中所有操作将按照用户被赋予的角色权限执行检查。
二、鉴权方式
阐述mongodb支持的几种鉴权方式 鉴权方式是指mongodb如何识别接入用户,如何检查权限是否合法的一系列校验机制。
scram-sha-1 是当前推荐使用的鉴权方式,既然如此,有必要上图继续解释:
步骤解读
可以看到,scram鉴权时也类似ssl/tls 的握手过程,但相比之下简单许多,同时在性能方面也要具备优势; 然后我们看看安全性的部分:
另外scram-sha-1 相比mongodb-cr的优势还有:
a tunable work factor (iterationcount), 可灵活调整的安全系数 per-user random salts rather than server-wide salts 每个用户有独立的随机系数 a cryptographically stronger hash function (sha-1 rather than md5), 更安全的hash函数 authentication of the server to the client as well as the client to the server. 支持双向认证
对 scram-sha-1的实现感兴趣?
三、内部鉴权
副本集、分片集群内鉴权方式
内部鉴权是指 mongo集群内部节点之间进行访问的鉴权方式,比如副本集内主备之间的访问、分片集群内mongos 与mongod之间的访问。 内部鉴权目前支持两种方式:
四、数据库角色
针对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
默认为非授权启动 也可以通过配置指定
创建管理员用户
use admin db.createuser({ user:'admin',pwd:'admin@2016',roles:[ {role:'clusteradmin',db:'admin'}, {role:'useradminanydatabase',db:'admin'} ]})
创建用户
use appdb db.createuser({user:'appuser',pwd:'appuser@2016'})
授予权限
use appdb db.grantrolestouser("appuser", [{role:'readwrite',db:'appdb'}])
删除权限
use appdb db.revokerolesfromuser("appuser",[{ role: "read", db: "appdb" }])
六、常见问题
shell 操作提示错误
use appdb mongodb enterprise > db.stats() { "ok" : 0, "errmsg" : "not authorized on appdb to execute command { dbstats: 1.0, scale: undefined }", "code" : 13 }
原因:当前连接未鉴权或用户没有操作权限 解决:为用户分配适当权限,并执行auth操作,如下:
db.auth('appuser','yourpassword');
无法执行 eval 操作
是一个全局操作,可执行任意数据库脚本; 执行该命令需要拥有anyaction或anyresource的权限,通常不建议为数据库用户赋予这样的权限。 该命令存在安全风险,已不建议使用(mongodb 3.0之后已经过期)。
总结
以上就是这篇文章的全部内容了,本文还有许多不足,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。
扩展阅读
mongodb 鉴权机制
mongodb 内置角色介绍
mongodb 权限操作介绍
运维-mongodb鉴权介绍
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
理解Redis持久化,RDB持久化和AOF持久化的不同处理方式
Redis 两类持久化方式,快照和全量追加日志的不同处理方式
网友评论