« 上一篇下一篇 »

MongoDB 3.0+安全权限访问控制详解

     MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

   MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法。由于这版本改变的有些大,解决了很久,终于解决,下面把解决的步骤以及思路分享给大家。

1、启动没有访问控制的MongoDB服务
 

sudo service mongod start
 
2、连接到实例
 

mongo --port 27017
 

指定额外的命令行选项来连接Mongo shell到部署Mongodb服务器, 如--host
 
3、创建的用户管理员
 

 


use admin
 db.createUser(
 {
 user: "myUserAdmin",
 pwd: "abc123",
 roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
 }
 )
 
4、重新启动MongoDB实例,并启用访问控制
 

1、重新启动mongod实例,如果使用配置文件的设置,security.authorization:
 

vi /etc/mongod.conf
 

修改内容:
 

    security:
       authorization: enabled
 

2、注意:keys and values之间一定要加空格, 否则解析会报错
 

    重启服务:
 

    sudo service mongod start
 

5、用户管理员身份验证
 

1、创建连接mongo shell 时进行授权,指定-u <username>, -p <password>, and the --authenticationDatabase <database>
 

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
 
2、mongo shell连接时不认证,使用db.auth()授权
 


    use admin
     db.auth("myUserAdmin", "abc123" )
 

--------------------服务器以开启认证后,如何添加用户--------------------


 1、启动MongoDB实例的访问控制
 

启动mongod实例 AUTH命令行选项,如果使用配置文件的设置,security.authorization。
 

sudo service mongod start
 
2、通过localhost exception 连接MongoDB实例
 

添加第一个用户, 使用Localhost Exception,连接一个mongod实例。运行Mongo shell和mongod实例必须来自同一主机
 
3、同上创建用户方式相同
 
--------------------普通用户安全访问权限--------------------
 1、启动MongoDB
 

service mongod start
 
2、再次打开MongoDB shell
 1、mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
 
2、mongo
 


    use admin
     db.auth("myUserAdmin","abc123")
 
3、show collections:报错
     因为用户myUserAdmin只用用户的管理权限
 

3、创建用户,用户都跟着数据库走
 

为myuseradmin创建用户myUserAdmin在admin 数据库
 


use admin
 db.createUser(
 {
 user: "myUserAdmin",
 pwd: "abc123",
 roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
 }
 )
 
4、查看刚刚创建的用户
 

show users
 
5、查看整个MongoDB全部的用户
 


use admin
db.system.users.find()
 db.system.users.find().pretty()
 

6、创建完毕、进行验证
 

use test
 db.auth('test1','test1')
 1
 show collections
 ypmlist
 

--------------------修改权限--------------------
 

1、updateuser()方法:
 1、实例
 


db.updateUser(
 "<username>",
 {
 customData : { <any information> },
 roles : [
 { role: "<role>", db: "<database>" } | "<role>",
 ...
 ],
 pwd: "<cleartext password>"
 },
 writeConcern: { <write concern> }
 )
 
2、参数介绍:  
    1、username:要更新的用户名。
 
    2、update:替换用户数据的文档,此数据完全取代了用户的相应数据。
 
    3、writeConcern:可选,写操作级别。
 
3、指定要更新的字段和他们的新值:
     1、customData:可选。任意信息。
 
    2、roles:可选。授予用户的角色。对角色数组覆盖以前的数组的值更新
 
    3、pwd:可选。用户密码
 

--------------------修改权限操作--------------------
 实例:
 

use admin
 switched to db admin
 db.auth("myUserAdmin", "abc123" )
 1
 use test
 db.updateUser(
 "test1",
 {
 pwd: "itcast",
 customData: { title: "Senior Manager" },
 "roles" : [
 {
 "role" : "readWrite",
 "db" : "test"
 },
 {
 "role" : "readWrite",
 "db" : "example"
 }
    }
 )
 

--------------------超级用户--------------------
 


use admin
 db.createUser(
 {
 user: "itcast",
 pwd: "itcast",
 roles: [ { role: "root", db: "admin" } ]
 }
 )
 
2、系统默认角色:
 


1、Read:允许用户读取指定数据库
 2、readWrite:允许用户读写指定数据库
 3、dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
 4、userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
 5、clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
 6、readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
 7、readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
 8、userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
 9、dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
 10、root:只在admin数据库中可用。超级账号,超级权限

3.基于角色的访问控制(Role-Based Access Control)

角色是授予User在指定资源上执行指定操作的权限,MongoDB官方手册对角色的定义是:

A role grants privileges to perform the specified actions on resource.

MongoDB为了方便管理员管理权限,在DB级别上预先定义了内置角色;如果用户需要对权限进行更为细致的管理,MongoDB允许用户创建自定义的角色,能够在集合级别上控制User能够执行的操作。
MongoDB使用角色(Role)授予User访问资源的权限,Role决定User能够访问的数据库资源和执行的操作。一个User能够被授予一个或多个Role,如果User没有被授予Role,那么就没有访问MongoDB系统的权限。

A user is granted one or more roles that determine the user’s access to database resources and operations. Outside of role assignments, the user has no access to the system.

1,内置角色(Built-In Roles)

内置角色是MongoDB预定义的角色,操作的资源是在DB级别上。MongoDB拥有一个SuperUser的角色:root,拥有最大权限,能够在系统的所有资源上执行任意操作。

数据库用户角色(Database User Roles):

read:授予User只读数据的权限
readWrite:授予User读写数据的权限
数据库管理角色(Database Administration Roles):

dbAdmin:在当前dB中执行管理操作
dbOwner:在当前DB中执行任意操作
userAdmin:在当前DB中管理User
备份和还原角色(Backup and Restoration Roles):

backup
restore
跨库角色(All-Database Roles):

readAnyDatabase:授予在所有数据库上读取数据的权限
readWriteAnyDatabase:授予在所有数据库上读写数据的权限
userAdminAnyDatabase:授予在所有数据库上管理User的权限
dbAdminAnyDatabase:授予管理所有数据库的权限
集群管理角色(Cluster Administration Roles):

clusterAdmin:授予管理集群的最高权限
clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
hostManager:管理Server