MongoDB 安全策略:验证和授权

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 对于新安装的 MongoDB ,它是没有开启身份验证的。需要进入 admin 数据库,创建一个 root 角色的超级管理员用户。之后再针对具体应用的数据库,使用管理员用户为其创建不同权限的用户,从而做到针对数据库安全的基本保障。

前言

前面文章中通过客户端工具(MongoDB Shell、Robo 3T)连接 MongoDB 服务时,只要有 IP 地址和端口号,就能连接到数据库,之后就能操作数据库。这是因为默认安装的 MongoDB 没有启用身份验证,也没有设置初始用户名和密码。然而这会导致很多数据安全问题。

MongoDB 提供了多种方式来提高数据库的安全性,例如身份验证访问控制加密等。

本文主要介绍 MongoDB 提供的内置角色和权限,然后通过开启身份验证,为用户指定不同的访问权限,来提供数据库的安全性

前两篇文章,我们分别在 Windows,Linux 和 Docker 中安装了 MongoDB 数据库。本文所介绍的内容,以 Linux 环境中的 MongoDB 为例进行演示。Windows 系统中的操作基本一致。

区分验证和授权

验证即身份验证。用户在连接到 MongoDB 服务时,需要提供用户名,密码和验证数据库进行身份的验证。

授权就是权限控制。做过后台管理系统的小伙伴肯定对 RBAC 模型不陌生。MongoDB 也采用了 RBAC 模型,创建用户时需要为其指定角色,来获取相应的操作数据库的权限。

身份验证只是限制用户能否连接数据库服务,而通过权限控制,就能更精细的控制用户对数据库的各种操作。类比常见的后台管理系统,管理员和普通用户都能登录系统,然后他们能访问的页面、能做的操作却大有不同。

MongoDB 内置角色

MongoDB 通过 RBAC 授予用户对数据和命令的访问权限,并提供了多种内置角色来提供数据库系统中通常需要的不同级别的访问权限。除了使用内置角色,还支持用户创建定义的角色。

这一部分的内容官网有详尽的说明,我们先了解一些常用的角色和权限。

数据库读写角色:

  • read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库

数据库管理员角色:

  • dbAdmin:允许用户进行索引创建、删除,查看统计或访问 system.profile,但没有角色和用户管理的权限
  • dbOwner:提供对数据库执行任何操作的能力。这个角色组合了 readWrite、dbAdmin 和 userAdmin 角色授权的特权
  • userAdmin:提供了在当前数据库中创建和修改角色和用户的能力

所有数据库角色:

  • readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
  • readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
  • userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
  • dbAdminAnyDataBase:只在 admin 数据库中可用,赋予用户所有数据库的 adAdmin 权限

超级用户角色:

  • root:只在 admin 数据库中可用,超级用户,拥有超级权限

本文中我们主要用到 root 角色来设置数据库的超级管理员,然后使用 readdbOwner 角色来为某个数据库创建不同权限的用户。

身份验证

开启身份验证

在启动 MongoDB 服务时,通过设置 --auth在命令行中开启身份验证:

$ mongod -f /data/mongodb/mongodb.conf --auth

或者在配置文件开启 security.authorization

security: 
  authorization: enabled
  • authorization:表示是否开启用户访问控制,即客户端是否需要通过用户名和密码验证的方式访问数据库服务。默认为 disabled。

如下,此时 MongoDB 服务已经开启了身份验证:

image-20221110141908071

创建超级管理员用户

MongoDB 开启身份验证后,是没有默认的用户名和密码的,需要自己进行设置

使用 mongosh 连接服务:

$ mongosh

image-20221110143005242

开启验证后,即使不输入用户名密码也能进入到数据库中,但此时没有权限操作数据库,比如:

image-20221110143232244

此时唯一能做的事情就是创建一个超级管理员角色的用户

创建超级管理员需要进入 admin 数据库,然后使用 db.createUser 方法创建用户:

use admin;

