启用SCRAM-SHA-256认证是MongoDB全链路防护前提,需在mongod.conf中设security.authorization=true,创建admin用户并验证无凭据连接失败,禁用已弃用的--auth参数。

MongoDB 存储敏感数据时,不能只靠某一层加密或一个配置项就认为“安全了”。真实风险往往出现在链路断点:比如 TLS 加密了传输,但字段在磁盘上明文存储;客户端加密了字段,但连接字符串写死在代码里泄露了密钥;角色权限设得细,却用 root 用户跑应用服务。全链路防护的关键,是把每个环节的默认“开放”行为,显式收束为最小必要动作。
如何启用并验证 SCRAM-SHA-256 认证
这是所有后续防护的前提。MongoDB 默认不启用认证,mongod.conf 中 security.authorization 必须设为 true,否则任何能连上服务的客户端都可任意读写。
- 启动前必须创建管理员用户:用
mongo连本地admin库执行db.createUser({user:"admin",pwd:"StrongPass@2026",roles:["root"]}) - 确认认证生效:重启后尝试无凭据连接,
mongo --host 127.0.0.1:27017应报错not authorized on admin to execute command { listDatabases: 1 } - 避免使用
--auth启动参数(已弃用),它只对旧版有效;新版必须靠配置文件驱动 - SCRAM-SHA-256 是当前唯一推荐机制,旧版 SCRAM-SHA-1 已被标记为不安全,连接驱动需显式指定
authMechanism=SCRAM-SHA-256
为什么字段级加密(CSFLE)比服务端加密更关键
服务端静态加密(如 WiredTiger 加密存储引擎)保护的是磁盘文件,但只要数据库进程有权限,管理员、备份工具、甚至恶意插件仍能以明文访问数据。CSFLE 把加密逻辑压到应用层,密钥不出应用进程,数据库看到的永远是密文。
- 必须配合 KMS 使用:
Mongo::ClientEncryption初始化时要传入 AWS KMS 或本地 Vault 的主密钥,不能硬编码密钥材料 - 确定性加密(
AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic)仅用于等值查询字段(如身份证号),随机加密(-Random)用于其他所有场景 - 加密字段必须声明在 Schema 中,否则
encrypt_expression无法参与查询,且驱动不会自动加解密 - 密钥轮换不是“重装系统”:用
rewrap_many_data_key可批量更新密钥,不影响业务读写
连接字符串和 TLS 配置中哪些参数绝对不能省略
很多团队开了 TLS,却因几个关键参数缺失导致加密形同虚设。攻击者仍可通过中间人劫持或证书绕过拿到明文流量。
-
tls=true和tlsCAFile=/path/to/ca.pem必须同时存在;单独开tls会退化为不校验证书(等价于tlsAllowInvalidCertificates=true) - 连接字符串中必须包含
tlsCertificateKeyFile(客户端证书)和tlsCertificateKeyFilePassword(如有密码),否则驱动不发送证书 - 云服务如 Atlas 要求强制开启
tlsInsecure=false,禁用弱协议(TLS 1.0/1.1)和不安全套件(如!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA) - 禁止在代码里拼接连接字符串:
"mongodb://"+user+":"+pwd+"@host"易引发注入;应统一用 URI 解析库加载环境变量
RBAC 权限分配最容易被忽略的三个细节
权限配得再细,只要一个配置错位,整套模型就失效。常见问题不是“没设权限”,而是“权限范围溢出”。
- 不要给业务用户
readWrite角色:它隐含find、insert、update、delete全部操作,应拆成read+ 显式update(带collMod权限限制字段) - 避免跨库角色继承:一个用户在
admin库有userAdminAnyDatabase,不代表他在orders库自动有读写权;每个库的权限必须独立授予 -
clusterAdmin类角色禁止用于应用连接:它允许shutdown、killOp等运维指令,一旦应用漏洞被利用,等于交出服务器控制权
全链路防护最易崩塌的点,往往不在技术选型,而在配置交接和变更管理——比如开发配好了 CSFLE,运维上线时忘了开 TLS,或者测试环境用了强密码,生产环境却沿用默认配置。每个环节的“显式收敛”必须有人负责验证,而不是依赖文档或口头约定。


















