6.5.7 备份存储、加密与权限控制
本节重点说明备份介质与存储方案设计、加密策略与密钥管理、访问权限控制与审计要求,确保备份数据的保密性、完整性与可用性。
备份存储方案与介质选择#
原理草图(备份多副本与分层存储):
示例:本地+对象存储(S3)上传流程
# 1) 生成备份并压缩
backup_dir=/data/backup/mysql
mkdir -p $backup_dir
mysqldump -uroot -p'Passw0rd!' --single-transaction --routines --events \
--databases appdb | gzip > $backup_dir/appdb_$(date +%F_%H%M).sql.gz
# 2) 安装并配置 awscli(对象存储)
yum -y install awscli
aws configure set aws_access_key_id AKIAxxxx
aws configure set aws_secret_access_key xxxxxxxxx
aws configure set region ap-southeast-1
# 3) 上传到对象存储(带进度)
aws s3 cp $backup_dir/ s3://mysql-backup/appdb/ --recursive --only-show-errors
# 预期效果:备份文件在 S3 桶 mysql-backup/appdb/ 下可见
排错要点:
- aws s3 cp 403:检查 AccessKey 权限与桶策略。
- 上传慢:检查带宽与多线程参数,使用 aws s3 cp --expected-size 优化。
- 本地备份磁盘满:df -h,设置日志清理与保留策略。
练习:
1) 将备份改为按周归档到 s3://mysql-backup/weekly/。
2) 模拟断网后重试上传,并记录失败文件列表。
存储规范与保留策略#
示例:目录与命名规范
# 目录:业务/实例/类型/日期
# 例如:/data/backup/appdb/primary/full/2024-12-01
base=/data/backup/appdb/primary
mkdir -p $base/full/$(date +%F) $base/incr/$(date +%F)
# 命名:库名_类型_时间戳
fname=appdb_full_$(date +%F_%H%M).sql.gz
示例:保留策略(7天日备,4周周备)
# 清理 7 天前的日备
find /data/backup/appdb/primary/full -type f -mtime +7 -name "*.gz" -delete
# 清理 28 天前的周备
find /data/backup/appdb/primary/weekly -type f -mtime +28 -name "*.gz" -delete
排错要点:
- 删除误删:先用 -print 验证匹配范围,再加 -delete。
- 目录过多:用 tree -L 3 检查层级是否符合规范。
练习:
1) 将保留周期改为:日备14天、周备8周、月备12个月。
2) 写一条命令输出“即将过期的备份文件列表”。
备份加密与密钥管理#
原理草图(传输加密+存储加密):
示例:使用 OpenSSL 对称加密备份文件
# 生成备份
file=/data/backup/appdb/appdb_full_$(date +%F_%H%M).sql.gz
# 加密(AES-256-CBC)
openssl enc -aes-256-cbc -salt -pbkdf2 -in $file -out ${file}.enc -k 'StrongPass!'
# 解密(恢复时)
openssl enc -d -aes-256-cbc -pbkdf2 -in ${file}.enc -out ${file}.dec -k 'StrongPass!'
# 预期效果:.enc 文件可上传,解密后可正常恢复
示例:使用 GPG 公钥加密(便于多管理员协作)
# 安装
yum -y install gnupg
# 导入公钥并加密
gpg --import /etc/keys/backup_admin_pubkey.asc
gpg --recipient backup-admin --encrypt /data/backup/appdb/appdb_full_*.sql.gz
排错要点:
- bad decrypt:检查口令是否一致或文件损坏。
- GPG 找不到密钥:gpg --list-keys 确认公钥已导入。
练习:
1) 将加密口令改为从环境变量读取。
2) 使用 sha256sum 生成校验文件并验证。
权限控制与访问隔离#
示例:备份专用账号(最小权限)
-- 仅允许备份读取
CREATE USER 'backup'@'10.0.%' IDENTIFIED BY 'BkP@ssw0rd';
GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES ON *.* TO 'backup'@'10.0.%';
FLUSH PRIVILEGES;
示例:文件系统权限隔离
# 备份目录只允许备份用户访问
useradd -r -s /sbin/nologin backup
mkdir -p /data/backup/appdb
chown -R backup:backup /data/backup/appdb
chmod 700 /data/backup/appdb
排错要点:
- 备份失败:检查 MySQL 权限是否包含 LOCK TABLES。
- 上传失败:检查备份用户是否有目录写权限。
练习:
1) 配置不同业务备份目录权限隔离。
2) 模拟误用 root 备份并修正为备份账号执行。
审计与合规要求#
示例:备份操作审计(系统层)
# 开启历史命令记录并集中审计
export HISTTIMEFORMAT="%F %T "
echo "PROMPT_COMMAND='history -a'" >> /etc/profile
# 备份与恢复操作记录(示例)
logger -t mysql-backup "backup started: appdb $(date +%F_%T)"
示例:完整性校验
# 生成校验
sha256sum /data/backup/appdb/*.sql.gz > /data/backup/appdb/SHA256SUMS
# 校验
sha256sum -c /data/backup/appdb/SHA256SUMS
排错要点:
- 校验失败:说明备份损坏或被篡改,需重备。
- 日志缺失:检查 rsyslog 或 auditd 是否正常。
练习:
1) 为每次备份生成校验文件并上传到对象存储。
2) 设计“备份审计清单”,包含人、时间、文件、校验值。
风险控制与最佳实践#
- 备份文件禁止直接存放于数据库主机默认目录,需与主库物理隔离。
- 定期验证备份可恢复性,避免“可备不可恢复”。
- 关键业务备份采用多副本与跨地域存储,避免区域性故障导致不可用。
- 建议每月进行一次恢复演练,并记录 RTO/RPO 达标情况。