MongDB4.2.25->4.4.30二进制升级测试
近期 MongoDB 曝出 未认证内存读取高危漏洞,影响版本范围广、风险等级高。博主作为运维实施,陆续收到多家客户在漏洞扫描中的反馈,需要 尽快完成漏洞修复与补丁升级,以满足安全合规要求。
在公司 标准交付体系 中,MongoDB 通常以 Pod 方式部署,并且知识库中已沉淀了 完整的漏洞修复与镜像适配 SOP,相关升级操作相对成熟、完善
然而,本次涉及的一家客户属于 非标准交付场景:
该环境为 裸机部署,且未采用标准 MongoDB 容器化方式,无法直接套用既有的镜像升级流程。因此,需要针对该环境 单独设计并验证二进制升级方案。
本文主要记录模拟客户环境中 MongoDB 4.2.25 升级至 4.4.30 的二进制升级与测试过程,分享在 裸机部署场景下 的升级修复思路、实施步骤及验证结果。
漏洞信息:
一、4.2.25版本安装
下载4.2.25版本安装包(ky10)
mkdir -p /data/mongodb4/{bin,conf,data,log,run}
mkdir /data/mongodb4-install && cd $_
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.25.tgz解压安装包
tar -xzf mongodb-linux-x86_64-rhel70-4.2.25.tgz
# 拷贝可执行文件
cp mongodb-linux-x86_64-rhel70-4.2.25/bin/* /data/mongodb4/bin/创建运行用户
# 创建用户、用户主
groupadd mongod
useradd -g mongod mongod
# 修改目录属主
chown -R mongod:mongod /data/mongodb4修改环境变量
# 分别在root用户和mongod用户下执行
cat >> ~/.bashrc <<EOF
export PATH=$PATH:/data/mongodb4/bin
EOF
# source
tail -5 ~/.bashrc && source ~/.bashrc创建 MongoDB 配置文件
vim /data/mongodb4/conf/mongod.conf
systemLog:
destination: file
path: /data/mongodb4/log/mongod.log
logAppend: true
storage:
dbPath: /data/mongodb4/data
journal:
enabled: true
processManagement:
pidFilePath: /data/mongodb4/run/mongod.pid
net:
port: 27017
bindIp: 0.0.0.0
security:
authorization: enabled
keyFile: /data/mongodb4/conf/mongodb-keyfile
replication:
replSetName: rs0创建keyFile文件
# 生成 keyFile
openssl rand -base64 756 > /data/mongodb4/conf/mongodb-keyfile
# 修改权限
chown mongod:mongod /data/mongodb4/conf/mongodb-keyfile
chmod 400 /data/mongodb4/conf/mongodb-keyfile创建 systemd 服务
vim /usr/lib/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Server
After=network.target
[Service]
Type=simple
User=mongod
Group=mongod
ExecStart=/data/mongodb4/bin/mongod -f /data/mongodb4/conf/mongod.conf
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=on-failure
RestartSec=3
LimitNOFILE=64000
[Install]
WantedBy=multi-user.target启动服务
systemctl daemon-reload
systemctl start mongod
systemctl enable mongod
systemctl status mongod初始化副本集
# 编辑 /data/mongodb4/conf/mongod.conf 将 security.authorization 注释掉
systemctl restart mongod
mongo
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "172.17.7.239:27017" }
]
})
rs.status()创建用户
mongo
use admin
db.createUser({
user: "appuser",
pwd: "password",
roles: [{ role: "root", db: "admin" }]
})
# 再启用鉴权
# 恢复 security.authorization: enabled 并重启
systemctl restart mongod
# 验证
mongo -u appuser -p password --authenticationDatabase admin二、业务环境接入测试
以helm交付的临时业务环境为例
mongodb数据导出
mongodb_user="root"
mongodb_password="password"
namespace="appns"
DATE_TIME=$(date +%F)
POD_NAME=$(kubectl get pod -l app=mongodb -n $namespace -o jsonpath={.items[0].metadata.name})
kubectl exec $POD_NAME -n $namespace -- sh -c "mongodump -u$mongodb_user -p$mongodb_password --authenticationDatabase admin --gzip -o /tmp/app_mongodb_${DATE_TIME}"
kubectl exec $POD_NAME -n $namespace -- sh -c "cd /tmp && tar zcf app_mongodb_${DATE_TIME}.tar.gz mastergo_mongodb_${DATE_TIME}"
kubectl cp $POD_NAME:/tmp/mastergo_mongodb_${DATE_TIME}.tar.gz /tmp/app_mongodb_${DATE_TIME}.tar.gz -n $namespace
kubectl exec $POD_NAME -n $namespace -- sh -c "rm -rf /tmp/app_mongodb_*"
ls -lh app_mongodb_${DATE_TIME}.tar.gz导入mongodb数据
tar xf /tmp/app_mongodb_2026-01-07.tar.gz -C /tmp
cd /data/mongodb4/bin
mongorestore -uappuser -ppassword --authenticationDatabase admin --gzip --drop /tmp/app_mongodb_2026-01-07修改values
global:
config:
mongodb:
host: "172.17.7.239"
port: "27017"
user: "appuser"
pass: "password"
replicaset: rs0
#mongodb:
# enable: false重新部署
cd /data/app/v1.0.0-pri
helm upgrade -i app --timeout 20m -n appns -f ../values-private.yaml ./app-privatization重启服务
kubectl get deploy -n appns|egrep -v 'minio|postgresql'|awk 'NR>1{print "kubectl rollout restart deploy -n appns "$1}'|bash三、升级前备份
mongodb数据导出备份
cd /data/mongodb4-install
mongodb_user="appuser"
mongodb_password="password"
DATE_TIME=$(date +%F)
mongodump -u$mongodb_user -p$mongodb_password --authenticationDatabase admin --gzip -o ./app_mongodb_${DATE_TIME}
tar zcf app_mongodb_${DATE_TIME}.tar.gz ./app_mongodb_${DATE_TIME}
ls -lh app_mongodb_${DATE_TIME}.tar.gz业务停服
# 关闭mongodb
systemctl stop mongod
systemctl status mongod
# 关闭deploy资源
kubectl get deploy -n appns|awk 'NR>1{print $1}'|xargs -i kubectl patch deploy {} -n appns -p '{"spec":{"replicas":0}}'备份bin目录
cd /data/mongodb4-install/
tar -xzf mongodb-linux-x86_64-rhel70-4.4.30.tgz
# 备份旧二进制
mv /data/mongodb4/bin /data/mongodb4/bin_4.2.25_$(date +%F_%H%M%S)四、4.4.30升级
更新mongo二进制
# 创建新 bin 目录
mkdir /data/mongodb4/bin
# 拷贝 4.4.30 可执行文件
cp mongodb-linux-x86_64-rhel70-4.4.30/bin/* /data/mongodb4/bin/
# 修正权限
chown -R mongod:mongod /data/mongodb4确认版本
/data/mongodb4/bin/mongod --version
#db version v4.4.30启动服务
systemctl daemon-reload
systemctl start mongod
systemctl status mongod登录验证
mongo -u appuser -p password --authenticationDatabase admin检查版本
db.version()查看日志是否有升级异常
tail -n 200 /data/mongodb4/log/mongod.log五、恢复业务
恢复deploy资源
kubectl get deploy -n appns|egrep "minio|postgresql"|awk '{print $1}'|xargs -i kubectl patch deploy {} -n appns -p '{"spec":{"replicas":1}}'
kubectl get deploy -n appns|egrep -v "NAME|minio|postgresql"|awk '{print $1}'|xargs -i kubectl patch deploy {} -n appns -p '{"spec":{"replicas":3}}'业务测试
功能兼容版本升级(可选)(无必须使用的4.4特性,非安全要求不变更)
db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })
# 应为{ "featureCompatibilityVersion" : { "version" : "4.2" }, "ok" : 1 }
# 修改为4.4
db.adminCommand({ setFeatureCompatibilityVersion: "4.4" })
# 确认修改
db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })六、回滚方案
确认 FCV 版本
mongo -u appuser -p password --authenticationDatabase admin
db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })情况一:FCV 仍为 4.2
业务停服
# 关闭deploy资源
kubectl get deploy -n appns|awk 'NR>1{print $1}'|xargs -i kubectl patch deploy {} -n appns -p '{"spec":{"replicas":0}}'停止 MongoDB 服务
systemctl stop mongod
systemctl status mongod回滚 MongoDB 二进制
# 备份当前 4.4.30 bin
mv /data/mongodb4/bin /data/mongodb4/bin_4.4.30_rollback_$(date +%F_%H%M%S)
# 恢复 4.2.25 二进制
mv /data/mongodb4/bin_4.2.25_* /data/mongodb4/bin启动 MongoDB(4.4.30)
systemctl start mongod
systemctl status mongod验证版本与副本集状态
mongo -u appuser -p password --authenticationDatabase admin
db.version()
rs.status()
db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })恢复业务
kubectl get deploy -n appns|egrep "minio|postgresql"|awk '{print $1}'|xargs -i kubectl patch deploy {} -n appns -p '{"spec":{"replicas":1}}'
kubectl get deploy -n appns|egrep -v "NAME|minio|postgresql"|awk '{print $1}'|xargs -i kubectl patch deploy {} -n appns -p '{"spec":{"replicas":3}}'接口测试
情况二:FCV 已升级到 4.4
使用 4.4.30 导出数据
cd /data/mongodb4-install
mongodb_user="appuser"
mongodb_password="password"
DATE_TIME=$(date +%F)
mongodump -u$mongodb_user -p$mongodb_password --authenticationDatabase admin --gzip -o ./app_mongodb_${DATE_TIME}
tar zcf app_mongodb_${DATE_TIME}.tar.gz ./app_mongodb_${DATE_TIME}
ls -lh app_mongodb_${DATE_TIME}.tar.gz业务停服
# 关闭deploy资源
kubectl get deploy -n appns|awk 'NR>1{print $1}'|xargs -i kubectl patch deploy {} -n appns -p '{"spec":{"replicas":0}}'停止 MongoDB 服务
systemctl stop mongod
systemctl status mongod清空数据目录
mv /data/mongodb4/data /data/mongodb4/data_4.4_backup_$(date +%F)
mkdir /data/mongodb4/data
chown -R mongod:mongod /data/mongodb4/data恢复 4.2.25 二进制
mv /data/mongodb4/bin /data/mongodb4/bin_4.4.30_abandon
mv /data/mongodb4/bin_4.2.25_2026-01-07_xxxxxx /data/mongodb4/bin启动 MongoDB(4.2.25)
# 编辑 /data/mongodb4/conf/mongod.conf 将 security.authorization 注释掉
systemctl start mongod创建用户
mongo
use admin
db.createUser({
user: "appuser",
pwd: "password",
roles: [{ role: "root", db: "admin" }]
})
# 再启用鉴权
# 恢复 security.authorization: enabled 并重启
systemctl restart mongod
# 验证
mongo -u appuser -p password --authenticationDatabase admin初始化副本集
mongo
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "172.17.7.239:27017" }
]
})导入数据
tar xf /tmp/mastergo_mongodb_2026-01-07.tar.gz -C /tmp
cd /data/mongodb4/bin
mongorestore -uappuser -ppassword --authenticationDatabase admin --gzip --drop /tmp/app_mongodb_2026-01-07业务启动
kubectl get deploy -n appns|egrep "minio|postgresql"|awk '{print $1}'|xargs -i kubectl patch deploy {} -n appns -p '{"spec":{"replicas":1}}'
kubectl get deploy -n appns|egrep -v "NAME|minio|postgresql"|awk '{print $1}'|xargs -i kubectl patch deploy {} -n appns -p '{"spec":{"replicas":3}}'业务测试
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 咸鱼博客
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

