mysqldump默认644权限极易导致敏感数据泄露,必须立即chmod 600;应使用专用低权用户、加密(openssl aes-256-cbc加-salt和-pbkdf2)、哈希混淆文件名、安全路径及安全清理旧备份。

mysqldump 输出文件权限太松,别人能直接 cat
默认 mysqldump 生成的 SQL 文件权限是 -rw-r--r--(644),只要服务器上有普通用户账号,就能读取备份内容——尤其是含密码、手机号、身份证等敏感字段的 dump 文件。这不是“可能泄露”,而是“只要能登录服务器就大概率已泄露”。
实操建议:
- dump 完立即改权限:
chmod 600 /backup/20240515_prod.sql - 用
--single-transaction+--skip-lock-tables避免锁表,但权限控制不能靠参数补救 - 别把备份存到
/tmp或 Web 可访问目录(如/var/www/html/backups/),这些路径默认可被其他用户或 Web 进程读取 - 如果用 cron 自动备份,确保执行用户是专用低权账号(比如
mysql-backup),且其 home 目录不可被其他用户进入
用 openssl aes-256-cbc 加密 dump 文件最稳妥
MySQL 本身不提供备份加密(mysqlpump 也不支持),得靠外部工具。openssl aes-256-cbc 是当前最通用、兼容性好、命令行易集成的选择;比 gpg 更轻量,比自研脚本更可靠。
常见错误现象:用 openssl enc -aes-256-cbc -in data.sql -out data.sql.enc 后发现解密失败——大概率是没加 -salt 或漏了 -pbkdf2(OpenSSL 1.1.1+ 推荐)。
实操建议:
- 加密命令必须带
-salt和-pbkdf2:mysqldump -u root -p db_name | openssl enc -aes-256-cbc -pbkdf2 -salt -out backup.sql.enc - 解密时需完整复现参数:
openssl enc -d -aes-256-cbc -pbkdf2 -salt -in backup.sql.enc | mysql -u root -p db_name - 密码别硬编码在脚本里,用
read -s交互输入,或从受限权限的配置文件(chmod 400)中读取 - 注意 OpenSSL 版本差异:1.0.x 默认用 md5 衍生密钥,1.1.1+ 默认用 pbkdf2;跨版本解密失败多因这个
备份用户权限最小化:别用 root 账号跑 mysqldump
很多脚本直接写 mysqldump -uroot -p...,一旦密码泄漏或备份脚本被读取,攻击者就拿到全库 DDL+DML 权限,甚至能通过 SELECT ... INTO OUTFILE 写 shell。
使用场景:只备份业务库 order_db,不需要操作 mysql 系统库或其它租户库。
实操建议:
- 建专用用户:
CREATE USER 'bkp_user'@'localhost' IDENTIFIED BY 'strong_pass'; - 只赋 SELECT 权限:
GRANT SELECT ON order_db.* TO 'bkp_user'@'localhost'; FLUSH PRIVILEGES; - 禁用危险权限:确认该用户没有
FILE、PROCESS、SUPER、REPLICATION CLIENT等非必要权限 - 连接时显式指定 host:
mysqldump -ubkp_user -p -h localhost order_db,避免走 socket 被绕过 TCP 层限制
备份文件名和路径暴露数据库结构
像 /backup/prod_user_20240515.sql.enc 这种命名,等于告诉别人:“这里有用户表,而且是生产环境”。结合文件大小、修改时间,还能反推数据量变化趋势——对渗透测试者很有价值。
性能与安全折中点:完全随机文件名影响运维定位,但明文暴露库/表名又太危险。
实操建议:
- 用哈希混淆关键信息:
dbname=$(echo "order_db" | sha256sum | cut -c1-8),生成类似/backup/ba7816bf_20240515.enc - 路径层级别藏真实含义:
/backup/core/20240515/比/backup/order_db/更安全,只要内部文档不外泄即可 - 定期清理旧备份时,别只删文件,用
shred -u(Linux)或srm(macOS)覆盖再删,防止 ext4/xfs 日志残留 - 如果用 rsync 同步到异地,加
--omit-dir-times和--no-perms,避免远端继承本地宽松权限
真正难的不是加个加密命令,而是让整个备份链路——从 MySQL 用户权限、dump 过程、文件落地、存储路径到归档策略——没有一处默认值在裸奔。稍有疏忽,加密文件名里的一个下划线都可能成为突破口。











