Mongodb入门--头歌实验MongoDB数据库安全

MongoDB 默认的启动是不验证用户名和密码的,启动 MongoDB 服务后,可以直接用命令 mongo 连接上来,对所有的库具有 root 权限。

这种情况下数据就像在"裸奔"一样,任何人都能修改我们的数据,所以我们要添加一些限制,来保证我们数据库的安全。本实训就介绍了几种方法来保护我们的数据。

一、创建管理员用户

任务描述

本关任务:在MongoDB数据库中创建一个具有root权限的管理员用户。

相关知识

为了完成本关任务,你需要掌握: 1.如何创建管理员用户; 2.如何查看创建的管理员用户; 3.如何启用身份验证; 4.如何使用管理员身份登录数据库。

创建管理员用户

管理员用户就是负责创建和管理其他用户的用户。

  • 切换到admin数据库(admin数据库是一个具有特殊权限的数据库,用户需要访问它以便执行某些管理命令);
bash 复制代码
use admin

在数据库admin中,创建管理员用户abc,密码为123,拥有root权限。

bash 复制代码
db.createUser({user:"abc",pwd:"123",roles:[{role:"root",db:"admin"}]})

结果如下图说明添加管理员用户成功:

  • 验证管理员用户是否存在:
bash 复制代码
db.auth("abc","123")
  • 如下图,返回为1说明成功。
查看用户

进入admin数据库,查看我们创建的用户:

bash 复制代码
use admin
show users

显示如下图所示:

启用身份验证

启用身份验证是为了保护数据库的安全。

身份验证默认是禁用的,因此要在启动MongoDB数据库服务mongod时使用参数--auth来启用身份验证(启用身份验证前,确保你至少已有一个管理员用户)。

  • 先关闭现在有的数据库服务
bash 复制代码
use admin 
db.shutdownServer()

运行结果如下:

  • 重新启动mongod服务

在命令行输入(下面代码所使用的路径为平台所用路径):

bash 复制代码
mongod --auth --port 27017 --dbpath /data/db --logpath /tmp/mongodb.log --fork
  • auth: 开启身份验证;
  • dbpath: 指定数据存放路径;
  • logpath: 指定日志文件输出路径;
  • fork: 后台运行。
管理员登录数据库
  • 情况一:在命令行连接数据库(注意选择admin数据库);
bash 复制代码
mongo -uabc -p123 admin
  • 情况二:在受限的情况下验证身份;

开启身份验证后,我们使用命令mongo直接连接数据库,虽然也能成功连接,但是在进行数据库操作如show dbs时会受到限制:

这是我们就要进入到admin数据库,去进行身份验证:

bash 复制代码
use admin
db.auth("abc","123")

返回数字1说明验证成功,0说明失败。

验证成功后将拥有管理员权限。

删除管理员用户

删除管理员用户abc命令如下:

bash 复制代码
db.system.users.remove({user:"abc"})

返回1说明删除成功,0说明删除失败。

二、按需求创建普通用户

任务描述

本关任务:根据编程要求创建一个普通用户。

相关知识

为了完成本关任务,你需要掌握: 1.常用的用户权限; 2.如何删除用户。

常用用户权限介绍

第一关我们已经接触了管理员用户的root权限,现在我们再来看看普通用户可拥有的权限。

权限 说明
Read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root 只在admin数据库中可用。超级账号,超级权限
创建普通用户
  • 创建用户:user1,密码:useu1,拥有数据库test的读写权限;
bash 复制代码
use test
db.createUser({user:"user1",pwd:"user1",roles:[{role:"readWrite",db:"test"}]})

注:该用户只对数据库test有权限。

查看用户命令:show users

  • 创建用户:user2,密码:user2,对数据库test2有读写权限,对数据库test有只读权限。
bash 复制代码
use test2
db.createUser({user:"user2",pwd:"user2",roles:[{role:"readWrite",db:"test2"},{role:"read",db:"test"}]})

查看用户命令:show users

删除用户

(要先确定自己有root权限)删除user2用户,先进入test2数据库:

bash 复制代码
use test2
db.dropUser("user2")

结果返回true说明删除成功:

编程要求

