MongoDB 用户与权限管理

MongoDB 用户与权限管理

MongoDB 权限管理

MongoDB 提供了各种特性,比如身份验证、访问控制、加密,以确保 MongoDB 的部署安全。

只要涉及安全一般考虑如下两个方面:

权限管理 = 认证( Authentication ) + 授权( Authorization

  • 认证:就是身份验证,验证输入的账号和密码对不对,核查系统注册过这个用户没

  • 授权:通过认证的用户在系统中的是什么角色(如业务管理员、账务管理员、日志管理员、普通用户、VIP 用户等),

    ​ 该角色在系统中有哪些权限

授权方式:Mongodb 是使用角色的方式进行授权

MongoDB 内置角色

MongoDB 提供了很多内置角色,不同的角色拥有不同的访问数据库权限

  • 系统内置用户角色

    大部分内置的角色对所有数据库共用,少部分仅对admin生效

  • 数据库用户类角色

    • read :非系统集合有查询权限
    • readWrite :非系统集合有查询和修改权限
  • 数据库管理类

    • dbAdmin :数据库管理相关,比如索引管理,schema管理,统计收集等,不包括用户和角色管理

    • dbOwner :提供数据库管理,读写权限,用户和角色管理相关功能

    • userAdmin :提供数据库用户和角色管理相关功能

  • 集群管理类

    • clusterAdmin :提供最大集群管理权限
    • clusterManager :提供集群管理和监控权限
    • clusterMonitor :提供对监控工具只读权限
    • hostManager :提供监控和管理severs权限
  • 备份和恢复类

    • backup :提供数据库备份权限
    • restore :提供数据恢复权限
  • All-Database类

    • readAnyDatabase :提供读取所有数据库的权限除了local和config数据库之外
    • readWriteAnyDatabase :和readAnyDatabase一样,除了增加了写权限
    • userAdminAnyDatabase :管理用户所有数据库权限,单个数据库权限和userAdmin角色一样
  • dbAdminAnyDatabase :提供所有用户管理权限,除了local,config

  • 超级用户类

    • root :数据库所有权限
  • 内部角色

    • __system :提供数据库所有对象任何操作的权限,不能分配给用户,非常危险
创建超级用户

只有超级用户才有权限创建普通用户,所以需要先创建超级用户

  • 关闭访问权限模式启动 MongoDB 服务器
[root@node-01 mongodb-4.2.7]# vi config/mongodb.conf 
#关闭权限验证
auth=false
[root@node-01 mongodb-4.2.7]# bin/mongod -f config/mongodb.conf 
  • 启动 MongoDB shell 客户端并创建超级用户
# 切换到 admin 数据库
> use admin
switched to db admin
# 查看当前数据库
> db
admin

# 创建数据库 admin 超级用户角色
> db.createUser({user: "root",pwd: "root",roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]})
  • user:用户名(root)
  • pwd:密码(root)
  • roles:用户角色组
    • 角色1:userAdminAnyDatabase(管理用户所有数据库权限)
    • 角色2:readWriteAnyDatabase(所有数据库读写权限)
  • 开启访问权限模式启动 MongoDB 服务器
# 关闭 MongoDB 服务器
[root@node-01 mongodb-4.2.7]# bin/mongod --shutdown --dbpath data/db/

[root@node-01 mongodb-4.2.7]# vi config/mongodb.conf 
#开启权限验证
auth=true
[root@node-01 mongodb-4.2.7]# bin/mongod -f config/mongodb.conf 
  • 用户管理员权限验证
> db
test

> db.users.insert({name:null})
WriteCommandError({
        "ok" : 0,
        "errmsg" : "command insert requires authentication", 
        "code" : 13,
        "codeName" : "Unauthorized" #提示该没有写权限
})
>

> use admin
switched to db admin
# 验证用户管理员权限
> db.auth("root","root")
1 # 返回 1:代表成功, 0:代表失败

> use test
switched to db test
> db.users.insert({name:null}) # 超级用户root有读写数据库权限
WriteResult({ "nInserted" : 1 })
创建普通用户

一旦通过超级用户 root 身份验证,就可以使用 db.createUser() 创建普通用户。可以将任何内置角色或用户定义的角色分配给用户

> db.createUser({user: "binge",pwd: "123",roles: [ { role: "dbOwner", db: "test" }]})
普通用户登录 MongoDB shell 客户端
[root@node-01 mongodb-4.2.7]# bin/mongo --host node-01 --port 27017 -u "binge" -p "123" --authenticationDatabase "test"
> 
  • --host : 指定连接的 MongoDB 服务器 IP 地址
  • --port:指定连接的 MongoDB 服务器端口
  • -u:数据库用户名
  • -p:数据库密码
  • --authenticationDatabase:登录认证的数据库名(创建用户的数据库)
查看当前数据库所有用户
> show users
删除用户
# 删除当前数据库指定用户
> db.dropUser('test')
true
更新用户
> db.updateUser("binge",{
    pwd:"12345",
    customData:{
        "title":"mongodb test"
    }
})
更新用户密码
> db.changeUserPassword("binge","123")
查看用户信息
> db.getUser("test")
{
        "_id" : "test.test",
        "userId" : UUID("a941b4e9-a2af-4c1b-a5c4-03e924676555"),
        "user" : "binge",
        "db" : "test",
        "roles" : [
                {
                        "role" : "dbOwner",
                        "db" : "test"
                }
        ],
        "customData" : {
                "title" : "mongodb test"
        },
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}
添加用户角色
> db.grantRolesToUser("binge",[ { role: "read", db: "test" }])
> show users
{
        "_id" : "test.test",
        "userId" : UUID("a941b4e9-a2af-4c1b-a5c4-03e924676555"),
        "user" : "test",
        "db" : "test",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "test"
                },
                {
                        "role" : "dbOwner",
                        "db" : "test"
                }
        ],
        "customData" : {
                "title" : "mongodb test"
        },
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}
删除用户角色
> db.revokeRolesFromUser("binge",[{ role: "read", db: "test" }])
自定义角色
> use admin
switched to db admin
> db
admin
> db.createRole(
   {
     role: "manageOpRole",
     privileges: [
       { resource: { cluster: true }, actions: [ "killop", "inprog" ] },
       { resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
     ],
     roles: []
   }
)
查看角色
> db.getRole("manageOpRole",{showPrivileges:true})
posted @ 2021-11-22 10:24  嘛了对就念来过倒  阅读(472)  评论(0编辑  收藏  举报