资讯专栏INFORMATION COLUMN

Mongodb的认证及权限管理

IT那活儿 / 3248人阅读
Mongodb的认证及权限管理

对于各种数据库软件,启用认证的方法都不同,比如PG是在pg_hba.conf中对用户设置使用启用密码认证,而Oracle远程登录均需要使用密码认证。Mongodb是在参数中控制是否启用密码认证,并且启用后,对所有用户生效,并不能像PG一样对用户区别对待。需要启用认证,使用mongod --auth或者在参数文件中加入authorization: enabled。mongodb的认证分为用户验证(client auth)和集群间认证(internal auth),在复制集中启用认证需指定keyFile参数,指定后即默认启用了用户验证。

从3.0开始,mongodb默认采用SCRAM加密算法,在3.0以前默认使用MongoDB-CR算法,所以如果数据库是从2.X版本升级上来的数据库,可能出现认证机制不兼容导致客户端无法连接数据库的情况。另外mongodb还支持x.509算法,主要用于加密连接中,本人也未使用过,此处不做探讨。


一. 用户创建及管理

在Mongodb中的用户是基于数据库的,不同数据库中可以存在同名用户,所以在登录数据库的时候,需要指定mongo --authenticationDatabase=XX 参数选择认证数据库。在生产中,为了规范和便于管理,我们建议将所有用户都创建在admin库中。需要注意的是Mongodb默认是没有创建任何内置用户的,所以在数据库实例启用认证前,需要先创建一个超管账号,然后再重启实例启用认证。

——用户创建

use admin
db.createUser({user:"fhtest", pwd:"Ba@31^T2cy",roles:[{role:"read",db:"production"}]});
{role:"read",db:"production"},

表示在production库有read角色,可以看到roles值是一个数组,所以可以具有多个库的多种角色或者一个库的多种角色

——用户授权

db.grantRolesToUser( "ticket" , [ { role: "dbOwner", db: "pc_ticket" },{ role: "dbOwner", db: "pc_payment" } ]) ;

——权限回收

db.revokeRolesFromUser( "ticket", [{role:"clusterMonitor",db:"admin"}] );

——用户查询

db.getUsers();


二.  角色管理

从上面用户管理的命令可以看到,不管是授权还是回收权限,都是基于角色的,Mongodb不能直接将某个集合或者数据库的操作权限授予用户,只能通过role来进行授权,role可以是系统内置的,也可以是用户自定义的。

内置角色包括root、dbOwner、clusterAdmin、read、readWrite等,root角色相当于PG的superuser超管权限。在生产环境中,会有给用户授予所有数据库读权限的需求,类似oracle的select any table ,Mongodb中具有all database role,如readAnyDatabase、readWriteAnyDatabase等 ,详细内置role可查看官方文档。

由于不能将对象权限授予用户,所以当要进行精细的权限控制,内置角色无法满足需求,就只能自定义角色。自定义角色里面可以直接对对象(resource)进行操作(action)的权限,也可以包含某个角色。如:

use admin
db.createRole(
   {
     role: "myClusterwideAdmin",
     privileges: [
       { resource: { cluster: true }, actions: [ "addShard" ] },
       { resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert", "remove" ] },
       { resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert", "remove" ] },
       { resource: { db: "", collection: "" }, actions: [ "find" ] }
     ],
     roles: [
       { role: "read", db: "admin" }
     ]
   },
   { w: "majority" , wtimeout: 5000 }
)
从上面的例子可以看出resource是一个子文档,包含db和collection,如果为空则表示所有对象,action是一个数组,包含需要授予的操作权限。

当然也可以将role授权给role,使用db.grantRolesToRole() 。

在生产环境中若,经常需要在mongo上执行javascript脚本,并且使用db.eval()调用javascript脚本,则可能出现如下报错,提示无权限

eval需要所有资源的所有权限,需创建如下角色并授予用户

db.createRole(
   {
     role: "eval_role",
     privileges: [
       { resource: { anyResource: true }, actions: [ "anyAction" ] }
     ],
   roles:[]
   }
)

在此,强烈不建议授予此类权限!调用javascript可以使用其他方案,比如load 。


相关阅读



以文本形式将MySql数据迁移Mongodb的方法

Mongodb聚合查询及在日常运维中的使用

Mongodb日常性能问题处理案例分享

Mongodb增量备份和基于时间点恢复

Mongodb升级方案概述


END


更多精彩干货分享

点击下方名片关注

IT那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129932.html

相关文章

  • MongoDB 入门教程

    摘要:可选,抛出异常的级别。示例教程更新一条数据标题。命令行下执行进入数据库进入库可查看当前库用户列表执行新建用户设置账户密码,并指定级别。重启服务重新进入数据库,发现命令无法执行,报权限不足错误。命令可以正常执行。 1.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB ...

    Vicky 评论0 收藏0
  • MongoDB 入门教程

    摘要:可选,抛出异常的级别。示例教程更新一条数据标题。命令行下执行进入数据库进入库可查看当前库用户列表执行新建用户设置账户密码,并指定级别。重启服务重新进入数据库,发现命令无法执行,报权限不足错误。命令可以正常执行。 1.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB ...

    zhonghanwen 评论0 收藏0
  • MongoDB开启权限认证

    摘要:默认是不开启权限认证的,而我也是一直这么做的。自从上次爆发了赎金门事件,必须重视下的权限认证了。开启认证也很简单,在配置文件默认是里面加入这样一行就行了。 MongoDB version: v3.4.4 MongoDB默认是不开启权限认证的,而我也是一直这么做的。自从上次MongoDB爆发了赎金门事件,必须重视下MongoDB的权限认证了。 开启认证也很简单,在配置文件(默认是/etc...

    30e8336b8229 评论0 收藏0
  • mongoDB安装与操作

    摘要:一下安装数据库进入官网,选择相应的版本下载,安装时默认勾选安装服务和修改一些数据库配置,如已有数据库连接工具,可取消默认勾选的安装。 一、Win下安装数据库 进入mongo官网,选择相应的msi版本下载,安装时默认勾选安装MongoD服务和修改一些数据库配置,如已有数据库连接工具Robo 3T,可取消默认勾选的compass安装。 若启动服务报mp错误,可修改binmongod.cfg...

    zorpan 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<