需求背景
在linux上,需要对明文的备份文件(例如数据库的备份文件)进行加密存储。
备选方案
1、openssl aes加密
2、gpg加密
出于最低成本考虑,最终选择了openssl aes加密方式。
openssl aes加密实操
加密方式如下:
代码语言:bash复制# 密码
encrypt_passwd="Abcd9876"
# 原始文件
original_file="devops-dba-dump_2024-01-24_backup"
# 加密后的文件
encrypted_file=${original_file}_encrypt
# 加密压缩DEMO
cat ${original_file} | gzip -c | openssl enc -aes-256-cbc -salt -pass pass:${encrypt_passwd} -out ${encrypted_file}
# mysqldumo备份,可以使用类似下面这种
# mysqldump -u$mysql_user --set-gtid-purged=OFF --hex-blob --master-data=2 -q --single-transaction -p$mysql_passwd --databases $dbname | gzip -c | openssl enc -aes-256-cbc -salt -pass pass:${encrypt_passwd} -out ${back_dir}/${sqlfile}.gz
# 解密解压缩DEMO
# openssl enc -d -aes-256-cbc -salt -in ${encrypted_file} -pass pass:${encrypt_passwd} | gunzip > ${original_file}hi
注意:
对于高版本的openssl,如果使用 -salt 参数,可能会出现如下的告警:
代码语言:bash复制*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
这种情况下,可以再加个参数 -pbkdf2 -iter 10000 如下:
代码语言:bash复制cat ${original_file} | gzip -c | openssl enc -aes-256-cbc -salt -pbkdf2 -iter 1000 -pass pass:${encrypt_passwd} -out ${encrypted_file}
-pbkdf2 和 -iter 1000 选项则告诉 OpenSSL 使用 PBKDF2 密钥派生函数,并且进行1000次迭代,使得暴力破解更加困难。
集成到数据库运维平台的思路
1、在backup-center 里面集成一个接口,用于生成每日的备份用的加密密码,并记录到库里(可以提前批量生成好,也可以每天首次调用的时候触发生成当日备份用的密码,或者每周轮转一次秘钥也行)。
2、备份脚本里面,先执行请求backup-center,获取到当天使用的加密密码,用于当天的备份文件的加密。
3、需要解密备份文件的时候,根据备份文件名中带的日期时间,查询backup-center获取到相对应的解密密码。
2024-05-25更新
在实际使用过程中,发现上面的shell写法是有瑕疵的。
因为如果对于一个大型的文件进行openssl加密的时候,因为使用的是命令行传参的方式,因此在shell终端通过ps -ef 可以看到openssl的秘钥内容。
为了避免秘钥在进程中泄露,可以使用env的方式,如下:
代码语言:txt复制# 密码
export ENCRYPT_PASSWD="Abcd9876"
# 原始文件
original_file="devops-dba-dump_2024-01-24_backup"
# 加密后的文件
encrypted_file=${original_file}_encrypt
# 加密压缩DEMO
cat ${original_file} | gzip -c | openssl enc -aes-256-cbc -salt -pass pass:${encrypt_passwd} -out ${encrypted_file}
# mysqldumo备份,可以使用类似下面这种
# mysqldump -u$mysql_user --set-gtid-purged=OFF --hex-blob --master-data=2 -q --single-transaction -p$mysql_passwd --databases $dbname | gzip -c | openssl enc -aes-256-cbc -salt -pass env:ENCRYPT_PASSWD -out ${back_dir}/${sqlfile}.gz
# 解密解压缩DEMO
# openssl enc -d -aes-256-cbc -salt -in ${encrypted_file} -pass env:ENCRYPT_PASSWD | gunzip > ${original_file}hi