根据提示,在右侧命令行进行操作,创建数据库firstdb,再创建一个对其具有只读 权限的普通用户people,密码为people

bash 复制代码
root@evassh-13080431:~# mongo
> use firstdb
switched to db firstdb
> db.createUser({user:"people",pwd:"people",roles:[{role:"read",db:"firstdb"}]})
Successfully added user: {
        "user" : "people",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "firstdb"
                }
        ]
}

三、数据库限制访问

任务描述

本关任务:在命令行进行操作,按照要求对数据库的访问进行限制。

相关知识

为了完成本关任务,你需要掌握: 1.如何限制 IP 访问; 2.如何限制端口访问。

限制 IP 访问,需要重启数据库服务 mongod 时,启用相应的功能,步骤如下:

  • 关闭服务(先用默认方法启动数据库:mongo ):
bash 复制代码
use admin            #进入admin数据库
db.shutdownServer()  #关闭服务
exit                 #退出数据库
  • 启动服务(只有本机 IP 可以连接数据库):
bash 复制代码
mongod --dbpath /data/db --logpath /tmp/mongodb.log --bind_ip 127.0.0.1 --fork
  • binf_ip :限制连接的网络接口,可以设置多个,以逗号隔开。

使用其他 IP 访问被限制,如图1所示:

图 1

限制端口访问

当按照以上方法启动 mongod 时,默认情况下他会等待所有在端口27017上的入站连接,可以用 -port 修改该设置。也需要重新启动 mongod 服务,方法同上。

  • 关闭服务(先用默认方法启动数据库:mongo ):
bash 复制代码
use admin #进入admin数据库
db.shutdownServer() #关闭服务
exit #退出数据库
  • 启动服务(只有本机 IP 可以连接数据库,且限制只能端口20000连接):
bash 复制代码
mongod -port 20000 --dbpath /data/db --logpath /tmp/mongodb.log --bind_ip 127.0.0.1 --fork
  • 连接数据库:
bash 复制代码
mongo 127.0.0.1:20000

设置了端口后如果不加端口连接会被拒绝访问,如图2所示:

图 2

注:在数据库实际的应用中,最好不要使用这些默认设置,对这些设置进行一些修改,让你的数据更加安全。

编程要求

在右侧命令行进行操作:

  • 进入admin数据库,关闭数据库服务(必须先关闭服务);

  • 重新启动服务,限制连接 IP 为:127.0.0.1,限制端口连接为:20018。

bash 复制代码
> use admin
switched to db admin
> db.shutdownServer()
server should be down...
2022-10-13T08:05:25.152+0000 I NETWORK  [js] trying reconnect to 127.0.0.1:20000 failed
2022-10-13T08:05:25.153+0000 I NETWORK  [js] reconnect 127.0.0.1:20000 failed failed 
> exit
bye
root@evassh-13080431:~# mongod -port 20018 --dbpath /data/db --logpath /tmp/mongodb.log --bind_ip 127.0.0.1 --fork
2022-10-13T08:06:44.925+0000 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
about to fork child process, waiting until server is ready for connections.
forked process: 1159
child process started successfully, parent exiting
相关推荐
异世界贤狼转生码农1 小时前
MongoDB Windows 系统实战手册:从配置到数据处理入门
数据库·mongodb
QuZhengRong2 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
码农阿豪2 小时前
Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
数据库·windows
时序数据说7 小时前
时序数据库市场前景分析
大数据·数据库·物联网·开源·时序数据库
听雪楼主.11 小时前
Oracle Undo Tablespace 使用率暴涨案例分析
数据库·oracle·架构
我科绝伦(Huanhuan Zhou)11 小时前
KINGBASE集群日常维护管理命令总结
数据库·database
妖灵翎幺11 小时前
Java应届生求职八股(2)---Mysql篇
数据库·mysql
HMBBLOVEPDX11 小时前
MySQL的事务日志:
数据库·mysql
weixin_4196583113 小时前
MySQL数据库备份与恢复
数据库·mysql
专注API从业者15 小时前
基于 Flink 的淘宝实时数据管道设计:商品详情流式处理与异构存储
大数据·前端·数据库·数据挖掘·flink