共计 4137 个字符,预计需要花费 11 分钟才能阅读完成。
mongodb 集群的权限管理分为两部分,一部分是最常用的 Role-Based Access Control,也就是用户名密码方式,这种验证方式一般出现在单机系统,或者集群中 client 端连接 Mongos 端;另一种是Internal Authentication. 有英文基础想获取 security 完整信息的请点击访问 官方文档。
1、Role-Based Access Control
官方文档上介绍如下:MongoDB 采用基于角色的访问控制(RBAC)来管理对 MongoDB 系统的访问。授予用户一个或多个角色,以确定用户对数据库资源和操作的访问。在角色分配之外,用户无法访问系统。(不得不说。。google 翻译做的不错,这一段翻出来竟然毫无违和感)。
RBAC 通过角色来赋予用户权限,在开启权限管理之前,个人建议先创建几个用户,至少要有一个拥有用户管理权限的角色存在。在 mongodb 中,系统自带了若干角色:
库使用权限:read, readWrite
库管理权限:dbAdmin, dbOwner, userAdmin
集群管理权限:clusterAdmin, clusterManager, clusterMonitor, hostManager
备份恢复权限:backup, restore
全局权限:readAnyDatabase, readWriteAnyDatabase, userAdminAnyDatabase, dbAdminAnyDatabase
超级用户:root,__system(包含所有权限官方不建议使用)
对于使用来讲,建议首先创建一个包含全局权限的用户(dbAdmin 并不能 readwrite),这样在启用权限管理之后便可以通过这个用户来创建其他用户。Mongodb 权限管理默认是精确到 DB 的,如果需要区分一个 DB 下的不同 collection 的权限需要自定义 role。对用户赋予库使用和库管理权限的时候需要指定库,这样用户会获得此库下的对应权限。对 mongodb 来讲,在哪个库下创建的用户,就需要每次在创建的库进行认证。所以建议在创建用户的时候,库使用用户和库管理用户在指定库下创建用户。
2、Internal Authentication
这个东西是用来在集群中进行互相认证的,每个 Mongo 实例在互相访问的过程中会验证彼此的权限,只有满足条件才可以进行数据读写等操作。分为两种方式,一种是 Keyfiles,一种是 x.509,在普通集群中 Keyfiles 已经足够了,而且相对比较简单,只需要在每个节点启动的时候指定相同的 Keyfile 就行。x.509 提供了一个 SSL/TLS 连接,并不常用。
3、开启验证
首先登录单机 Mongod 或者集群的 mongos 创建一个有权限的用户:
use admin
db.createUser({... user: "gaoze",
... pwd: "gaolaoban",
... roles: [... {role: "clusterAdmin", db: "admin"},
... {role: "readWriteAnyDatabase", db: "admin"},
... {role: "userAdminAnyDatabase", db: "admin"},
... {role: "dbAdminAnyDatabase", db: "admin"}]
... })
我们这个帐号创建在 admin 库下,用户拥有所有库的读写权限和 admin 权限,还有用户管理权限及集群管理权限,如果是单机系统可以把 clusterAdmin 那个删掉。
然后开启认证:
RBAC 的认证开启比较简单,如果是单机系统启动的时候加上 –auth 参数即可,如果是集群的话,在 Mongos 的配置里加上 keyfile 文件,Mongos 会自动启动认证。
Internal Authentication 认证需要创建一个 keyfile 文件,keyfile 文件只能包含 base64 字符集的字符,位数可以为 6 到 1024 位,官方文档给出的创建方式如下:
openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>
如果不好用可以自己随便找一段文字,转成 base64 字符集,然后用下面操作生成 keyfile 文件,记得赋予 400 或者 600 权限,否则在启动的时候会报错 keyfile too open permissions
touch keyfile
echo "keyfile 内容" > keyfile
创建完 keyfile 文件然后把这个文件分发到每台 mongodb 的机器上,然后修改配置文件(具体参见上篇构建集群的配置说明):
shard 节点:
systemLog:
destination: file
path: "/home/gaoze/platform/logs/mongodb/shardsvr.log"
logAppend: true
storage:
dbPath: "/home/gaoze/platform/data/shardData"
journal:
enabled: true
setParameter:
enableLocalhostAuthBypass: 0
processManagement:
fork: true
replication:
replSetName: "shardsvr1"
sharding:
clusterRole: "shardsvr"
security:
keyFile: "/home/gaoze/platform/mongodb-3.4.5/keyfile0"
authorization: enabled
config 节点:
systemLog:
destination: file
path: "/home/gaoze/platform/logs/mongodb/configsvr.log"
logAppend: true
storage:
dbPath: "/home/gaoze/platform/data/configData"
journal:
enabled: true
setParameter:
enableLocalhostAuthBypass: 0
processManagement:
fork: true
replication:
replSetName: "configsvr0"
sharding:
clusterRole: "configsvr"
security:
keyFile: "/home/gaoze/platform/mongodb-3.4.5/keyfile0"
authorization: enabled
mongos(可以看到,mongos 不必指定 security.authorization):
systemLog:
destination: file
path: "/home/gaoze/platform/logs/mongodb/mongos.log"
logAppend: true
net:
bindIp: 192.168.2.48
port: 27017
setParameter:
enableLocalhostAuthBypass: 0
processManagement:
fork: true
sharding:
configDB: "configsvr0/192.168.2.48:27019,192.168.2.49:27019"
security:
keyFile: "/home/cloud/platform/mongodb-3.4.5/keyfile0"
4、验证下的集群使用
shell 登录进去需要进行验证才可以使用集群,简而言之就是:
use admin
db.auth("gaoze", "gaolaoban")
我们在其他库上创建个使用者(在目标库上创建用户!):
use test
db.createUser({user: "rw", pwd: "1", roles: [{role: "readWrite", db: "test"}]})
然后我们在 test 库上使用新用户来进行操作:
use test
db.auth("rw", "1")
可以试验我们的新用户是可以读写的。
更多 MongoDB 相关教程见以下内容:
MongoDB 文档、集合、数据库简介 http://www.linuxidc.com/Linux/2016-12/138529.htm
MongoDB 3 分片部署及故障模拟验证 http://www.linuxidc.com/Linux/2016-12/138529.htm
Linux CentOS 6.5 yum 安装 MongoDB http://www.linuxidc.com/Linux/2016-12/137790.htm
CentOS 7 yum 方式快速安装 MongoDB http://www.linuxidc.com/Linux/2016-11/137679.htm
MongoDB 的查询操作 http://www.linuxidc.com/Linux/2016-10/136581.htm
在 Azure 虚拟机上快速搭建 MongoDB 集群 http://www.linuxidc.com/Linux/2017-09/146778.htm
MongoDB 复制集原理 http://www.linuxidc.com/Linux/2017-09/146670.htm
MongoDB 3.4 远程连接认证失败 http://www.linuxidc.com/Linux/2017-06/145070.htm
Ubuntu 16.04 中安装 MongoDB3.4 数据库系统 http://www.linuxidc.com/Linux/2017-07/145526.htm
MongoDB 权威指南第 2 版 PDF 完整带书签目录 下载见 http://www.linuxidc.com/Linux/2016-12/138253.htm
MongoDB 的详细介绍:请点这里
MongoDB 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149537.htm