09、MongoDB数据库加固
Categories:
4 分钟阅读
定位:MongoDB(3.6~8.0)等保三级安全加固手册:按启用访问控制、账户与角色最小化、网络限制、登录失败处理、审计、日志管理、数据备份恢复、服务运行安全分节,每节给出配置与命令、验证方法及社区版能力缺失时的替代措施。
适用版本:MongoDB 3.6~8.0(示例按 4.4+/6.x 写法,版本差异在各节标注)。以社区版为主,企业版差异单独标注。 配套测评:MongoDB 测评。
MongoDB 默认不启用访问控制(无需账号密码即可读写),是等保测评中的高频不符合项,互联网可达时按高风险判定。第一优先级整改就是启用认证。
配置文件(YAML)默认路径 /etc/mongod.conf,修改后 systemctl restart mongod 生效;命令行客户端 mongosh。
使用说明:
- 本文为加固操作手册:所有命令都会修改配置,可能中断服务、断开当前会话或需要重启。实施前必须完成变更审批、确认业务窗口、备份原配置(设备
save与copy running-config/backup startup-configuration,主机备份/etc、注册表与关键业务数据),并准备可执行的回滚预案。- 先在测试环境或单台设备灰度验证,确认无业务影响后再批量推广;每完成一项立即用文中「验证」命令核验生效——配置已下发不等于策略已生效(如 H3C 未
password-control enable、Linux 未对存量账户chage、Windows 未gpupdate /force)。- 示例中的地址、账户名、口令、路径均为演示值(如
PleaseChange@123、192.168.10.20、admin123),现场须替换为符合本单位口令策略与网络规划的真实值,严禁直接沿用文中示例口令;对外发布或归档时须对个人信息与内网管理地址脱敏。- 命令不存在、视图名或参数与本文不一致时,先用
display version/show version/winver确认版本与部署形态,再查阅对应版本官方文档换用等效命令;版本差异不得直接作为「无法整改」的结论,须给出替代措施并评估其实际效果。- 涉及账户、锁定、超时、防火墙与端口收敛的变更存在锁死自身风险:务必保留一条已验证的恢复通道(Console 口、带外管理口、堡垒机会话或另一管理员账户)后再实施。
- 加固完成后按「16、安全评估加固记录表3.0」逐项留痕(整改前后回显、操作人、时间、验证结论、回退情况),并纳入复测;测评判定口径以 GB/T 28448-2019 与《高风险判定指引》为准,本文的「加固要点」不构成最终测评结论。
不适用标识说明:
- 使用
【不适用】明确标记现场可判定为不适用的控制点,并写明判定依据与承载该能力的上位组件。- 依据 GB/T 28448-2019「按测评对象实际承载功能与数据处理范围判定」原则:控制能力由统一认证平台、堡垒机、日志审计系统、终端管理系统、虚拟化平台或云托管平台承载时,应注明测评单元边界后判定不适用或转由上位组件核查,不得机械按缺失判不符合。
- 产品版本确实不提供该能力(如老旧设备无 SNMPv3、无可信根、社区版无审计模块、已停止官方支持的操作系统)时,须核查替代措施并按替代措施的实际效果定档,不得直接判不适用;已停止支持的版本应同时提出升级或补偿控制建议。
一、启用访问控制(最高优先级)
对应控制点:GB/T 22239-2019 8.1.4.2 访问控制 a)~g)(数据库账户、角色与对象权限;三权分立对应 d) 重命名与 e) 敏感标记、f) 授权主体最小化)
加固要点:按最小权限授予:账户只授予其业务所需的库/模式/对象权限与操作类型,禁止对业务账户直接授予 SUPER/SYSDBA/DBA/root 等最高权限;权限变更须经审批并留痕,回收后核验生效。启用数据库自身的访问控制机制限制登录来源(PostgreSQL
pg_hba.conf、KingbaseESsys_hba.conf、MySQL 账户的 host 部分与require_secure_transport、MongoDBnet.bindIp配合主机防火墙、达梦与金仓的 IP 白名单或操作系统层限制),并禁止trust、any、无口令等无鉴别访问方式。敏感数据(个人身份信息、鉴别信息)须打敏感标记或单独建库建表并限制可访问账户。验证方法:权限授予清单(MySQL
SHOW GRANTS FOR 'u'@'h';、PostgreSQL\dp与information_schema.table_privileges、MongoDBdb.getUser()的 roles 字段、达梦与金仓DBA_ROLE_PRIVS/DBA_TAB_PRIVS)与业务需要清单逐项比对;pg_hba.conf/sys_hba.conf全文(应无trust行);从非授权网段或非授权账户发起连接被拒的实测记录;敏感标记或数据分级分类文档。
业务应用账户或普通运维账户持有 SUPER/SYSDBA/DBA/root 等最高权限,或 pg_hba.conf/sys_hba.conf 存在 trust 无鉴别放行行(如 host all all 0.0.0.0/0 trust),攻击者无需口令即可获得数据库完全控制权,按《高风险判定指引》可直接判高风险。
判定口径详见 22、高风险判定指引与加固对照表。
核查方法
grep -A2 "security" /etc/mongod.conf
# 未认证连接测试(应被拒绝)
mongosh --host 192.168.10.10 --eval "db.version()"
示例输出(节选)
$ grep -A2 "security" /etc/mongod.conf
security:
authorization: enabled
$ mongosh --host 192.168.10.10 --eval "db.version()"
MongoServerError: command hello requires authentication
加固操作
- 配置
/etc/mongod.conf开启访问控制并重启:
security:
authorization: enabled
- 重启后用 localhost exception 在本机创建首个管理员账户(仅当系统中尚无用户时生效):
use admin
db.createUser({
user: "sysadmin",
pwd: passwordPrompt(), // 交互输入,避免口令进 shell 历史
roles: [ { role: "root", db: "admin" } ]
})
- 验证:未认证连接执行
show dbs报Unauthorized;认证后正常:
mongosh --host 192.168.10.10 -u sysadmin -p --authenticationDatabase admin
二、账户与角色最小化
对应控制点:GB/T 22239-2019 8.1.4.2 访问控制 a)~g)(数据库账户、角色与对象权限;三权分立对应 d) 重命名与 e) 敏感标记、f) 授权主体最小化)
核查方法
use admin
db.getUsers()
use appdb
db.getRoles({showPrivileges: true})
示例输出(节选)
use admin
db.getUsers()
[
{ user: "sysadmin", db: "admin",
roles: [ { role: "root", db: "admin" } ] },
{ user: "appuser", db: "appdb",
roles: [ { role: "readWrite", db: "appdb" } ] }
]
加固操作
// 业务库专用账户:仅授予所需角色,避免 dbAdminAnyDatabase/root
use appdb
db.createUser({
user: "appuser",
pwd: passwordPrompt(),
roles: [ { role: "readWrite", db: "appdb" } ]
})
// 只读账户
db.createUser({ user: "report", pwd: passwordPrompt(), roles: [ { role: "read", db: "appdb" } ] })
// 删除多余账户
use admin
db.dropUser("废弃用户")
// 禁用 MONGODB-CR 旧认证机制(仅保留 SCRAM-SHA-256),写入 /etc/mongod.conf 后重启:
// setParameter:
// authenticationMechanisms: SCRAM-SHA-256
- 判定标准:无空口令/默认口令;账户按库最小授权;无共享账户;禁用 MONGODB-CR 旧机制。
三、网络限制
对应控制点:GB/T 22239-2019 8.1.4.4 入侵防范 a)~f)(最小安装与组件收敛、监听与端口限制、危险能力关闭、漏洞与补丁管理)
加固要点:按最小化原则收敛数据库暴露面:仅安装业务所需组件(去掉示例库、示例脚本、可选的 Web 管理台与客户端工具),关闭不需要的服务与端口;监听地址限定到业务网段(禁止
0.0.0.0或bindIp: 0.0.0.0直连公网),端口经主机防火墙与边界策略双重限制到应用服务器与运维堡垒机;关闭高危能力(MySQLlocal_infile=OFF并设置secure_file_priv、启用skip_symbolic_links;PostgreSQL 限制COPY ... PROGRAM、lo_import/lo_export、file_fdw;MongoDBsecurity.javascriptEnabled: false并确认未启用旧版 HTTP 接口);建立版本与漏洞台账,跟踪官方安全公告并按变更窗口修补,已停止官方支持的版本须提出升级或补偿控制建议。验证方法:已安装组件与版本清单、监听地址与端口回显(
ss -tlnp或netstat -ano、MySQLSHOW VARIABLES LIKE 'bind_address';、PostgreSQLSHOW listen_addresses; SHOW port;、MongoDBnet.bindIp配置)、主机防火墙与边界策略截图、高危参数当前值回显、漏洞台账与补丁记录、官方安全公告订阅证据(MySQL Release Notes、PostgreSQL 官方邮件列表与 Release Notes、MongoDB Release Notes、达梦与金仓官网公告)。
数据库监听地址为 0.0.0.0 且端口经边界策略直接对互联网或办公终端区开放,同时存在弱口令或默认口令时,按《高风险判定指引》可直接判高风险;MySQL local_infile=ON 且 secure_file_priv 为空,攻击者可借恶意服务端读取客户端任意文件,同样按高风险处理。
判定口径详见 22、高风险判定指引与加固对照表。
核查方法
grep -A4 "^net" /etc/mongod.conf
ss -tlnp | grep 27017
示例输出(节选)
$ grep -A4 "^net" /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.10.10
$ ss -tlnp | grep 27017
LISTEN 0 128 192.168.10.10:27017 0.0.0.0:* users:(("mongod",pid=1826,fd=11))
加固操作(/etc/mongod.conf):
net:
port: 27017
bindIp: 127.0.0.1,192.168.10.10 # 只监听本机与业务网卡,禁 0.0.0.0
tls:
mode: requireTLS # 强制传输加密
certificateKeyFile: /etc/ssl/mongo.pem
CAFile: /etc/ssl/ca.pem
MongoDB 4.2 起配置键为 net.tls(tlsMode: requireTLS、tlsCertificateKeyFile、tlsCAFile);4.0 及更早为 net.ssl(mode: requireSSL、sslPEMKeyFile);8.0 起 net.ssl 已彻底移除。
客户端连接:mongosh --tls --host 192.168.10.10 -u appuser -p --authenticationDatabase appdb
- 配套在主机防火墙限制 27017 来源地址(见 04 号 10 节);改端口属纵深防御,非判定项。
四、登录失败处理
对应控制点:GB/T 22239-2019 8.1.4.1 身份鉴别 b)(提供登录失败处理功能,限制非法登录次数)
加固要点:提供并启用登录失败处理功能:MySQL 8.0 用
connection_control插件(connection_control_failed_connections_threshold建议 3~5,min_connection_delay/max_connection_delay递增延时);PostgreSQL 无内置失败锁定,须以 fail2ban、pgbouncer 或数据库审计系统联动实现,并如实说明替代措施与其实际效果;MongoDB 无内置失败锁定,以net.bindIp配合防火墙限制来源、审计与告警联动实现;达梦用FAILED_LOGIN_ATTEMPS(注意官方关键字拼写少一个 T)与PASSWORD_LOCK_TIME;金仓用 PROFILE 的失败次数与锁定时长。策略须覆盖最高权限账户,并保留一条已验证的恢复通道(本地 socket 登录、单用户维护模式或另一管理员账户),避免锁定即失联。验证方法:失败处理参数回显(
SHOW VARIABLES LIKE 'connection_control%';、\dx确认插件已安装、达梦与金仓的 LIMIT 与 PROFILE 定义)+ 一次真实失败登录实测:连续输错至阈值后确认账户被拒或延时递增,并记录解锁方式与解锁后登录成功;采用替代措施时须附 fail2ban 规则与触发日志(fail2ban-client status <jail>)。
数据库管理入口无任何登录失败处理措施且对全网或互联网开放,可被无限次口令猜测时,按高风险线索记录;失败锁定未覆盖最高权限账户,或未保留本地恢复通道导致锁定即失联,同样记录为高风险线索。
判定口径详见 22、高风险判定指引与加固对照表。
MongoDB 社区版无原生的"失败 N 次锁定账户"机制,测评时应如实说明并给出替代措施,不可虚构参数。
可落地替代方案:
- OS 层 fail2ban 监控 mongod.log 认证失败并封禁来源(配置思路同 14 号 PostgreSQL 篇 1.4,filter 匹配
Authentication failed); - 应用侧连接池限制重试频率;
- 企业版/数据库防火墙的连接控制能力(如有采购)。
五、审计
对应控制点:GB/T 22239-2019 8.1.4.3 安全审计 a)~d)(数据库审计策略、审计记录内容、留存与保护)
加固要点:启用数据库审计并覆盖:用户登录注销、账户与权限变更(DDL/DCL)、对敏感数据与关键表的访问、审计策略自身的修改;审计记录须包含事件日期时间、用户、事件类型、是否成功、客户端地址等要素;审计功能由独立的安全审计员账户管理,系统管理员不得删除或篡改审计记录;审计日志留存不少于 6 个月并定期备份,容量写满时按策略告警而非静默覆盖。社区版无原生审计能力时(PostgreSQL 需 pgAudit、MongoDB 社区版无 auditLog、MySQL 社区版无 audit_log),须部署数据库审计系统、堡垒机或操作系统层审计作为替代,并在报告中写明测评单元边界与替代措施的实际效果。
验证方法:审计开关与审计策略配置回显(PostgreSQL
SHOW shared_preload_libraries;含 pgaudit +pgaudit.log参数 +\dx确认扩展已创建;MySQLSHOW VARIABLES LIKE '%audit%';或企业版audit_log_policy;MongoDB 企业版auditLog配置段;达梦与金仓的审计参数与审计项/审计对象配置结果)+ 一段真实审计记录样例(含时间、用户、来源 IP、操作对象、结果)+ 审计记录留存起始时间与备份记录 + 用系统管理员账户尝试删除审计记录被拒的实测。
数据库未启用任何审计且承载敏感数据,或审计记录可由系统管理员账户自行关闭与删除、留存不足 6 个月,安全事件无法溯源时按高风险线索记录(多与访问控制、剩余信息保护不符合项合并判定)。
判定口径详见 22、高风险判定指引与加固对照表。
核查方法:grep -A6 "auditLog" /etc/mongod.conf;核查日志服务器采集情况。
加固操作
- 企业版支持原生审计(
auditLog):
auditLog:
destination: file
format: JSON
path: /var/log/mongodb/audit.json
filter: '{ atype: { $in: ["authenticate", "createUser", "dropUser", "dropDatabase"] } }'
- 社区版无审计模块:以 mongod 日志(记录连接与慢操作)+ 集中日志服务器采集替代,或前置数据库审计网关。测评判定:社区版仅日志采集一般判部分符合,报告中说明升级/替代计划。
六、日志管理
对应控制点:GB/T 22239-2019 8.1.4.3 安全审计 a)~d)(数据库审计策略、审计记录内容、留存与保护)
核查方法
grep -A6 "systemLog" /etc/mongod.conf
加固操作(/etc/mongod.conf):
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
logRotate: reopen # 配合 SIGUSR1 或 logRotate 命令滚动,不丢日志
kill -SIGUSR1 $(pidof mongod) # 触发日志滚动
- 配合 OS logrotate 保留 ≥6 个月并转发集中日志服务器;
- 时间同步:主机 NTP(见 11 号),保证日志时间准确。
七、数据备份恢复
对应控制点:GB/T 22239-2019 8.1.4.9 数据备份恢复 a)~c)(本地备份、异地实时备份与热冗余)
加固要点:建立并实际执行备份策略:本地定时全量 + 增量或日志备份(MySQL
mysqldump/mysqlpump配合 binlog、PostgreSQLpg_dump/pg_basebackup配合 WAL 归档、MongoDBmongodump配合 oplog 或文件系统快照、达梦与金仓使用自带备份工具),备份文件与主数据分机存放并异地留存(三级要求异地实时备份或热冗余),备份数据同样加密并限制访问权限;每半年至少一次恢复演练并留存演练记录,RTO/RPO 与业务要求匹配。仅有备份脚本而无恢复验证不判符合。验证方法:备份策略与计划任务配置、最近若干次备份任务的执行日志与产物清单(大小、时间、存放位置)、异地备份或热冗余证据(异地备份目录、流复制或副本集状态:
SHOW REPLICA STATUS\G、SELECT * FROM pg_stat_replication;、rs.status())、恢复演练记录(时间、参与人、恢复耗时、数据一致性校验结果)、备份文件权限与加密方式。
核心业务数据库无任何备份,或备份与主数据同机同盘存放、从未做过恢复演练导致备份实际不可用,一旦数据被破坏或遭勒索加密即无法恢复,按《高风险判定指引》可直接判高风险。
判定口径详见 22、高风险判定指引与加固对照表。
核查方法:备份任务与文件时效、恢复演练记录。
加固操作
# 逻辑备份
mongodump --host 192.168.10.10 -u sysadmin -p '口令' --authenticationDatabase admin \
--db appdb --gzip --out /backup/mongo_$(date +%F)
chmod -R 600 /backup/mongo_*
# 副本集增量/时间点恢复依赖 oplog;文件系统快照适合大库
mongorestore --host 192.168.10.10 -u sysadmin -p --authenticationDatabase admin \
--gzip --drop /backup/mongo_2026-08-30/appdb # 恢复演练
- 备份异地存放;三级系统应有副本集(
rs.status()核查)与异地备份。
八、服务运行安全
对应控制点:GB/T 22239-2019 8.1.4.4 入侵防范 a)~f)(最小安装与组件收敛、监听与端口限制、危险能力关闭、漏洞与补丁管理)
核查方法
ps -ef | grep mongod # 应以专用系统账户 mongod 运行,而非 root
ls -ld /var/lib/mongodb # 数据目录权限 750/700
示例输出(节选)
$ ps -ef | grep mongod
mongod 1826 1 0 10:02 ? 00:00:12 /usr/bin/mongod --config /etc/mongod.conf
$ ls -ld /var/lib/mongodb
drwxr-xr-x 4 mongod mongod 4096 8月 30 10:02 /var/lib/mongodb
加固操作
chown -R mongod:mongod /var/lib/mongodb /var/log/mongodb
- 版本核查与升级:
db.version(),对照官方安全通告升级至 LTS 版本(4.4/6.0/7.0)。
测评项对照表
| 控制点 | 对应章节 |
|---|---|
| 身份鉴别:启用身份鉴别、口令唯一与复杂度 | 一、二 |
| 身份鉴别:登录失败处理 | 四 |
| 身份鉴别:远程管理防窃听(TLS) | 三 |
| 访问控制:角色最小化、多余账户清理 | 二 |
| 安全审计:审计与日志留存 | 五、六 |
| 数据备份恢复 | 七 |
| 入侵防范:服务收敛与版本维护 | 三、八 |
参考依据
- GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》(8.1.4 安全计算环境各控制点(数据库管理系统自身安全);涉客户端与服务端通信时另含 8.1.2 安全通信网络):http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=BAFB47E8874764186BDB7865E8344DAF
- GB/T 28448-2019《信息安全技术 网络安全等级保护测评要求》(测评对象边界认定、单元测评实施与结果判定:符合/部分符合/不符合/不适用):http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7E736CDF4502B6FF1258DD250AA3EC8C
- GB/T 22240-2020《信息安全技术 网络安全等级保护定级指南》、GB/T 25070-2019《安全设计技术要求》、GB/T 28449-2018《测评过程指南》,可在全国标准信息公共服务平台检索:http://openstd.samr.gov.cn/bzgk/gb/
- MongoDB 官方手册(Security / Authentication / TLS / Backup):https://www.mongodb.com/docs/
- 《网络安全等级保护测评高风险判定指引》(中关村信息安全测评联盟团体标准)——高风险情形判定口径,站内对照表:22、高风险判定指引与加固对照表
- 命令核验说明:MongoDB 配置项与命令以 MongoDB 官方手册(Security / Configuration File Options / Backup)核验(核验日期 2026-09-02)。五处须留意:① 启用鉴权前必须先创建管理员账户,否则
localhost exception关闭后将无人可登录,须用单节点维护方式(临时移除authorization、本地创建账户、再开启并重启)恢复,实施前务必确认已建账;②net.bindIp在 3.6 之前的默认值为127.0.0.1,3.6 及以后默认不绑定(等效全网可达),升级到新版本后若未显式配置bindIp,数据库会直接暴露,须逐台核查db.serverCmdLineOpts();③ 社区版不提供auditLog,也无内置登录失败锁定与口令复杂度校验,测评时不得据「参数不存在」判不符合,应核查替代措施(企业版审计、数据库审计系统、堡垒机、fail2ban、应用侧策略)并按替代措施的实际效果定档;④keyFile要求文件权限 600 且属主为运行账户,权限不满足时副本集内部认证会静默失效,配置后须以rs.status()确认节点健康;⑤ 3.6 起已移除 HTTP 状态接口,若沿用旧配置文件中的net.http.enabled,新版本会启动失败,升级前须清理废弃参数。