mysqldump本身不加密,备份文件默认明文,防泄露需权限隔离+管道实时加密+密钥分离;备份目录须移出web根目录并设700权限,严禁明文落地,推荐mysqldump | gpg/openssl流式加密,密码和密钥不得硬编码,必须定期验证还原。

mysqldump 本身不加密,备份文件默认明文——只要文件被拿到,数据库就等于裸奔。防泄露不能只靠“藏”,得靠权限隔离 + 实时加密 + 密钥分离。
备份文件别放 Web 目录里,否则直接被下载
常见错误:把 backup.sql 放在 /var/www/html/backup/ 下,Nginx/Apache 会把它当静态资源返回。用户拼个 URL 就能下载,和 MySQL 无关,是部署疏漏。
- 把备份目录挪到 Web 根目录外,例如
/data/backups/mysql/或/home/mysql/backups/ - 执行
ls -ld /data/backups/mysql/,确保权限是700或750,且属主为mysql,非 www-data 用户不可读 - 检查 Nginx/Apache 配置,确认没有
alias或rewrite规则意外映射到该路径
用 gpg 或 openssl 做管道加密,避免明文落地
先写成文件再加密,中间存在窗口期——进程、日志、临时文件都可能暴露内容。正确做法是让 mysqldump 输出直通加密工具,不落盘明文。
-
mysqldump --login-path=backup mydb | gpg --cipher-algo AES256 --symmetric --compress-algo 1 > backup_$(date +%F).sql.gpg(--compress-algo 1启用 ZIP 压缩,减小体积、隐藏数据模式) -
mysqldump --login-path=backup mydb | gzip | openssl enc -aes-256-cbc -pbkdf2 -salt -out backup_$(date +%F).sql.gz.enc(注意:-pbkdf2仅 OpenSSL 1.1.1+ 支持,旧版密钥派生弱) - 解密还原必须验证:例如
gpg -d backup_2026-06-15.sql.gpg | gunzip | mysql --login-path=restore mydb,不能只测能否解密,要测能否成功导入
密码和密钥绝不能硬编码在脚本里
mysqldump -u root -p'123' 这类写法,密码会出现在 ps aux 和 bash history 中;GPG/openssl 密码写死在脚本里,等于把锁芯贴在门上。
- MySQL 凭据用
mysql_config_editor set --login-path=backup --user=backup_user --password存进~/.mylogin.cnf(自动设权限600),脚本中统一用--login-path=backup - GPG 对称密码不要用
--passphrase参数传,改用--batch --passphrase-fd 0从安全管道注入;或用 GPG 密钥对,公钥加密、私钥离线保管 - OpenSSL 密码交互输入,禁用
-k或-K明文传参
加密不是终点,密钥和验证才是薄弱环节
生成一个 .gpg 文件只是开始。如果密钥丢了,备份等于废纸;如果从没试过还原,出事时才发现语法错、权限错、字符集错。
- GPG 密钥 ID、OpenSSL 加密参数、MySQL 版本、字符集(
--default-character-set=utf8mb4)必须随备份一起记录,存放在独立安全位置 - 密钥绝不和备份同机存储——U 盘离线保管、或用硬件安全模块(HSM)托管
- 每月至少一次用生产级数据抽样还原:解密 → 导入 → 抽查几条敏感字段(如手机号哈希值)是否一致











