# 创建用户并分配权限

参考官方文档 (opens new window)

# 角色说明

以下是MongoDB中内置的角色:

# 数据库用户角色(Database User Roles) - 常用

  • read

read角色包含读取所有非系统集合数据和订阅部分系统集合(system.indexes、system.js、system.namespaces)的权限。

该角色权限包含命令操作:changeStream、collStats、dbHash、dbStats、find、killCursors、listIndexes、listCollections。

  • readWrite

readWrite角色包含read角色的权限同时增加了对非系统集合数据的修改权限,但只对系统集合system.js有修改权限。

该角色权限包含命令操作:collStats、convertToCapped、createCollection、dbHash、dbStats、dropCollection、createIndex、dropIndex、find、insert、killCursors、listIndexes、listCollections、remove、renameCollectionSameDB、update。

# 数据库管理角色(Database Administration Roles) - 常用

  • dbAdmin

dbAdmin角色包含执行某些管理任务(与schema相关、索引、收集统计信息)的权限,该角色不包含用户和角色管理的权限。

对于系统集合(system.indexes、system.namespaces、system.profile)包含命令操作:collStats、dbHash、dbStats、find、killCursors、listIndexes、listCollections、dropCollection and createCollection(仅适用system.profile)

对于非系统集合包含命令操作:bypassDocumentValidation、collMod、collStats、compact、convertToCapped、createCollection、createIndex、dbStats、dropCollection、dropDatabase、dropIndex、enableProfiler、reIndex、renameCollectionSameDB、repairDatabase、storageDetails、validate

  • dbOwner

dbOwner角色包含对数据所有的管理操作权限。即包含角色readWrite、dbAdmin和userAdmin的权限。

  • userAdmin

userAdmin角色包含对当前数据库创建和修改角色和用户的权限。该角色允许向其它任何用户(包括自身)授予任何权限,所以这个角色也提供间接对超级用户(root)的访问权限,如果限定在admin数据中,也包括集群管理的权限。

该角色权限包含命令操作:changeCustomData、changePassword、createRole、createUser、dropRole、dropUser、grantRole、revokeRole、setAuthenticationRestriction、viewRole、viewUser。

# 集群管理角色(Cluster Administration Roles)**

  • clusterManager

clusterManager角色包含对集群监控和管理操作的权限。拥有此角色的用户能够访问集群中的config数据库和local数据库。

对于整个集群该角色包含命令操作:addShard、appendOplogNote、applicationMessage、cleanupOrphaned、flushRouterConfig、listSessions (3.6新增)、listShards、removeShard、replSetConfigure、replSetGetConfig、replSetGetStatus、replSetStateChange、resync。

对于集群中所有的数据库包含命令操作:enableSharding、moveChunk、splitChunk、splitVector。

对于集群中config数据库和local数据库包含的命令操作可以参考官方文档:https://docs.mongodb.com/manual/reference/built-in-roles/#clusterManager (opens new window)

  • clusterMonitor

clusterMonitor角色包含针对监控工具具有只读操作的权限。如工具MongoDB Cloud Manager和工具Ops Manager

对于整个集群该角色包含命令操作:checkFreeMonitoringStatus(4.0新增)、connPoolStats、getCmdLineOpts、getLog、getParameter、getShardMap、hostInfo、inprog、listDatabases、listSessions (3.6新增)、listShards、netstat、replSetGetConfig、replSetGetStatus、serverStatus、setFreeMonitoring (4.0新增)、shardingState、top。

对于集群中所有的数据为包含命令操作:collStats、dbStats、getShardVersion、indexStats、useUUID(3.6新增)。

对于集群中config数据库和local数据库包含的命令操作可以参考官方文档:https://docs.mongodb.com/manual/reference/built-in-roles/#clusterMonitor (opens new window)

  • hostManager

hostManager角色包含针对数据库服务器的监控和管理操作权限。

对于整个集群该角色包含命令操作:applicationMessage、closeAllDatabases、connPoolSync、cpuProfiler、flushRouterConfig、fsync、invalidateUserCache、killAnyCursor (4.0新增)、killAnySession (3.6新增)、killop、logRotate、resync、setParameter、shutdown、touch、unlock。

对于集群中所有的数据库包含命令操作:killCursors、repairDatabase。

  • clusterAdmin

clusterAdmin角色包含MongoDB集群管理最高的操作权限。该角色包含clusterManagerclusterMonitorhostManager三个角色的所有权限,并且还拥有dropDatabase操作命令的权限。

# 备份和恢复角色(Backup and Restoration Roles) - 常用

  • backup

backup角色包含备份MongoDB数据最小的权限。

对于MongoDB中所有的数据库资源包含命令操作:listDatabases、listCollections、listIndexes。

