分布式文档存储数据库之MongoDB访问控制的操作方法

  上一篇博客主要聊了下mongodb的分片机制以及分片集群的搭建,回顾请参考https://www.jb51.net/article/199845.htm;今天我们来了解下mongodb的访问控制;

  什么是访问控制?

  简单讲访问控制就是指,哪些用户可以访问哪些资源,对资源有哪些操作(权限);在mongodb中我们把数据库、或者集合叫做资源;也就说访问控制是用来限制某些用户对数据库或集合的操作;我们在mysql数据库中,我们通过给账号授权的方式达到控制哪些用户可以从哪些主机访问数据库,对数据库有哪些操作;其中账号由用户名称和主机地址构成;在mongodb中采用的不是用户+主机地址的方式,而是通过给用户赋予一个或多个角色,这个角色或多个角色的所有权限就是这个用户拥有的权限;默认情况mongodb是没有启用访问控制的,所以只要能够连接上mongodb实例,我们就可以在其上做任何操作,在某种程度上,这是一种极为不安全的方式,为了杜绝这种不安全的访问方式,我们需要对mongodb进行访问控制;

  mongodb中的角色权限说明

  mongodb默认内置了一些角色,不同的角色拥有不同的权限,如下图

  查看mongodb中某个数据库所有内置角色

> db.runCommand({rolesInfo:1,showBuiltinRoles:true})
{
    "roles" : [
        {
            "role" : "dbAdmin",
            "db" : "test",
            "isBuiltin" : true,
            "roles" : [ ],
            "inheritedRoles" : [ ]
        },
        {
            "role" : "dbOwner",
            "db" : "test",
            "isBuiltin" : true,
            "roles" : [ ],
            "inheritedRoles" : [ ]
        },
        {
            "role" : "enableSharding",
            "db" : "test",
            "isBuiltin" : true,
            "roles" : [ ],
            "inheritedRoles" : [ ]
        },
        {
            "role" : "read",
            "db" : "test",
            "isBuiltin" : true,
            "roles" : [ ],
            "inheritedRoles" : [ ]
        },
        {
            "role" : "readWrite",
            "db" : "test",
            "isBuiltin" : true,
            "roles" : [ ],
            "inheritedRoles" : [ ]
        },
        {
            "role" : "userAdmin",
            "db" : "test",
            "isBuiltin" : true,
            "roles" : [ ],
            "inheritedRoles" : [ ]
        }
    ],
    "ok" : 1
}
>

  提示:以上是mongodb中test库的默认角色;如果要查看其它库,我们需要切换到其他库,然后运行上述命令查看即可;

  查询当前数据中的某个角色

> db
test
> db.runCommand({rolesInfo:"userAdmin"})
{
    "roles" : [
        {
            "role" : "userAdmin",
            "db" : "test",
            "isBuiltin" : true,
            "roles" : [ ],
            "inheritedRoles" : [ ]
        }
    ],
    "ok" : 1
}
>

  查询其他数据库中指定的角色权限

> db.runCommand({rolesInfo:{role:"userAdmin",db:"config"}})
{
    "roles" : [
        {
            "role" : "userAdmin",
            "db" : "config",
            "isBuiltin" : true,
            "roles" : [ ],
            "inheritedRoles" : [ ]
        }
    ],
    "ok" : 1
}
> db.runCommand({rolesInfo:{role:"root",db:"config"}})
{ "roles" : [ ], "ok" : 1 }
> db.runCommand({rolesInfo:{role:"root",db:"admin"}})
{
    "roles" : [
        {
            "role" : "root",
            "db" : "admin",
            "isBuiltin" : true,
            "roles" : [ ],
            "inheritedRoles" : [ ]
        }
    ],
    "ok" : 1
}
>

  创建一个用户名为tom,其角色为超级管理员角色root

> use admin
switched to db admin
> db.createUser({user:"tom",pwd:"admin123.com",roles:[{"role":"root","db":"admin"}]})
Successfully added user: {
    "user" : "tom",
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}
>

  查看当前库用户列表

