引子:为了解决MongoDB的两个漏洞决定把MongoDB升级至最新版本,期间也踩了不少坑,在这里分享出来供大家学习与避坑~
漏洞1:MongoDB Server 安全漏洞(CVE-2021-20330)
漏洞2:MongoDB Server 安全漏洞(CVE-2021-32036)
我们生产环境使用的是4.0.23
版本,正好是漏洞版本~官方虽然已经发布了补丁链接,但是还是看不懂里面的内容,不知道怎么修复。并且从ChatGPT
得知升级版本是最好的解决办法。于是决定把MongoDB升级到最新版本。
数据的备份与还原是必须的,版本升级后需要把历史数据还原到新版本中。然而我们只是把MongoDB作为文件存储服务,并没有存储核心的业务数据,只涉及到一个数据库和3个集合,因此备份与还原用mongoexport
和mongoimport
命令就好了,例如
cd bin
# 备份集合 fileList 的数据(存储自定义的文件元信息)
./mongoexport --host 21.48.141.63:27017 -u file -p ah@123$ -d file -c fileList -o ../back/fileList.json
# 备份集合 fs.files 的数据(GridFS存储的meta数据)
./mongoexport --host 21.48.141.63:27017 -u file -p ah@123$ -d file -c fs.files -o ../back/fs.files.json
# 备份集合 fs.chunks 的数据(GridFS存储的二进制数据)
./mongoexport --host 21.48.141.63:27017 -u file -p ah@123$ -d file -c fs.chunks -o ../back/fs.chunks.json
# 命令参数说明
# -h 或者是 --host 指定MongoDB服务的ip和端口
# -u 指定认证的用户名
# -p 指定认证的密码
# -d 指定数据库
# -c 指定集合
# -o 指定导出的文件名和路径
备份好后,可以移动到指定的目录。然后直接把4.0.23
版本全部删掉。
mv back/ ../
rm -rf mongodb
直接从官方文档下载合适的版本即可,不一定是5.0.19版本的~
# 例如下载地址
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.19.tgz
1、上传到服务器后解压,解压命令如下
tar -zxvf mongodb-linux-x86_64-rhel70-5.0.19.tgz
mv mongodb-linux-x86_64-rhel70-5.0.19 mongodb
2、新建MongoDB必要的目录
cd mongodb
mkdir data
mkdir logs
3、编写MongoDB的配置文件
vi mongodb.conf
MongoDB 5.0版本修改了配置文件书写格式,各项可配置项如下
# 日志输出文件路径
systemLog:
destination: file
logAppend: true
path: /opt/app/mongodb/logs/mongodb.log
# 数据库路径
storage:
dbPath: /opt/app/mongodb/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true # 开启守护进程
pidFilePath: /opt/app/mongodb/data/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017 #端口号
bindIp: 0.0.0.0
# 开启认证 必选先添加用户
#security:
#authorization: enabled
暂时先关闭认证功能,新增完用户再开启~
4、启动MongoDB服务
cd mongodb
bin/mongod -f ./mongodb.conf
启动过程中如果遇到如下错误,则需要安装openssl10
error while loading shared libraries: libcrypto.so.10: cannot open shared object file ...
5、安装openssl10
下载地址:https://mirrors.tuna.tsinghua.edu.cn/centos/8-stream/AppStream/x86_64/os/Packages/
找到高亮的下载文件(如下图所示),然后下载
下载完后上传到服务器的任意目录
su root
rpm -i compat-openssl10-1.0.2o-3.el8.x86_64.rpm
重新启动MongoDB服务
bin/mongod -f ./mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 297058
child process started successfully, parent exiting
# 出现以上提示信息代表启动成功了
6、验证是否启动成功
ps -ef|grep mongodb
# 得的 mongodb 进程信息
# 关闭MongoDB服务时可直接杀死进程
7、创建数据库与用户
这一步也是必须的,后面我们都会用这个用户访问MongoDB服务
cd mongodb
cd bin
./mongo
# 创建 file 数据库
use file
# 为 file 数据库创建 root 用户
db.createUser({user: "root", pwd: "root", roles: ["readWrite", "dbAdmin"]})
# 为 file 数据库创建 file 用户
db.createUser({user: "file", pwd: "ah@123", roles: ["readWrite", "dbAdmin"]})
8、开启MongoDB的认证功能
新建完用户后,我们就可以关闭MongoDB服务,修改配置文件开启MongoDB的认证功能。
vi mongodb.conf
# 日志输出文件路径
systemLog:
destination: file
logAppend: true
path: /opt/app/mongodb/logs/mongodb.log
# 数据库路径
storage:
dbPath: /opt/app/mongodb/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true # 开启守护进程
pidFilePath: /opt/app/mongodb/data/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017 #端口号
bindIp: 0.0.0.0
# 开启认证,必选先添加用户
security:
authorization: enabled
重新启动MongoDB服务。
至此所有的安装与配置都完成了,就可以使用客户端工具进行访问了~
查看所有MongoDB命令
[app@app mongodb]$ cd bin
[app@app bin]$ ls
install_compass mongo mongod mongos
我们发现5.0版本只有基础的几个工具,新版mongodb中不再包含导入导出工具,需要单独下载安装。
下载地址https://www.mongodb.com/try/download/database-tools
上传到MongoDB的根目录下,进行解压,解压命令如下
tar -zxvf mongodb-database-tools-rhel70-x86_64-100.7.5.tgz
mv mongodb-database-tools-rhel70-x86_64-100.7.5 tools
# 新命令在 tools/bin 目录下
还原数据
cd mongoddb
cd tools/bin
# 还原集合 fileList 数据
./mongoimport --host 21.48.141.63:27017 -u file -p ah@123 -d file -c fileList --file /opt/app/back/fileList.json
# 还原集合 fs.files 数据
./mongoimport --host 21.48.141.63:27017 -u file -p ah@123 -d file -c fs.files --file /opt/app/back/fs.files.json
# 还原集合 fs.chunks 数据
./mongoimport --host 21.48.141.63:27017 -u file -p ah@123 -d file -c fs.chunks --file /opt/app/back/fs.chunks.json
# 命令参数说明
# --host 指定MongoDB服务的ip和端口
# -u 指定认证的用户
# -p 指定认证的用户密码
# --file 指定需要导入的文件
ok大功告成~