使用 sFTP 实现安全异地备份全站内容
后知后觉 暂无评论

搭建个人博客,数据才是最重要的。因此备份就成为了一件极其重要的操作。 可以使用云服务商提供的镜像/自动备份功能(收费) ,但是可以使用其他方式来完成此操作。

绝大部分的个人用户都会把博客建立在虚拟主机或者ECS中,用户的所有数据都存放在由他们托管的服务器上,那就难免会出现不可抗力因素导致的硬件损坏,数据丢失及异常

本文环境在未特殊声明时默认为 CentOS 7.5

备份服务器

安装 vsFTP 服务

安装 epel 源

# yum install epel-release -y

安装 vsftpd

# yum install vsftpd -y

配置开机自启动

# systemctl enable vsftpd

配置备份用户

# useradd backup

配置 FTP 服务器

修改程序配置文件为以下内容

# cat /etc/vsftpd/vsftpd.conf 
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

建立限制列表文件(此处用户名以backup为例)

# cat /etc/vsftpd/chroot_list
backup

目标服务器

编写备份脚本

小贴士:因不同产品备份的目录及所需备份的内容不同,因此此部分内容仅供参考格式与方法,内容请酌情修改。
# vim /usr/scripts/backup.sh
推荐养成一个好习惯,将脚本与备份单独存放在固定目录,防止出现问题,也方便记忆。

例如本站的备份脚本,如下:

#!/usr/bin/env bash
# Auto Backup Script for Web Server Only Against RadHat / CentOS
# Content include NGINX WEBFILE PHP MySQL/MariaDB
# Author by Kane [kaneyou@qq.com]
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH
# Global Variable
TIME=$(date +%y%m%d)
NODE=$(hostname -I | awk '{print $1}')
BAKPATH="/usr/backups"
LOGFILE="/var/log/backup.log"
TARFILE="${TIME}-DATA-${NODE}"
# DataBase Variable
DBNAME="name"
DBUSER="root"
DBPASS="Password"
DUMPPATH="/tmp"
# OpenSSL Variable
PASSWD="Password"
# Detect Path Available
if [ ! -d ${BAKPATH} ]; then
    mkdir -p ${BAKPATH}
fi
# Log Function
log() {
    echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> $LOGFILE
}
# Export DataBase To Local
mysqldump -u$DBUSER -p$DBPASS $DBNAME > $DUMPPATH/$DBNAME.sql
# Tar Backup File
tar cfjp ${BAKPATH}/${TARFILE}.bz2 \
/var/www/ \
/var/spool/cron/root \
/etc/nginx/nginx.conf \
/etc/nginx/conf.d/ \
/etc/nginx/ssl/ \
/etc/php.ini \
/etc/php-fpm.d/www.conf \
/usr/scripts/ \
$DUMPPATH/$DBNAME.sql \
>/dev/null 2>&1
if [ $? -eq 0 ]; then
    rm -rf $DUMPPATH/$DBNAME.sql && rm -rf $DUMPPATH/$DBNAME.md5
    log "File Page of Tar Success!"
else
    log "File Page of Tar Failed!"
    echo "$(date '+%b %d %T') $(hostname | awk -F "." '{print $1}') bash"["$PPID"]":(CRON) INFO (backup running error)" >> /var/log/cron
fi
# Encrypt Backup File
# Use Follow Command to Decrypt
# openssl enc -aes-256-cbc -in crypted.enc -out decrypted.tgz -pass pass:[backup password] -d -md sha1
openssl enc -aes-256-cbc -in "${BAKPATH}/${TARFILE}.bz2" -out "${BAKPATH}/${TARFILE}.enc" -pass pass:"$PASSWD" -md sha1
if [ $? -eq 0 ];then
    find ${BAKPATH}/ -type f -name "*.bz2" -exec rm -rf {} \;
    log "File Encrypt Success!"
else
    log "File Encrypt Failed!"
    exit 1
fi

脚本中的变量部分请自行修改。

变量含义
DBNAME要备份的数据库名
DBUSER数据库用户名
DBPASS数据库密码
PASSWD加密备份文件的密码
BAKPATH备份文件的存放路径
LOGFILE日志文件的存放路径

编写推送脚本

# vim /usr/scripts/transport.sh

推送脚本例子如下:

#!/usr/bin/env bash
# Auto Transport Script for Web Server
# Use sFTP Method
# Author by Kane [kaneyou@qq.com]
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH
TIME=$(date +%y%m%d)
NODE=$(hostname -I | awk '{print $1}')
BAKPATH="/usr/backups"
FTPS="IP"
FTPU="username"
RSA="~/.ssh/id_rsa"
# Detect Path Available
if [ ! -d ${BAKPATH} ]; then
    exit 1
fi
# Transport File
sftp -i $RSA $FTPU@$FTPS << EOF
cd recent/
put ${BAKPATH}/${TIME}-* .
quit
EOF
if [ $? -ne 0 ]; then
    exit 2
fi

脚本中的变量部分请自行修改。

变量含义
FTPS备份服务器的IP或者域名
FTPU备份服务器的用户名

配置 RSA 密钥

建立 RSA 密钥

[root@domain ~]# ssh-keygen -t rsa -C diracsvip@gmail.com
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hPQrLx+0di/WU5dfmQhTpZgnggsscXxoYrEXERkMcFY waveworkshop@outlook.com
The key's randomart image is:
+---[RSA 2048]----+
| ..**EB       .. |
|  oo=B.+.   o..  |
|  .oo+o.o. +.o   |
|    o .....oo    |
|      ..S   o . +|
|       + .   ..+o|
|      . = .. . .o|
|       + oo.o   .|
|        .. ...   |
+----[SHA256]-----+
注意:-C 指定密钥的说明,可以用于辨识,推荐使用邮箱。
[root@domain ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub backup@ip/domain
注意:backup 为备份账户用户名 ip/domain 为备份机地址或域名

配置定时任务

crontab -e

写入定时任务

0 0 * * * /bin/bash /usr/scripts/backup.sh > /dev/null 2>&1
注意:务必在目标主机上先手动执行一次脚本进行测试,并触发 RSA 密钥信任,以防定时任务脚本执行失败。*

附录

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。