近期 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}}'

业务测试