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 达标情况。