依据 GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》等保2.0三级 标准,针对 MongoDB 4.x/5.x/6.x/7.x 给出可直接落地的测评查询语句清单。
注意:MongoDB 使用 BSON/JSON 格式,以下采用 MongoDB Shell 的 db.command() 语法和聚合管道,所有命令均可在 mongo 或 mongosh 中直接执行。
一、身份鉴别(8.1.4.1)
1.1 账户与密码策略
|
检查用户账户列表 |
db.getUsers() |
无默认空账户,应用账户独立 |
|
检查用户认证方式 |
db.getUser("username").mechanisms |
SCRAM-SHA-256/SCRAM-SHA-1 |
|
查看密码复杂度参数 |
db.adminCommand({getParameter: 1, authenticationMechanisms: 1}) |
启用强认证机制 |
|
检查密码有效期 |
db.getUser("username").credentials |
查看凭证更新时间 |
详细查询语句:
// 1. 查看所有数据库用户(需 userAdminAnyDatabase 权限)
use admin
db.getUsers({showCredentials:false,showPrivileges:true})
// 2. 查看特定用户详细信息
db.getUser("app_user",{showCredentials:true})
// 3. 查看认证机制配置
db.adminCommand({getParameter:1,authenticationMechanisms:1})
// 期望返回:{ "authenticationMechanisms" : [ "SCRAM-SHA-256", "SCRAM-SHA-1" ] }
// 4. 查看当前启用的安全机制
db.adminCommand({getParameter:"*"}).security
// 5. 检查是否启用本地主机例外
db.adminCommand({getParameter:1,enableLocalhostAuthBypass:1})
// 生产环境应返回:{ "enableLocalhostAuthBypass" : false }
1.2 登录失败处理
|
检查审计日志配置 |
db.adminCommand({getParameter: 1, auditLogDestination: 1}) |
启用审计 |
|
查看连接数限制 |
db.serverStatus().connections |
限制最大连接数 |
|
检查慢查询阈值 |
db.adminCommand({getParameter: 1, slowOpThresholdMs: 1}) |
配置合理阈值 |
// 6. 查看当前连接数和限制
db.serverStatus().connections
// 返回示例:{ "current" : 5, "available" : 51195, "totalCreated" : 8, "active" : 2 }
// 7. 查看系统连接参数限制
db.adminCommand({getParameter:1,maxConns:1})
// 8. 查看操作超时配置
db.adminCommand({getParameter:1,cursorTimeoutMillis:1})
// 9. 查看网络超时配置
db.adminCommand({getParameter:1,netTimeout:1})
1.3 远程管理安全
|
检查监听地址 |
db.serverStatus().host
+ netstat |
非 0.0.0.0 |
|
检查TLS/SSL配置 |
db.adminCommand({getParameter: 1, sslMode: 1}) |
requireSSL |
|
查看端口配置 |
db.adminCommand({getParameter: 1, port: 1}) |
非默认27017或已限制 |
// 10. 查看服务器状态和监听信息
db.serverStatus().host
db.serverStatus().transportSecurity
// 11. 查看TLS/SSL配置(关键)
db.adminCommand({getParameter:1,sslMode:1})
// 期望返回:{ "sslMode" : "requireSSL" } 或 "preferSSL"
// 12. 查看TLS详细配置
db.adminCommand({getParameter:1,sslPEMKeyFile:1})
db.adminCommand({getParameter:1,sslCAFile:1})
db.adminCommand({getParameter:1,sslAllowInvalidCertificates:1})
// 必须返回 false,不允许无效证书
// 13. 查看网络压缩配置(传输加密相关)
db.adminCommand({getParameter:1,networkMessageCompressors:1})
二、访问控制(8.1.4.2)
2.1 权限管理与角色分离
|
查看角色列表 |
db.getRoles({showPrivileges: true}) |
角色分离清晰 |
|
检查用户权限 |
db.getUser("username").roles |
最小权限原则 |
|
查看内置角色使用 |
db.adminCommand({rolesInfo: 1, showBuiltinRoles: true}) |
避免过度使用root |
|
检查数据库级权限 |
db.getUsers() |
按库分配权限 |
// 14. 查看所有自定义角色(需 hostManager 权限)
use admin
db.getRoles({rolesInfo:1,showPrivileges:true,showBuiltinRoles:false})
// 15. 查看特定角色权限详情
db.getRole("dbAdmin",{showPrivileges:true})
// 16. 查看所有内置角色(检查是否滥用)
db.adminCommand({rolesInfo:1,showBuiltinRoles:true})
// 17. 查看特定用户权限分配
use production_db
db.getUser("app_readonly").roles
// 18. 查看权限继承关系
db.getRoles({rolesInfo:1,showPrivileges:true}).forEach(function(role){
printjson({
role: role.role,
db: role.db,
privileges: role.privileges,
roles: role.roles// 继承的角色
});
})
// 19. 检查是否存在 superuser/root 滥用
db.getUsers().forEach(function(user){
var hasRoot = user.roles.some(function(r){
return r.role==="root"|| r.role==="__system";
});
if(hasRoot){
print("WARNING: User "+ user.user+" has root privileges");
}
})
2.2 数据库与集合级访问控制
// 20. 查看数据库列表(检查未授权访问)
show dbs
// 或使用:db.adminCommand({listDatabases: 1})
// 21. 查看特定数据库的集合列表
use sensitive_db
show collections
// 或使用:db.getCollectionNames()
// 22. 查看集合级访问控制(如果启用)
db.getCollectionInfos({name:"sensitive_collection"})
db.runCommand({collMod:"sensitive_collection",validator:{}})
// 23. 查看文档级安全(字段级加密配置)
db.getCollection("encrypted_collection").getOptions()
三、安全审计(8.1.4.3)
3.1 审计配置检查
|
检查审计是否启用 |
db.adminCommand({getParameter: 1, auditLogDestination: 1}) |
file/syslog/console |
|
查看审计格式 |
db.adminCommand({getParameter: 1, auditFormat: 1}) |
JSON/BSON |
|
检查审计过滤 |
db.adminCommand({getParameter: 1, auditFilter: 1}) |
覆盖关键操作 |
|
查看审计日志路径 |
db.adminCommand({getParameter: 1, auditPath: 1}) |
安全路径,权限600 |
// 24. 查看审计系统状态(企业版功能)
db.adminCommand({getParameter:1,auditLogDestination:1})
// 期望返回:{ "auditLogDestination" : "file" } 或 "syslog"
// 25. 查看审计详细配置
db.adminCommand({getParameter:"*"}).auditLogDestination
db.adminCommand({getParameter:1,auditFormat:1})// JSON或BSON
db.adminCommand({getParameter:1,auditPath:1})// 日志路径
db.adminCommand({getParameter:1,auditFilter:1})// 审计过滤器
// 26. 查看当前审计过滤器详情
db.adminCommand({getParameter:1,auditFilter:1})
// 期望覆盖:authCheck, authenticate, createUser, dropUser, createRole, dropRole
// 27. 检查审计日志轮转
db.adminCommand({getParameter:1,auditLogRotateInterval:1})
// 28. 查看系统日志配置(社区版替代方案)
db.adminCommand({getParameter:1,systemLogDestination:1})
db.adminCommand({getParameter:1,systemLogPath:1})
db.adminCommand({getParameter:1,systemLogVerbosity:1})
3.2 操作日志分析
// 29. 查看系统日志中的认证事件(需配置verbosity)
db.adminCommand({setParameter:1,logComponentVerbosity:{accessControl:{verbosity:1}}})
// 30. 查看Profiler状态(慢查询审计)
db.getProfilingStatus()
// 返回示例:{ "was" : 1, "slowms" : 100, "sampleRate" : 1.0 }
// 31. 查看Profiler记录(如果启用)
db.system.profile.find().sort({ts:-1}).limit(10)
// 32. 查看当前操作(实时监控)
db.currentOp({active:true})
db.currentOp({secs_running:{$gt:60}})// 运行超过60秒的操作
// 33. 查看最近完成的操作
db.adminCommand({aggregate:1,pipeline:[{$currentOp:{allUsers:true,localOps:false}}],cursor:{}})
四、入侵防范(8.1.4.4)
4.1 配置安全与漏洞修复
|
检查版本信息 |
db.version() |
官方支持版本 |
|
查看构建信息 |
db.serverBuildInfo() |
无危险编译选项 |
|
检查JavaScript引擎 |
db.serverStatus().javascript |
生产环境建议禁用 |
|
查看存储引擎 |
db.serverStatus().storageEngine |
WiredTiger(推荐) |
// 34. 查看MongoDB版本(关键安全指标)
db.version()
// 检查是否为官方支持版本:4.4+(4.4 EOL 2024/2)、5.0+、6.0+、7.0+
// 35. 查看详细构建信息
db.serverBuildInfo()
// 检查:opensslVersion, javascriptEngine, modules (enterprise)
// 36. 查看服务器状态概览
db.serverStatus().version
db.serverStatus().process// mongod/mongos
db.serverStatus().pid
// 37. 检查JavaScript执行(安全风险)
db.serverStatus().javascript
// 期望返回:{ "engine" : "none" } 或确保未启用 server-side JS 执行
// 38. 查看是否启用服务器端JS执行
db.adminCommand({getParameter:1,javascriptEnabled:1})
// 生产环境应返回:{ "javascriptEnabled" : false }
// 39. 查看存储引擎配置
db.serverStatus().storageEngine
// 期望:name: "wiredTiger", persistent: true
// 40. 查看WiredTiger详细配置
db.serverStatus().wiredTiger
4.2 网络安全配置
// 41. 查看网络绑定配置
db.adminCommand({getParameter:1,bindIp:1})
// 期望返回特定IP,非 "0.0.0.0" 或空
// 42. 查看端口配置
db.adminCommand({getParameter:1,port:1})
// 43. 查看是否启用IPv6
db.adminCommand({getParameter:1,ipv6:1})
// 44. 查看WireTiger缓存配置(DoS防护)
db.adminCommand({getParameter:1,wiredTigerCacheSizeGB:1})
// 45. 查看最大连接数限制
db.adminCommand({getParameter:1,maxConns:1})
// 46. 查看网络超时设置
db.adminCommand({getParameter:1,netTimeout:1})
db.adminCommand({getParameter:1,socketTimeoutSecs:1})
五、数据安全(8.1.4.5/8.1.4.8)
5.1 加密配置检查
|
检查静态加密(Encryption at Rest) |
db.serverStatus().encryption |
启用 |
|
查看字段级加密(Client-Side FLE) |
db.getCollectionInfos() |
敏感字段加密 |
|
检查传输加密 |
db.serverStatus().transportSecurity |
1(TLS启用) |
|
查看密钥管理 |
db.adminCommand({getParameter: 1, encryptionKeyFile: 1}) |
密钥文件安全存储 |
// 47. 查看静态加密状态(企业版)
db.serverStatus().encryption
// 或检查:db.serverStatus().wiredTiger.encryption
// 48. 查看传输层安全状态
db.serverStatus().transportSecurity
// 返回 1 表示启用TLS
// 49. 查看TLS统计
db.serverStatus().network.numTLSConnections
// 50. 查看字段级加密配置(Client-Side Field Level Encryption)
db.getCollectionInfos({name:"collection_with_fle"}).forEach(function(info){
printjson(info.options.encryptedFields);
});
// 51. 查看加密密钥管理配置
db.adminCommand({getParameter:1,encryptionKeyFile:1})// 本地密钥文件
db.adminCommand({getParameter:1,kmipServerName:1})// KMIP密钥管理
db.adminCommand({getParameter:1,vaultServerName:1})// HashiCorp Vault
// 52. 查看Queryable Encryption状态(6.0+)
db.adminCommand({getParameter:1,queryableEncryptionEnabled:1})
5.2 数据备份与恢复
// 53. 查看副本集状态(高可用与备份)
rs.status()
// 检查:members健康状态,priority配置
// 54. 查看Oplog状态(逻辑备份基础)
rs.printReplicationInfo()
// 或:db.getReplicationInfo()
// 55. 查看备份配置(如果使用mongodump/mongoexport)
// 检查文件系统权限,非MongoDB查询
// 56. 查看快照配置(如果使用文件系统快照/WiredTiger备份)
db.serverStatus().wiredTiger.snapshotWindowSettings
六、高可用与容灾(8.1.4.9)
6.1 副本集配置检查
|
查看副本集成员 |
rs.conf() |
≥3节点,异地部署 |
|
检查优先级配置 |
rs.conf().members[].priority |
主节点优先级合理 |
|
查看仲裁节点 |
rs.conf().members[].arbiterOnly |
适当使用仲裁 |
|
检查延迟节点 |
rs.conf().members[].slaveDelay |
存在延迟备份节点 |
// 57. 查看副本集完整配置
rs.conf()
// 关键检查项:_id, members数组长度, protocolVersion
// 58. 查看副本集运行状态
rs.status()
// 关键检查项:myState, members.health, members.stateStr
// 59. 检查节点优先级配置
rs.conf().members.forEach(function(member){
printjson({
host: member.host,
priority: member.priority,
arbiterOnly: member.arbiterOnly||false,
slaveDelay: member.slaveDelay||0,
hidden: member.hidden||false,
votes: member.votes
});
});
// 60. 查看副本集同步状态
rs.printSlaveReplicationInfo()
// 或:rs.printSecondaryReplicationInfo() (5.0+)
// 61. 检查Oplog大小(影响恢复窗口)
db.oplog.rs.stats().maxSize
// 建议:足够容纳24-48小时操作
// 62. 查看分片集群配置(如适用)
sh.status()
sh.getBalancerState()
七、一键巡检脚本(MongoDB Shell版)
// MongoDB 等保三级一键巡检脚本
// 执行方式:mongo –eval "$(cat inspection_mongodb.js)" 或 mongosh
var inspection_results ={
timestamp:newDate(),
database: db.getName(),
version: db.version(),
checks:[]
};
functionaddCheck(category, item, status, detail){
inspection_results.checks.push({
category: category,
item: item,
status: status,// PASS/FAIL/WARN
detail: detail
});
var color = status ==="PASS"?"\\033[32m":(status ==="FAIL"?"\\033[31m":"\\033[33m");
var reset ="\\033[0m";
print(color +"["+ status +"]"+ reset +" "+ category +" – "+ item);
if(detail)print(" "+ detail);
}
print("==========================================");
print(" MongoDB 等保三级巡检脚本");
print(" 时间: "+ inspection_results.timestamp);
print(" 版本: "+ inspection_results.version);
print("==========================================");
// 1. 身份鉴别检查
print("\\n===== 1. 身份鉴别 =====");
try{
var authMech = db.adminCommand({getParameter:1,authenticationMechanisms:1});
if(authMech.authenticationMechanisms&& authMech.authenticationMechanisms.length>0){
addCheck("身份鉴别","认证机制","PASS",
"启用: "+ authMech.authenticationMechanisms.join(", "));
}else{
addCheck("身份鉴别","认证机制","FAIL","未启用认证机制");
}
}catch(e){
addCheck("身份鉴别","认证机制","WARN","无法获取配置: "+ e.message);
}
try{
var localhostBypass = db.adminCommand({getParameter:1,enableLocalhostAuthBypass:1});
if(localhostBypass.enableLocalhostAuthBypass===false){
addCheck("身份鉴别","本地主机例外","PASS","已禁用");
}else{
addCheck("身份鉴别","本地主机例外","FAIL","已启用,生产环境应禁用");
}
}catch(e){
addCheck("身份鉴别","本地主机例外","WARN","检查失败: "+ e.message);
}
try{
var users = db.getUsers();
var rootUsers = users.users.filter(function(u){
return u.roles.some(function(r){return r.role==="root";});
});
if(rootUsers.length<=2){
addCheck("身份鉴别","root用户数量","PASS","共"+ rootUsers.length+"个root用户");
}else{
addCheck("身份鉴别","root用户数量","WARN","存在"+ rootUsers.length+"个root用户,建议审查");
}
}catch(e){
addCheck("身份鉴别","用户检查","FAIL","权限不足: "+ e.message);
}
// 2. 访问控制检查
print("\\n===== 2. 访问控制 =====");
try{
var roles = db.getRoles({rolesInfo:1,showPrivileges:true});
addCheck("访问控制","角色管理","PASS","共"+ roles.roles.length+"个自定义角色");
}catch(e){
addCheck("访问控制","角色管理","WARN","无法获取角色: "+ e.message);
}
try{
var allUsers = db.getUsers();
var privilegedUsers = allUsers.users.filter(function(u){
return u.roles.some(function(r){
return["root","userAdminAnyDatabase","dbAdminAnyDatabase"].indexOf(r.role)>=0;
});
});
addCheck("访问控制","特权用户审查","PASS",
"共"+ privilegedUsers.length+"个高权限用户需人工复核");
}catch(e){
addCheck("访问控制","用户权限","FAIL","检查失败: "+ e.message);
}
// 3. 安全审计检查
print("\\n===== 3. 安全审计 =====");
try{
var auditDest = db.adminCommand({getParameter:1,auditLogDestination:1});
if(auditDest.auditLogDestination){
addCheck("安全审计","审计配置","PASS",
"目的地: "+ auditDest.auditLogDestination);
}else{
addCheck("安全审计","审计配置","WARN","未配置审计(企业版功能)");
}
}catch(e){
addCheck("安全审计","审计配置","WARN","非企业版或检查失败");
}
try{
var profiler = db.getProfilingStatus();
if(profiler.was>0){
addCheck("安全审计","Profiler状态","PASS",
"级别: "+ profiler.was+", 慢查询阈值: "+ profiler.slowms+"ms");
}else{
addCheck("安全审计","Profiler状态","WARN","Profiler未启用");
}
}catch(e){
addCheck("安全审计","Profiler","WARN","检查失败");
}
// 4. 入侵防范检查
print("\\n===== 4. 入侵防范 =====");
try{
var jsEnabled = db.adminCommand({getParameter:1,javascriptEnabled:1});
if(jsEnabled.javascriptEnabled===false){
addCheck("入侵防范","服务器端JavaScript","PASS","已禁用");
}else{
addCheck("入侵防范","服务器端JavaScript","FAIL","已启用,建议禁用");
}
}catch(e){
addCheck("入侵防范","JavaScript检查","WARN","无法获取配置");
}
try{
var bindIp = db.adminCommand({getParameter:1,bindIp:1});
if(bindIp.bindIp&& bindIp.bindIp!=="0.0.0.0"){
addCheck("入侵防范","网络绑定","PASS","绑定: "+ bindIp.bindIp);
}else{
addCheck("入侵防范","网络绑定","FAIL","绑定0.0.0.0或配置不当");
}
}catch(e){
addCheck("入侵防范","网络绑定","WARN","检查失败");
}
try{
var sslMode = db.adminCommand({getParameter:1,sslMode:1});
if(sslMode.sslMode&& sslMode.sslMode!=="disabled"){
addCheck("入侵防范","TLS/SSL","PASS","模式: "+ sslMode.sslMode);
}else{
addCheck("入侵防范","TLS/SSL","FAIL","未启用TLS/SSL");
}
}catch(e){
addCheck("入侵防范","TLS/SSL","FAIL","未配置加密传输");
}
// 5. 数据安全检查
print("\\n===== 5. 数据安全 =====");
try{
var transportSec = db.serverStatus().transportSecurity;
if(transportSec ===1){
addCheck("数据安全","传输加密","PASS","TLS连接已建立");
}else{
addCheck("数据安全","传输加密","WARN","当前连接未使用TLS");
}
}catch(e){
addCheck("数据安全","传输加密","WARN","无法检测");
}
try{
var storageEngine = db.serverStatus().storageEngine.name;
addCheck("数据安全","存储引擎","PASS","使用: "+ storageEngine);
}catch(e){
addCheck("数据安全","存储引擎","WARN","检查失败");
}
// 6. 高可用检查
print("\\n===== 6. 高可用与备份 =====");
try{
var rsStatus = rs.status();
if(rsStatus.members&& rsStatus.members.length>=3){
var healthy = rsStatus.members.filter(function(m){return m.health===1;}).length;
addCheck("高可用","副本集状态","PASS",
healthy +"/"+ rsStatus.members.length+"节点健康");
}else{
addCheck("高可用","副本集状态","WARN","副本集节点少于3个");
}
}catch(e){
addCheck("高可用","副本集","WARN","非副本集部署或检查失败: "+ e.message);
}
// 总结
print("\\n==========================================");
print(" 巡检完成");
print("==========================================");
var pass = inspection_results.checks.filter(function(c){return c.status==="PASS";}).length;
var fail = inspection_results.checks.filter(function(c){return c.status==="FAIL";}).length;
var warn = inspection_results.checks.filter(function(c){return c.status==="WARN";}).length;
print("统计: PASS="+ pass +", FAIL="+ fail +", WARN="+ warn);
// 导出结果(可选)
// printjson(inspection_results);
高风险项重点核查清单
| 未启用认证 | db.adminCommand({getParameter: 1, authenticationMechanisms: 1}) |
返回空数组或错误 |
配置 security.authorization: enabled |
| 允许本地例外 | db.adminCommand({getParameter: 1, enableLocalhostAuthBypass: 1}) |
返回 true |
设置为 false |
| 绑定0.0.0.0 | db.adminCommand({getParameter: 1, bindIp: 1}) |
返回 0.0.0.0 |
绑定特定IP地址 |
| 未启用TLS | db.adminCommand({getParameter: 1, sslMode: 1}) |
返回 disabled |
配置 net.tls.mode: requireTLS |
| 启用服务器端JS | db.adminCommand({getParameter: 1, javascriptEnabled: 1}) |
返回 true |
设置为 false |
| 审计未启用 | db.adminCommand({getParameter: 1, auditLogDestination: 1}) |
返回空(企业版) |
启用审计日志 |
| 存在root滥用 | db.getUsers()
检查roles |
应用账户有root角色 |
按最小权限分配角色 |
| 副本集节点不足 | rs.status().members.length |
小于3 |
增加副本节点 |
| Oplog过小 | db.oplog.rs.stats().maxSize |
小于48小时操作量 |
增大Oplog大小 |
| 未配置慢查询 | db.getProfilingStatus() | was: 0 |
启用Profiler |
MongoDB版本差异说明
|
默认认证 |
SCRAM-SHA-256 |
SCRAM-SHA-256 |
SCRAM-SHA-256 |
SCRAM-SHA-256 |
|
Queryable Encryption |
不支持 |
不支持 |
支持 |
增强 |
|
时序集合 |
不支持 |
支持 |
增强 |
增强 |
|
审计日志 |
企业版 |
企业版 |
企业版 |
企业版 |
|
字段级加密(FLE) |
支持 |
支持 |
增强 |
增强 |
|
集群加密(Encryption at Rest) |
本地/KMIP |
本地/KMIP/Vault |
增强 |
增强 |
|
安全增强 |
基础 |
基础 |
增强 |
增强 |
常用命令速查
// 连接与认证
mongo mongodb://user:pass@host:port/db –authenticationDatabase admin
mongosh "mongodb://host:port"–username user –authenticationDatabase admin
// 用户管理
db.createUser({user:"user",pwd:"pass",roles:[{role:"readWrite",db:"db"}]})
db.dropUser("user")
db.changeUserPassword("user","newpass")
// 角色管理
db.createRole({role:"custom",privileges:[],roles:[]})
db.grantRolesToUser("user",[{role:"read",db:"other"}])
// 系统状态
db.serverStatus()
db.currentOp()
db.killOp(opid)
// 副本集
rs.initiate()
rs.add("host:port")
rs.remove("host:port")
rs.reconfig(config)
rs.stepDown()
// 分片
sh.enableSharding("db")
sh.shardCollection("db.collection",{key:1})
sh.status()
// 备份恢复(操作系统命令)
// mongodump –host host –out /backup/
// mongorestore –host host /backup/
// mongoexport –collection=col –out=col.json
// mongoimport –collection=col –file=col.json
参考标准:GB/T 22239-2019、GB/T 28448-2019、MongoDB Security Checklist、CIS MongoDB Benchmark
适用版本:MongoDB 4.4 LTS、5.0、6.0、7.0(社区版/企业版)
执行权限:多数命令需 clusterAdmin 或 userAdminAnyDatabase 角色





