必须启用data-at-rest加密防御物理窃取,云数据库依赖kms平台开关且不支持回退,自建需配置encryption引擎与756字节keyfile;云盘加密可被挂载绕过,tde才真正保护数据页级密文。

MongoDB 数据文件被物理窃取的风险,只靠访问控制或网络加密无法防御——必须启用 Data-at-Rest(静态数据)加密。云数据库(如阿里云 MongoDB)和自建部署的 MongoDB 实例,实现方式完全不同,不能混用配置;且一旦启用,密钥不可更换、功能不可关闭,务必在操作前确认依赖和影响。
云数据库(阿里云/腾讯云/华为云等)开启 TDE 的前提条件
云厂商提供的存储加密本质是“云盘层 + KMS 层”协同,不是 MongoDB 自身的加密存储引擎。你无法通过修改 mongod.conf 启用,而是依赖平台控制台开关:
- 必须已开通并授权对应云厂商的
KMS服务,且授予MongoDB_QCSLinkedRoleInKMS(或类似角色)权限 - 实例版本需为
MongoDB 4.4及以上;6.0和7.0支持更细粒度密钥策略,但不改变基础加密行为 - 开通前自动备份方式不能设为“物理备份”,开通后也无法切换回物理备份——因为物理备份会绕过 TDE 解密逻辑,导致备份不可用
- 已存在的集合、索引、WiredTiger 文件不会被 retroactively 加密;只有新写入的数据块才走加密流程
自建 MongoDB 启用 Encrypted Storage Engine 的实操要点
这是 MongoDB 官方原生支持的存储加密方案(Enterprise Advanced 或社区版 6.0+),它在 WiredTiger 引擎之上叠加 AES-256-CBC 加密,但对客户端完全透明:
- 配置中必须显式设置
security.enableEncryption: true和security.encryptionCipherMode: AES256-CBC,仅靠storage.engine: wiredTiger不生效 -
keyFile必须是 756 字节随机二进制内容(openssl rand -base64 756),不能是 PEM 格式证书或文本密码;权限必须为400,否则启动失败报错Failed to load encryption key file - 首次启用时,MongoDB 会拒绝启动如果数据目录中已有非加密的
wiredTiger.wt文件——必须清空数据目录或使用--repair+ 导出导入迁移 - 不支持热启用:修改配置后必须停机重启
mongod,且重启失败会导致实例无法恢复,切勿在生产环境跳过测试验证
为什么不能只靠云盘加密?TDE 和云盘加密的区别在哪
云盘加密(如阿里云 ESSD 加密、AWS EBS 加密)是 IaaS 层能力,而 MongoDB TDE 是 PaaS 层加密。二者关键差异直接决定防护效果:
- 云盘加密保护的是整个磁盘块,但只要攻击者获得云账号权限并挂载该云盘到另一台 ECS,就能绕过 MongoDB 认证直接读取
collection-*.wt文件明文——因为解密发生在块设备驱动层 - TDE 加密的是 WiredTiger 内部 page 级别数据,即使挂载磁盘,打开
.wt文件看到的仍是密文;密钥由 KMS 或本地keyFile控制,与磁盘生命周期解耦 - 云盘加密无法满足部分合规要求(如等保三级要求“应用层加密”),而 TDE 明确属于数据库层加密,审计时可单独举证
- 混合使用时注意性能叠加:云盘加密 + TDE 会带来双重加解密开销,QPS 下降可能超 15%,建议压测后再上线
加密后仍可能泄露的三个盲区
启用 TDE 并不等于数据高枕无忧,以下环节未加固,物理窃取后仍可能被还原:
- 内存 dump:MongoDB 进程运行时,解密后的文档会常驻内存;若攻击者能获取服务器 root 权限并执行
gcore或/proc/[pid]/mem读取,敏感字段仍可提取 - 日志文件:
mongod.log默认不加密,若开启slowOpThresholdMs或logLevel: 1,查询语句中的filter可能含明文 ID、手机号等 - 备份文件:云数据库的逻辑备份(mongodump 输出)默认不加密;自建环境若用
mongodump --gzip,压缩包本身未加密,需额外用gpg或openssl enc封装
真正防物理窃取,核心是让攻击者即使拿到裸磁盘、备份包、内存镜像,也无法定位有效密钥或构造合法解密上下文——这意味着密钥管理比加密开关本身更重要,而 KMS 的密钥禁用策略、keyFile 的文件锁和 SELinux 上下文,才是最后一道防线。