对于整个集群包含命令操作:appendOplogNote、getParameter、listDatabases。

对于以下数据库资源提供find操作权限:

  1. 对于集群中的所有非系统集合,包括自身的config数据库和local数据库;
  2. 对于集群中的系统集合:system.indexes、system.namespaces、system.js和system.profile;
  3. admin数据库中的集合:admin.system.users和admin.system.roles;
  4. config.settings集合;
  5. 2.6版本之前的system.users集合。

对于config.setting集合还有insert和update操作权限。

  • restore

restore角色包含从备份文件中还原恢复MongoDB数据(除了system.profile集合)的权限。

restore角色有以下注意事项:

  1. 如果备份中包含system.profile集合而恢复目标数据库没有system.profile集合,mongorestore会尝试重建该集合。因此执行用户需要有额外针对system.profile集合的createCollection和convertToCapped操作权限;
  2. 如果执行mongorestore命令时指定选项--oplogReplay,则restore角色包含的权限无法进行重放oplog。如果需要进行重放oplog,则需要只对执行mongorestore的用户授予包含对实例中任何资源具有任何权限的自定义角色。

对于整个集群包含命令操作:getParameter。

对于所有非系统集合包含命令操作:bypassDocumentValidation、changeCustomData、changePassword、collMod、convertToCapped、createCollection、createIndex、createRole、createUser、dropCollection、dropRole、dropUser、grantRole、insert、revokeRole、viewRole、viewUser。

关于restore角色包含其它的命令操作可以参考官方文档:https://docs.mongodb.com/manual/reference/built-in-roles/#restore (opens new window)

# 全数据库级角色(All-Database Roles)

以下角色只存在于admin数据库,并且适用于除了config和local之外所有的数据库。

  • readAnyDatabase

readAnyDatabase角色包含对除了config和local之外所有数据库的只读权限。同时对于整个集群包含listDatabases命令操作。

在MongoDB3.4版本之前,该角色包含对config和local数据库的读取权限。当前版本如果需要对这两个数据库进行读取,则需要在admin数据库授予用户对这两个数据库的read角色。

  • readWriteAnyDatabase

readWriteAnyDatabase角色包含对除了config和local之外所有数据库的读写权限。同时对于整个集群包含listDatabases命令操作。

在MongoDB3.4版本之前,该角色包含对config和local数据库的读写权限。当前版本如果需要对这两个数据库进行读写,则需要在admin数据库授予用户对这两个数据库的readWrite角色。

  • userAdminAnyDatabase

userAdminAnyDatabase角色包含类似于userAdmin角色对于所有数据库的用户管理权限,除了config数据库和local数据库。

对于集群包含命令操作:authSchemaUpgrade、invalidateUserCache、listDatabases。

对于系统集合admin.system.users和admin.system.roles包含命令操作:collStats、dbHash、dbStats、find、killCursors、planCacheRead、createIndex、dropIndex。

该角色不会限制用户授予权限的操作,因此,拥有角色的用户也有可能授予超过角色范围内的权限给自己或其它用户,也可以使自己成为超级用户,userAdminAnyDatabase角色也可以认为是MongoDB中的超级用户角色。

  • dbAdminAnyDatabase

dbAdminAnyDatabase角色包含类似于dbAdmin角色对于所有数据库管理权限,除了config数据库和local数据库。同时对于整个集群包含listDatabases命令操作。

在MongoDB3.4版本之前,该角色包含对config和local数据库的管理权限。当前版本如果需要对这两个数据库进行管理,则需要在admin数据库授予用户对这两个数据库的dbAdmin角色。

# 超级用户角色(Superuser Roles)

WARNING

慎用

以下角色包含在任何数据库授予任何用户任何权限的权限。这意味着用户如果有以下角色之一可以为自己在任何数据库授予任何权限。

  • dbOwner角色(作用范围为admin数据库)
  • userAdmin角色(作用范围为admin数据库)
  • userAdminAnyDatabase角色

以下角色包含数据库所有资源的所有操作权限。

  • root

root角色包含角色readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、restore和backup联合之后所有的权限。

# 内部角色(Internal Role)

  • __system

MongoDB将此角色授予代表集群成员的用户对象,如副本集(replica set)成员或mongos实例。该角色允许用户对于需要的数据库操作都具有相应的权限,不要将该角色授予应用程序用户或其它管理员用户。

# 总结说明

通过以上对内置角色的说明,总结一下较为常用的内置角色,如下表:

