背景:当前IT环境下,网络安全越来越重要,其中在等级保护条例中,有提交系统或项目代码、数据的同步和备份是数据安全非常关键一环,并要求定时备份且定时加密,个人在实际场景已经使用rsync完成等保相关要求,以下为以小项目作为完整配置说明
1、安装rsync
两台服务器安装 yum install -y rsync
或者在官网https://rsync.samba.org/
下载离线包编译安装
https://download.samba.org/pub/rsync/src/rsync-3.1.3.tar.gz
2、添加配置文件:
rsync默认没有配置文件,需自行新建
mkdir -p /etc/rsync
touch rsyncd.conf rsyncd.pw rsyncd.motd
chmod 600 rsyncd.pw
主服务器配置
pid file = /var/run/rsyncd.pid
motd file = /etc/rsyncd/rsyncd.motd
log file = /var/log/rsync.log
log format = %t %a %m %f %b
syslog facility = local3
timeout = 60
port = 31873
address = 192.168.100.4
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow=192.168.100.5
hosts deny=*
max connections = 4
# 同步代码文件
[django_apps]
path = /root/mydjango
list=yes
ignore errors
auth users = root
secrets file = /etc/rsyncd/rsyncd.pw
comment = webapps data sync
exclude = logs/
# 同步数据文件
[apps_mysql]
path = /root/apps_mysql
list=yes
ignore errors
auth users = root
secrets file = /etc/rsyncd/rsyncd.pw
comment = webapps mysql db data sync
参数说明:
这里的端口已经被重新设定为5位数,安全考虑,并且防火墙iptables要放通该端口
read only:只容许客户端对服务器的同步目录读,保证安全
[django_apps] :模块名,自己定义,可以在下方添加多个模块,每个模块对应一个目录。须与客户端执行命令中的模块名一致。
因为客户端命令:rsync://192.168.100.4/django_apps 这里django_apps就是模块名
path:要备份的服务端文件夹路径。
hosts allow:允许的客户端连接IP,多个IP用逗号隔开,也可以写一段IP。
secrets file:服务端密码文件,内容格式为,用户名:密码,uid=root,所以这里用户名设为root,密码不需要设置为服务器登录密码,可以是其他密码。
auth users:有权限的用户名,与密码文件中用户名一致。
exclude:排除不需要同步目录,例如这里 logs/
注意:https://download.samba.org/pub/rsync/rsync.html
以及
https://download.samba.org/pub/rsync/rsyncd.conf.html
官方使用指引,非常详细,推荐参考
3、配置账户密码,这里使用root账户,但密码是随机设置,请勿设置服务器登录密码!
vim rsyncd.pw
root:Jp219881_$Ah
创建mysql_daily_bak.sh
脚本,数据文件放在/data/bak目录下
# 导出目标库,以sql形式导出
/opt/app/bin/mysqldump bigdata >/data/bak/bigdata-`date +%Y%m%d`.sql
/opt/app/bin/mysqldump cns >/data/bak/cns-`date +%Y%m%d`.sql
/opt/app/bin/mysqldump ems >/data/bak/ems-`date +%Y%m%d`.sql
# 保留半年数据
find /data/bak/ -mtime +180 -name '*.sql' -exec rm -rf {} \;
加入到定时任务,例如每天凌晨一点备份
0 */1 * * * sh /etc/rsync/mysql_daily_bak.sh
5、修改 rsyncd.motd
它是定义 rysnc 服务器在客户端同步登陆显示的欢迎条,可自行定义,最好说明来自哪里的同步server
files syncon blog server which server IP is
6、在主服务器上启动rsyncd.sh
后台进程启动:
rsync --daemon --config=/etc/rsync/rsyncd.conf
加入开机自启:
在 rc.local 末尾追加一行,如下:
vi /etc/rc.d/rc.local
/usr/bin/rsync --daemon --config=/etc/rsync/rsyncd.conf
但以上配置也会引起 rsync启动失败,因为rsync重启时需要根据rsyncd.conf创建/var/run/rsyncd.pid ,但因之前启动已经创建,导致提示文件已存在而无法启动,所以正确配置如下:
创建一个脚本 restart_rsync.sh
可以放在/etc/rsyncd/
rm -f /var/run/rsyncd.pid
rsync --daemon --config=/etc/rsync/rsyncd.conf
再将脚本加入到开机自启
因在centos7上, /etc/rc.d/rc.local权限默认没有执行权限,需重赋权限,该文件上也有提示要加入可执行权限Please note that you must run ‘chmod +x /etc/rc.d/rc.local’ to ensure that this script will be executed during boot
chmod +x /etc/rc.d/rc.local
内容 追加vi /etc/rc.d/rc.local
sh /etc/rsync/restart_rsync.sh
7、在备服务器上,配置简单很多:
创建 /etc/rsyncd文件,里面只需要
新建sh文件etc/rsyncd/run_rsync.sh
rsync -ztruvoglp --password-file=/etc/rsync/rsyncd.secrets
--delete rsync://192.168.100.4:31873/django_apps /root/mydjango/
# 如有多个目录,可以继续添加
rsync -ztruvoglp --password-file=/etc/rsync/rsyncd.secrets
--delete rsync://192.168.100.4:31873/django_blog /root/myblog/
这里rsync://IP/对应服务器rsyncd.conf配置需要同步的“module”,也就是django_apps,注意不是目录路径
/root/mydjango/ 对应在备服务器上创建与主服务器一致的文件目录路径,如果备服务器已经创建了该目录,那么rsync不在创建,而是同步文件和目录
rsync -ztruvoglp 参数说明
-a 以archive模式操作、复制目录、符号连接
-r 递归,同步目录及其子目录所有文件
-l 是链接文件,意思是拷贝链接文件;
-p 表示保持文件原有权限;
-t 保持文件原有时间;
-g 保持文件原有用户组;
-o 保持文件原有属主;
-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;
-e ssh的参数建立起加密的连接。
-u 只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
--progress是指显示出详细的进度情况
--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
--password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了
这里为何创建run_rsync.sh,因为rsync客户端侧,没有定时运行功能,因此需要自行写个sh,然后在crontab里设定定时任务,定时向rsync服务器端更新文件
*/1 * * * * /etc/rsyncd/run_rsync.sh 每1分钟从主服务器增量同步一次
也可以为不同同步目录创建不同的sh来控制其同步间隔
例如大文件 */30 * * * * /etc/rsyncd/large_file_rsync.sh 每30分钟从主服务器增量同步一次
注:若所同步的文件夹为小文件且数量多、更改频繁的,同步时间间隔可以设为较大值
若所同步的文件为大文件,其删改频率低,同步时间间隔可以设为较大值
防火墙配置是一个非常重要环节,在很多技术产品部署过程中,很多教程都让你先关闭防火墙以便排除网络、端口连通性故障,但实际生产或者项目正式使用时,防火墙必须打开,而且需要写入精细的acl策略,保证系统安全。
centos7.5
firewall-cmd --zone=public --add-port=31873/tcp --permanent
firewall-cmd --reload
redhat6.5 使用iptables配置防火墙
直接在shell命令行加入,通过save操作,将其写入到/etc/sysconfig/iptables
,保证永久生效
iptables -A INPUT -p tcp --dport 31873 -s 192.168.100.0/24 -j ACCEPT
/etc/rc.d/init.d/iptables save
service iptables restart
或者在iptables文件中详细写入相关规则
iptables 的策略配置:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 以三条
:blog-server - [0:0]
-A INPUT -j blog-server
-A FORWARD -j blog-server
-A OUTPUT -j blog-server
-A blog-server -i lo -j ACCEPT
-A blog-server -p icmp --icmp-type any -j ACCEPT
-A blog-server -m state --state ESTABLISHED,RELATED -j ACCEPT
# 放通rsyncd端口31873,仅192.168.100.0/24可访问
-A blog-server -p tcp --dport 31873 -s 192.168.100.0/24 -j ACCEPT
# 放通ssh端口31873,仅192.168.100.0/24可访问
-A blog-server -p tcp --dport 31022 -s 192.168.100.0/24 -j ACCEPT
# 服务器禁ping
-A blog-server -j REJECT --reject-with icmp-host-prohibited
COMMIT