db.createUser({
  user: "Kunwu",
  pwd: "abc123",
  roles: [
    { role: "root", db: "admin"}
  ]
});

配置项说明:

  • user:创建的用户名
  • pwd:创建的用户密码
  • roles:设置用户角色信息,是一个数组,可以设置多种角色
  • roles.role:设置用户的角色,MongoDB 提供若干种不同的角色,这里设置为超级用户角色 root
  • roles.db:设置用户权限生效的数据库。由于 root 角色的特殊性,这里只能设置为 admin。但是具备了 root 角色的用户,具有超级权限

image-20221110145315071

使用超级管理员连接服务

开启身份验证后,通过客户端工具(MongoDB Shell、Robo 3T 等)连接到 MongoDB 服务时,需要指定用户名和密码,有两种验证方式。

方式1:连接时验证

在连接数据库服务时指定用户名和验证数据库:

$ mongosh -u Kunwu --authenticationDatabase admin
  • -u/--user:指定用户名
  • --authenticationDatabase:指定验证数据库。验证数据库,就是创建用户时所处的那个数据库

然后命令行中会提示你输入密码:

image-20221110234434581

回车确认即可登录:

image-20221110234527592

也可以直接在命令行通过 -p/--password 来输入密码:

$ mongosh -u Kunwu -p abc123 --authenticationDatabase admin

方式2:连接后验证

先不提供用户名、密码和验证数据库,而是在连接到数据库服务之后,进入验证数据库,使用 db.auth 方法验证用户名和密码。

$ mongosh

验证身份:

use admin;

db.auth('Kunwu', 'abc123');

image-20221110160528461

使用 Robo 3T 连接

创建一个新连接。在 Connection 中输入数据库服务的 IP 和端口:

image-20221110162721247

在第二个 Authentication中依次输入:

  • Database:创建用户时指定的验证数据库
  • User Name:用户名
  • Password:用户密码

image-20221110162403451

然后点击左下角的测试按钮,进行连接测试:

image-20221110162311453

之后就可以使用 Robo 3T 来管理数据库库了。

关于验证数据库的一点补充

验证数据库,就是指创建用户时所处于的那个数据库。比如前文是在 admin 数据库中创建的超级管理员的用户 Kunwu,那么此用户的验证数据库就是 admin。在登录数据库时,authenticationDatabase 就需要指定为 admin

验证数据库并不意味着用户只能操作这一个数据库

MongoDB 中内置了多种角色,创建用户时可以指定多个角色和数据库,此时指定的数据库才是用户能操作的数据库。比如:

db.createUser({
  user: "Kw",
  pwd: "abc123",
  roles: [
    { role: "read", db: "db1"},
    { role: "readWrite", db: "db2"},
    { role: "dbOwner", db: "db2"},
  ]
});

此时,用户 Kw 就能操作 db1、db2、db3 这三个数据库,并且具备不同的权限。

所以,结论就是验证数据库并不等同于用户能操作的数据库,这是两个不相干的概念。

为应用单独创建用户

超级用户具备最高权限,它适合用来管理其他用户,而不应该用来操作具体的数据库。

我们需要为每一个应用创建单独的用户,来使用数据库服务。比如有一个管理系统 manage,可以为它创建多个用户,有的只能读取数据,有的可以读写数据,有的具备完全权限等等。

先以超级管理员身份登录数据库:

$ mongosh -u Kunwu -p abc123 --authenticationDatabase admin

然后为 manage 数据库创建不同的用户:

use manage;

db.create({
  user: 'ManageAdmin',
  pwd: 'admin123',
  roles: [
    { role: "dbOwner", db: 'manage'}
  ]
});

db.create({
  user: 'ManageRead',
  pwd: 'user123',
  roles: [
    { role: "read", db: 'manage'}
  ]
})

dbOwner 角色的用户拥有对 manage 数据库执行任何操作的能力。而 read 角色的用户只能从数据库中读取数据。

使用 manage 数据库的管理员登录:

$ mongosh -u ManageAdmin -p admin123 --authenticationDatabase manage