角色 权限描述
read 可以读取指定数据库中任何数据。
readWrite 可以读写指定数据库中任何数据,包括创建、重命名、删除集合。
readAnyDatabase 可以读取所有数据库中任何数据(除了数据库config和local之外)。
readWriteAnyDatabase 可以读写所有数据库中任何数据(除了数据库config和local之外)。
dbAdmin 可以读取指定数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作。
dbAdminAnyDatabase 可以读取任何数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作(除了数据库config和local之外)。
clusterAdmin 可以对整个集群或数据库系统进行管理操作。
userAdmin 可以在指定数据库创建和修改用户。
userAdminAnyDatabase 可以在指定数据库创建和修改用户(除了数据库config和local之外)。

# 创建自定义角色

# 查看环境

TIP

这里要注意imooc用户是imooc数据库的imooc角色

> show dbs;
admin   0.000GB
config  0.000GB
imooc   0.001GB
local   0.000GB

> use imooc;
switched to db imooc

目前的权限情况

> db.createRole(
    {
        role: "imooc",
        privileges: [
            { resource: { db: "imooc", collection: "users" }, actions: ["find", "update"] },
            { resource: { db: "imooc", collection: "rights" }, actions: ["find"] },
        ],
        roles: []
    }
)

或

> db.adminCommand(
    {
        createRole: "imooc",
        privileges: [
            { resource: { db: "imooc", collection: "users" }, actions: ["find", "update"] },
            { resource: { db: "imooc", collection: "rights" }, actions: ["find"] }
        ],
        roles: []
    }

# 查看自定义的角色

> db.getRole("imooc", { showPrivileges: true })

// 或

> db.getRoles({ rolesInfo: 1, showPrivileges: true })

// 或

> use admin
> db.runCommand(
    {
        rolesInfo: { role: "imooc", db: "admin" },
        showPrivileges: true
    }
)

# 更新自定义的角色

为自定义角色imooc更新集合imooc.rights的insert权限。

> db.updateRole(
    "imooc",
    {
        privileges: [
            { resource: { db: "imooc", collection: "users" }, actions: ["find", "update"] },
            { resource: { db: "imooc", collection: "rights" }, actions: ["find", "insert"] }
        ],
        roles: []
    }
)

// 或

> db.adminCommand(
    {
        updateRole: "imooc",
        privileges: [
            { resource: { db: "imooc", collection: "users" }, actions: ["find", "update"] },
            { resource: { db: "imooc", collection: "rights" }, actions: ["find", "insert"] }
        ],
        roles: []
    }
)

# 添加角色权限

为自定义角色imooc添加集合imooc.rights的remove权限。

db.grantPrivilegesToRole(
    "imooc",
    [
        { resource: { db: "imooc", collection: "rights" }, actions: ["remove"] }
    ]
)

// 或

> use admin
> db.runCommand(
    {
        grantPrivilegesToRole: "imooc",
        privileges: [
            { resource: { db: "imooc", collection: "rights" }, actions: ["remove"] }
        ]
    }
)

# 删除角色

为自定义角色imooc收回集合imooc.users的update权限。

> db.revokePrivilegesFromRole(
    "imooc", 
    [
        { resource: { db: "imooc", collection: "users" }, actions: ["update"] }
    ]
)

或

> use admin
> db.runCommand(
    { 
        revokePrivilegesFromRole: "imooc", 
        privileges: [
            { resource: { db: "imooc", collection: "users" }, actions: ["update"] }
        ] 
    }
)

# 创建用户并分配角色

use imooc

db.createUser(
  {
    user: "admin",
    pwd: "123456",
    roles: [ { role: "dbOwner", db: "imooc" } ]
  }
)

# 查看用户信息

> use imooc
> db.getUser("admin", { showPrivileges: true })

// 或

> db.getSiblingDB("imooc").runCommand(
    {
        usersInfo: "admin",
        showPrivileges: true

    }
)

# 为用户添加角色

> use imooc
> db.grantRolesToUser(
    "admin",
    [
        { role: "dbOwner", db: "imooc" }
    ]
)

// 或

> use imooc
> db.runCommand(
    {
        grantRolesToUser: "admin",
        roles:
            [
                { role: "dbOwner", db: "imooc" }
            ]
    }
)

# 删除用户

> use imooc
> db.dropUser("admin")

# 更改用户密码

> use imooc
> db.changeUserPassword("admin", "long-random-password")

# 开启MongoDB的访问控制

要开启访问控制,则需要在mongod进程启动时加上选项--auth或在启动配置文件加入选项auth=true,并重启mongodb实例(使用docker开启的同学不用管)

## mongod配置文件如下
# cat mongodb.cnf 
journal=true
dbpath=/data/mongodb/4.0/data
directoryperdb=true
fork=true
port=27017
logpath=/data/mongodb/4.0/logs/mongodb.log
quiet=true
bind_ip_all=true
auth=true

## 启动mongodb实例
# mongod -f mongodb.cnf 
about to fork child process, waiting until server is ready for connections.
forked process: 44347
child process started successfully, parent exiting