欢迎光临
我们一直在努力

等保测评命令——MongoDB数据库

依据 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 账户与密码策略

测评项

MongoDB 查询语句

达标判据

检查用户账户列表

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 登录失败处理

测评项

MongoDB 查询语句

达标判据

检查审计日志配置

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 远程管理安全

测评项

MongoDB 查询语句

达标判据

检查监听地址

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 权限管理与角色分离

测评项

MongoDB 查询语句

达标判据

查看角色列表

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 审计配置检查

测评项

MongoDB 查询语句

达标判据

检查审计是否启用

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 配置安全与漏洞修复

测评项

MongoDB 查询语句

达标判据

检查版本信息

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 加密配置检查

测评项

MongoDB 查询语句

达标判据

检查静态加密(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 副本集配置检查

测评项

MongoDB 查询语句

达标判据

查看副本集成员

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版本差异说明

功能项

MongoDB 4.4

MongoDB 5.0

MongoDB 6.0

MongoDB 7.0

默认认证

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 角色

赞(0)
未经允许不得转载:171主机测评 » 等保测评命令——MongoDB数据库
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址