mongodump输出流本身不加密,必须通过管道外接gpg或openssl实时加密;其--archive或--out生成的BSON/JSON文件均为明文,含密码哈希、手机号等敏感字段,仅靠文件名或目录权限无法保障安全。
mongodump 输出流本身不支持加密,必须在管道外加一层加密处理。直接用 --archive 或 --out 生成的文件全是明文 BSON/JSON,连密码哈希、手机号字段都原样裸露,靠“改文件名”或“放私有目录”根本挡不住有权限的内部人员或入侵者。
mongodump 没有 --encrypt、--password-protected 这类参数。官方明确不提供运行时加密能力——它只负责“结构化导出”,安全交由外部工具链补足。
.bson、.json、--archive 二进制)均可被 bsondump、jq、strings 直接解析--archive 文件不是加密容器,只是把多个 BSON 流打包成单文件,xxd 一扫就能看到字段名和部分值mongodump ... | gzip 也不行:gzip 压缩 ≠ 加密,解压后仍是明文核心思路是让 mongodump 的输出不落地为明文,而是直连加密命令的标准输入,加密结果再写入文件。这样全程无临时明文备份文件。
openssl enc(系统普遍自带):mongodump --uri "mongodb://user:pass@host/db" --archive | openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -salt -out backup-$(date +%Y%m%d).archive.enc
gpg(适合密钥管理场景):mongodump --uri "mongodb://user:pass@host/db" --archive | gpg --cipher-algo AES256 --compress-algo 1 --symmetric --armor --output backup-$(date +%Y%m%d).archive.asc
openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -in backup-20260512.archive.enc | mongorestore --archive --dryRun
再强的 -aes-256-cbc 也扛不住弱口令。实际中常见三个坑:
openssl enc -pass pass:mypass123 —— 密码会出现在 ps aux 和 shell history 中-pass env:BACKUP_PASS 但环境变量被子进程继承泄露 —— 改用 -pass stdin,从 cat ~/.backup-key | head -n1 读取(该文件必须 chmod 600)-salt)和迭代次数(-iter):不加 -salt 会导致相同密码生成相同密文,易被彩虹表攻击;-iter 100000 是当前防暴力破解的合理下限加密只是第一步。如果加密后的文件权限是 644,或放在 NFS 共享目录里,等于把锁好的保险箱钥匙挂在门把手上。
chmod 600 backup-20260512.archive.enc
sha256sum backup-20260512.archive.enc > backup-20260512.archive.enc.sha256
openssl enc -d -in backup-20260512.archive.enc -k "testpass" 2>/dev/null | head -c 100 | grep -q 'ns' && echo "OK"(检查 BSON 头部是否可解析)最麻烦的不是选哪个加密命令,而是确保密码输入过程不被记录、加密文件不被误 chmod、解密脚本不把密钥 echo 出来——这些细节漏掉一个,前面所有加密操作就归零。