> db
admin
> db.getUsers()
[
    {
        "_id" : "admin.tom",
        "userId" : UUID("67bf434a-49fc-4ed5-9e9b-23c443a2fc93"),
        "user" : "tom",
        "db" : "admin",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }
]
>

  创建数据库管理员用户

> db.createUser({user:"jerry",pwd:"admin123.com",roles:["userAdminAnyDatabase"]})
Successfully added user: { "user" : "jerry", "roles" : [ "userAdminAnyDatabase" ] }
> db.getUsers()
[
    {
        "_id" : "admin.jerry",
        "userId" : UUID("5d0b77f2-b7f1-40cd-8149-f08b2e1e6a80"),
        "user" : "jerry",
        "db" : "admin",
        "roles" : [
            {
                "role" : "userAdminAnyDatabase",
                "db" : "admin"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    },
    {
        "_id" : "admin.tom",
        "userId" : UUID("67bf434a-49fc-4ed5-9e9b-23c443a2fc93"),
        "user" : "tom",
        "db" : "admin",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }
]
>

  提示:如果创建用户时,未指定db,则表示当前该用户对当前所在db生效;

  删除用户

> db.dropUser("jerry")
true
> db.getUsers()
[
    {
        "_id" : "admin.tom",
        "userId" : UUID("67bf434a-49fc-4ed5-9e9b-23c443a2fc93"),
        "user" : "tom",
        "db" : "admin",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }
]
>

  提示:删除用户,需切换到对应数据下,指定对应用户名称即可;在mongodb中用户是对应数据库的,一个用户可以对应一个或多个数据库,在指定数据库删除用户,就表示删除指定用户对指定数据库的访问权限;

  修改指定用户的密码

> db
admin
> db.changeUserPassword("tom","123456")
>

  提示:修改用户密码,第一个是指定用户的名称,第二个是指定新密码;

  验证用户名和密码

  给错误的密码

> db
admin
> db.auth("tom","admin")
Error: Authentication failed.
0
>

 给正确的密码

> db
admin
> db.auth("tom","123456")
1
>

  创建一个普通用户

> use testdb
switched to db testdb
> db.createUser({user:"test",pwd:"admin",roles:[{role:"readWrite",db:"testdb"}]})
Successfully added user: {
    "user" : "test",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "testdb"
        }
    ]
}
> db.getUsers()
[
    {
        "_id" : "testdb.test",
        "userId" : UUID("95ecb34c-46f4-44fa-8948-4f0875499d8e"),
        "user" : "test",
        "db" : "testdb",
        "roles" : [
            {
                "role" : "readWrite",
                "db" : "testdb"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }
]
>

 提示:以上就创建了一个名为test的用户,它可对testdb这个库下的所有collection做读写操作;

  创建一个多角色的用户

> db
testdb
> db.createUser(
... {
... user:"jerry1",
... pwd:"admin123.com",
... roles:[
... {role:"clusterAdmin",db:"admin"},
... {role:"readWrite",db:"testdb"},
... {role:"read",db:"testdb1"}
... ]
... })
Successfully added user: {
    "user" : "jerry1",
    "roles" : [
        {
            "role" : "clusterAdmin",
            "db" : "admin"
        },
        {
            "role" : "readWrite",
            "db" : "testdb"
        },
        {
            "role" : "read",
            "db" : "testdb1"
        }
    ]
}
> db.getUsers()
[
    {
        "_id" : "testdb.jerry1",
        "userId" : UUID("43d66bf8-1e3a-4c14-ad73-5961b5a7660f"),
        "user" : "jerry1",
        "db" : "testdb",
        "roles" : [
            {
                "role" : "clusterAdmin",
                "db" : "admin"
            },
            {
                "role" : "readWrite",
                "db" : "testdb"
            },
            {
                "role" : "read",
                "db" : "testdb1"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    },
    {
        "_id" : "testdb.test",
        "userId" : UUID("95ecb34c-46f4-44fa-8948-4f0875499d8e"),
        "user" : "test",
        "db" : "testdb",
        "roles" : [
            {
                "role" : "readWrite",
                "db" : "testdb"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }
]
>

  提示:在mongodb中一个用户可以授权拥有多个角色权限;

  开启mongodb服务端访问控制配置

  重启服务

[root@node12 ~]# systemctl restart mongod.service
[root@node12 ~]# ss -tnl
State   Recv-Q Send-Q     Local Address:Port            Peer Address:Port
LISTEN   0   128            *:22                   *:*
LISTEN   0   100        127.0.0.1:25                   *:*
LISTEN   0   128            *:27017                 *:*
LISTEN   0   128            :::22                  :::*
LISTEN   0   100           ::1:25                  :::*
[root@node12 ~]#

  测试:现在连接mongodb,看看会发生什么?

[root@node12 ~]# mongo
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("68fa2f83-64a4-42c2-8d64-9ee73a77e883") }
MongoDB server version: 4.4.1
> show dbs
> db
test
> show tables
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
>

  提示:现在我们直接连接mongodb是可以正常连接,但是我们没法查看数据列表以及collections了;这个时候我们就需要进行用户认证了;

  认证用户

> db
test
> db.auth("test","admin")
Error: Authentication failed.
0
> use testdb
switched to db testdb
> db.auth("test","admin")
1
> show dbs
> show collections
>

  提示:认证用户必须切换到对应的数据库下做认证;我这里test用户只能对testdb库下的所有collection进行读写,所以认证以后,我们在使用 show dbs命令就看不到系统admin和config库了;除了上述连接数据库以后使用db.auth()做用户认证,我们也可直接在连接数据库时指定用户名和密码,如下

[root@node12 ~]# mongo -utest -padmin testdb
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/testdb?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("60c43e94-04c6-46f4-be07-07ca8fa06b2f") }
MongoDB server version: 4.4.1
> show dbs
> exit
bye
[root@node12 ~]# mongo -utest -padmin 192.168.0.52:27017/testdb
MongoDB shell version v4.4.1
connecting to: mongodb://192.168.0.52:27017/testdb?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("a30dbd64-7b59-4a8e-b95d-02ff30e256f3") }
MongoDB server version: 4.4.1
> show dbs
> show tables
>

  以上就是在mongodb中开启访问控制,创建用户,授权的操作;我们只需要在配置文件中指定开启认证功能,然后使用具有创建用户权限的用户登录数据库创建用户授权即可;

到此这篇关于分布式文档存储数据库之MongoDB访问控制的操作方法的文章就介绍到这了,更多相关MongoDB访问控制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 分布式文档存储数据库之MongoDB分片集群的问题

    前文我们聊到了mongodb的副本集以及配置副本集,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13953598.html:今天我们来聊下mongodb的分片: 1.什么是分片?为什么要分片? 我们知道数据库服务器一般出现瓶颈是在磁盘io上,或者高并发网络io,又或者单台server的cpu.内存等等一系列原因:于是,为了解决这些瓶颈问题,我们就必须扩展服务器性能:通常扩展服务器有向上扩展和向外扩展:所谓向上扩展就是给服务器加更大的磁盘,使用更大更好的内

  • Mongodb如何开启用户访问控制详解

    前言 Mongodb 数据库默认情况下是没有访问控制的,整个数据库对外是开发的,只要能连上数据库,则可以进行任何操作,这会对数据带来很大的风险.当然,我们可以启用mongodb的访问控制,只让通过认证的用户才能对数据库进行角色范围内的操作. 启用访问控制可以通过在启动 mongodb 时指定 --auth 参数来设置,另外还涉及到创建用户 db.createUser 操作以及一些角色的定义,我们先来看这部分内容. db.createUser() 用法 db.createUser({ user:

  • MongoDB 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: "userAdminAnyDatab

  • 分布式文档存储数据库之MongoDB备份与恢复的实践详解

    前文我们聊了下mongodb的访问控制以及用户创建和角色分配,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13974656.html:今天我们来了解下mongodb的备份与恢复 为什么要备份? 备份的目的是对数据做冗余的一种方式,它能够让我们在某种情况下保证最少数据的丢失:之前我们对mongodb做副本集也是对数据做冗余,但是这种在副本集上做数据冗余仅仅是针对系统故障或服务异常等一些非人为的故障发生时,保证数据服务的可用性:它不能够避免人为的误操作:为了

  • 分布式文档存储数据库之MongoDB访问控制的操作方法

    上一篇博客主要聊了下mongodb的分片机制以及分片集群的搭建,回顾请参考https://www.jb51.net/article/199845.htm:今天我们来了解下mongodb的访问控制: 什么是访问控制? 简单讲访问控制就是指,哪些用户可以访问哪些资源,对资源有哪些操作(权限):在mongodb中我们把数据库.或者集合叫做资源:也就说访问控制是用来限制某些用户对数据库或集合的操作:我们在mysql数据库中,我们通过给账号授权的方式达到控制哪些用户可以从哪些主机访问数据库,对数据库有哪些

  • Flutter的键值存储数据库使用示例详解

    目录 Flutter 键值存储数据库 unqlite unqlite_flutter 快速上手 简单键值对存储 JSON 为什么你应该使用unqlite_flutter? Flutter 键值存储数据库 键值存储是开发中十分常见的需求,在Flutter开发中,一般使用 shared_preferences 插件来实现.shared_preferences 本质上就是将键值对保存到一个XML文件中进行持久化. 而shared_preferences 实际上存在一定缺陷,譬如其性能较差,不适合处理大

  • 对标mongodb存储类JSON数据文档统计分析详解

    目录 一.文档存储的需求 二.建表 三.数据入库 四.查询数据 五.总结 一.文档存储的需求 很多的开发者都使用过mongodb,在mongodb中数据记录是以文档的形式存在的(类似于一种多级嵌套SQL的形式).比如下面的JSON数据结构:dev_ip表示某一台服务器的ip.location字段存放经纬度.meminfo.total和meminfo.userd分别代表内存总量和使用量. [{ "dev_ip": "123.46.5.111", "locat

  • MongoDB快速入门笔记(三)之MongoDB插入文档操作

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 本文给大家介绍MongoDB的插入文档的方法,一起看看吧 1.文档的数据存储格式为BSON,类似于JSON.MongoDB插入数据时会检验数据中是否有"_id",如果没有会自动生成. shell操作有insert和save两种方法.当插入一条数据有

  • 利用Spring Data MongoDB持久化文档数据的方法教程

    前言 本文主要给大家介绍了关于利用Spring Data MongoDB持久化文档数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 介绍 NoSQL:not only SQL,非关系型数据 MongoDB是文档型数据,文档是独立的实体,文档数据库不适用于关联关系明显的数据 Spring Data MongoDB 1.Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB 通过注解实现对象-文档映射 使用MongoTemplate

  • MongoDB快速入门笔记(六)之MongoDB删除文档操作

    MongoDB是一个跨平台,面向文档的数据库,提供高性能,高可用性和易于扩展.MongoDB是工作在集合和文档上一种概念. 文档是一组键值对.文档具有动态模式.动态模式是指,在同一个集合的文件不必具有相同一组集合的文档字段或结构,并且相同的字段可以保持不同类型的数据. db.集合名称.remove({query}, justOne) query:过滤条件,可选 justOne:是否只删除查询到的第一条数据,值为true或者1时,只删除一条数据,默认为false,可选. 准备数据:把_id为1和2

  • MongoDB中对文档的增删查改基本操作方法总结

    插入文档:insert() 方法 要插入数据到 MongoDB 集合,需要使用 MongoDB 的  insert() 或 save() 方法. 语法: insert() 命令的基本语法如下: >db.COLLECTION_NAME.insert(document) 例子:  >db.mycol.insert({    _id: ObjectId(7df78ad8902c),    title: 'MongoDB Overview',     description: 'MongoDB is

  • MongoDB基础之查询文档

    目录 一.查询文档 实例 二.条件操作符 MongoDB 与 RDBMS Where 语句比较 举例:使用 (<) 和 (>) 查询 - $lt 和 $gt 三.AND 条件 四.OR 条件 五.AND 和 OR 联合使用 六.$type 操作符 描述 七.Limit与Skip方法 Limit() 方法 Skip() 方法 实例 八.排序 九.聚合 管道的概念 一.查询文档 MongoDB 查询文档使用 find() 方法.以非结构化的方式来显示所有文档. MongoDB 查询数据的语法格式如

随机推荐