使用 manage 数据库的其他用户登录:

$ mongosh -u ManageRead -p user123 --authenticationDatabase manage

总结

到此为止,我们简单介绍了 MongoDB 的身份验证和授权的机制。

对于新安装的 MongoDB ,它是没有开启身份验证的。需要进入 admin 数据库,创建一个 root 角色的超级管理员用户。之后再针对具体应用的数据库,使用管理员用户为其创建不同权限的用户,从而做到针对数据库安全的基本保障。

关于角色权限还有很多内容,比如某个角色具体拥有哪些权限,如何创建自定义角色,如何修改用户密码,更新角色等等,大家可以自行访问官网或者查阅其他资料。

感谢观看!

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
9月前
|
安全 NoSQL MongoDB
20 MongoDB高级 - 用户管理安全
20 MongoDB高级 - 用户管理安全
61 1
|
2月前
|
存储 监控 NoSQL
MongoDB索引解析:工作原理、类型选择及优化策略
MongoDB索引解析:工作原理、类型选择及优化策略
|
2月前
|
NoSQL 定位技术 MongoDB
深入探索 MongoDB:高级索引解析与优化策略
深入探索 MongoDB:高级索引解析与优化策略
|
2月前
|
NoSQL 定位技术 MongoDB
解锁MongoDB索引的秘密:优化查询效率与应对限制的策略
解锁MongoDB索引的秘密:优化查询效率与应对限制的策略
|
5天前
|
NoSQL MongoDB
阿里云 MongoDB 创建库添加用户并授权
阿里云 MongoDB 创建库添加用户并授权
11 0
|
3月前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 分片策略与最佳实践
【5月更文挑战第10天】MongoDB 分片是应对大数据量的扩展策略,涉及哈希和范围分片两种策略。分片架构包含分片服务器、配置服务器和路由服务器。最佳实践包括选择合适分片键、监控调整、避免热点数据等。注意数据分布不均和跨分片查询的挑战。通过实例展示了如何在电商场景中应用分片。文章旨在帮助理解并优化 MongoDB 分片使用。
142 3
【MongoDB 专栏】MongoDB 分片策略与最佳实践
|
3月前
|
存储 NoSQL 安全
【MongoDB 专栏】MongoDB 的备份与恢复策略
【5月更文挑战第11天】MongoDB的备份与恢复至关重要,确保数据安全、完整和可用。数据库提供文件级和逻辑备份,前者简单直接但可能需短暂停机,后者灵活可选特定数据。备份策略要考虑频率和存储位置,恢复时要验证数据完整性,选择合适恢复点。增量和差异备份可提升效率,监控管理备份是必要环节。案例显示,有效策略能降低意外损失。随着技术发展,应持续优化策略,强化人员培训,以责任和使命对待备份恢复,保障企业数据环境的安全稳定。
69 1
【MongoDB 专栏】MongoDB 的备份与恢复策略
|
3月前
|
NoSQL 安全 MongoDB
MongoDB安全机制:认证、授权与加密
【4月更文挑战第30天】MongoDB提供全面的安全机制,包括认证(用户名/密码、LDAP、Kerberos、x.509证书)、授权(基于角色的访问控制,RBAC)和加密(TLS/SSL、透明数据加密TDE、字段级加密FLE),确保数据保密性、完整性和可用性。通过合理配置这些机制,企业可保障数据安全,应对不断变化的安全威胁。
|
3月前
|
监控 NoSQL MongoDB
MongoDB索引机制与优化策略详解
【4月更文挑战第30天】本文深入解析MongoDB的索引机制,包括单字段、复合、地理空间、全文及哈希索引。介绍了创建与查看索引的方法,并提出了优化策略:选择性创建、使用复合索引、定期审查优化、避免不必要的索引扫描、利用索引前缀与覆盖索引,以及监控索引使用。通过这些策略,可提升MongoDB查询性能。
|
3月前
|
NoSQL 安全 MongoDB

热门文章

最新文章