# 八、MongoDB 数据安全

# 1. 数据库认证

# 1.1 创建用户

  1. 连接 MongoDB Shell

    docker exec -it mymongo mongo
    
  2. 进入到 admin 数据库

    use admin
    
  3. 创建用户

    db.createUser(
    	{
    		user: "hedon",
    		pwd: "hedonPwd",
    		roles: ["userAdminAnyDatabase"]
    	}
    )
    
    • user: 用户名
    • pwd: 密码
    • roles: 用户角色,userAdminAnyDatabase: 授权在所有的数据库上管理 User 的权限,只在 admin 中可用

    输出:

    Successfully added user: { "user" : "hedon", "roles" : [ "userAdminAnyDatabase" ] }
    

# 1.2 用户登录

  1. 删除之前的 mongodb 容器

    docker stop mymongo && docker rm $_
    
  2. 重启 mongod 进程,指定需要认证

    docker run --name mymongo -v $HOME/mymongo/data:/data/db -p 27017:27017 -d mongo:4 --auth --port 27017
    

    --auth: 指定需要认证才能访问

  3. 使用用户登录 mongodb

    docker exec -it mymongo mongo -u "hedon" -p "hedonPwd" --authenticationDatabase "admin"
    

    -u: 用户名

    -p: 密码

    --authenticationDatabse: 指定使用哪个数据库来验证身份

    补充

    也可以直接使用 mongo 连接数据库,然后到 mongo shell 里面再用 db.auth("username", "password") 来验证。

  4. 切换到 test 数据库

    use test
    
  5. 尝试插入数据

    db.hedon.insertOne({"name": "hedon"})
    

    会报错说没有权限,因为我们授予 hedon 的角色是 userAdminAnyDatabase,该角色只能在所有的数据库上管理 User 的权限,其他权限它不具有。

    uncaught exception: WriteCommandError({
    	"ok" : 0,
    	"errmsg" : "not authorized on test to execute command { insert: \"hedon\", ordered: true, lsid: { id: UUID(\"82bc0936-50b8-419a-8856-a2b68316a8a1\") }, $db: \"test\" }",
    	"code" : 13,
    	"codeName" : "Unauthorized"
    }) :
    

# 2. 数据库授权

# 2.1 内建角色

数据库用户角色:

  • read: 只读角色
  • readWrite: 读/写角色

数据库管理角色:

  • dbAdmin: 在当前的数据库中执行管理操作,如索引的创建、删除、统计、查看等
  • dbOwner: 在当前的数据库中执行任意操作,增、删、改、查等
  • userAdmin: 在当前的数据库中管理User,创建、删除和管理用户

备份与还原角色:

  • Backup
  • restore

跨库角色:

  • readAnyDatabase: 授权在所有的数据库上读取数据的权限,只在 admin 中可用
  • readWriteAnyDatebase: 授权在所有的数据库上读写数据的权限,只在 admin 中可用
  • userAdminAnyDatabase: 授权在所有的数据库上管理 User 的权限,只在 admin 中可用
  • dbAdminAnyDatabase: 授权管理所有数据库的权限,只在 admin 中可用

集群管理角色:

  • clusterAdmin: 授权管理集群的最高权限,只在 admin 中可用
  • clusterManager: 授权管理和监控集群的权限
  • clusterMonitor: 授权监控集群的权限,对监控工具具有 readonly 的权限
  • hostManager: 管理 Server

超级角色:

  • root: 超级账户和权限,只在 admin 中可用

示例:创建一个只能读取 test 数据库的用户

  1. 切换到 test 数据库

    use test
    
  2. 创建用户

    db.createUser(
    	{
    		user: "testReader",
    		pwd: "password",
    		roles: [
    			{role: "read", db: "test"}
    		]
    	}
    )
    

    输出:

    Successfully added user: {
    	"user" : "testReader",
    	"roles" : [
    		{
    			"role" : "read",
    			"db" : "test"
    		}
    	]
    }
    

# 2.2 自定义角色

  1. 切换到 test 数据库

    use test
    
  2. 使用 db.createRole() 创建一个只能读取 accounts 集合的角色

    db.createRole(
    	{
    		role: "readAccounts",
    		privileges: [
    			{ 
    				resource: {db: "test", collection: "accounts"},
    				actions: ["find"]
          }
    		],
    		roles: []
    	}
    )
    
    • role: 给自定义角色起名字
    • privileges: 角色权限信息:在哪里能做什么事
      • resouce: 在哪里
        • db: 数据库
        • collection: 集合
      • actions: 能做什么事
    • roles: 继承现有角色
上次更新: 12/9/2021, 11:30:53 AM