linux day32最新 (rsync介绍,scp介绍,rsync本地拷贝,常用选项,远程模式之ssh认证,远程模式之rsync守护进程,远程模式之rsync权限问题)

一,储备知识

  1,什么是备份

    备份就是把重要的数据复制一份到其他位置保留起来。

  2,三种备份方案

    (1)全量备份:一堆文件放在某个文件夹下面,把这些数据完整的拷贝下来,但是备份只能备份某个时间点的数据。假设大家都沿着网络在用一个文件夹的数据,假设今天星期一备份一下,星期二大家也在用,又完全拷贝一份,每一次都是将数据完完整整备份了一份,这就叫全量备份。

      恢复:如果想要恢复某一天的数据,就直接把当时备份的完整数据覆盖过来就行了。简单粗暴,恢复数据只需要对应时间点的一份数据就可以了

      缺点:备份数据量非常大,每次都要备份完整的数据量

      优点:恢复数据简单,直接把备份的数据拿过来,问题就解决了。

    (2)差异备份:第一次一定备份全量,以后每一次永远只和第一次全量备份做比较。

       恢复:拿出第一次的全量,和某一天的差异数据,两个一综合就可以得出想要恢复天数的数据。

    (3)增量备份:第一次备份全量,以后每一次都是跟上一次比较变化,找出差异,然后备份。

       恢复:比如要恢复第三天的数据,拿出第一天的全量备份,和第二天的差异备份,加上第三天的差异备份,先恢复全量的,然后根据第二天差异恢复,然后再根据第三天的差异恢复。

 

2,为何要备份

  回顾:运维的三大职责

    1,应用程序7*24*365不间断运行=》围绕三层,做好监控

    2,备份-》数据丢失情况下,保证数据可以恢复回来

    3,优化性能:提升用户访问速度       

 

3,备份什么

  重要数据

 

4,常用备份工具

  1,cp复制(全量,可以,但因其只能在本地拷贝,所以不会用它来备份)

  2,scp远程传输  (全量,基于ssh协议,远程备份,但是如果只是很小的改动,每次也是备份全部,效率就非常低,scp其实也可以叫同步,只是采用是全量,效率低。)

  3,rsync远程传输 (全量,增量,第一次备份一定是完整备份,第二次传,它会用哈希算法和第一次进行比对,找差异,哈希值不变文件不变,变了同理,只把改的文件覆盖过去,这样远端的数据保存的就是最新的数据,就和自己本地同步了,所以rsync叫远程同步工具,有这样一个机制,这不叫增量)

  注:scp其实也可以叫同步,只是采用是全量,效率低

  注:应该备份到远程,自己机器坏了,备份数据不受影响。

 

二,rsync介绍

  (1)rsync是什么?我们用rsync来做什么

  rsync,即“远程同步”。主要用来完成备份操作,它支持全量备份和增量备份

  (2)rsync的特点:

  1,rsync第一次会全量传输,后续会对比两个文件的不同,只传输文件更新的部分,传输速度比一般工具快。

  2,rsync支持在本地计算机到远程服务端之间互相进行同步数据,不支持远程控制俩个机器互相之间同步数据。scp可以实现,因为基于ssh

  3,rsync是跨平台的,windows和linux

  拓展:也可以在本地进行备份,rsync   原文件   目标文件,和cp一样,但是cp每次全量,而rsync第一次全量,第二次是比对,没变化不覆盖,有变化只把差异部分覆盖过去。

 

三,安装

注意,传输的双方都必须安装 rsync

  yum install rsync -y

 

四 rsync的传输方式与工作模式

改主机名:hostnamectl set-hostname    local

1,两种传输方式

  pull 拉

客《------- 客将数据拉到--------服

客户端把服务端数据拉到本地

问题:如果客户端过多,会对服务端造成压力过大

  push 推

客-----------将数据上传到---------》服

客户端将本地数据上传到服务器

问题:如果客户端过多,上传速度就会收到宽带影响,很慢

 

 scp命令    只支持远程传(cp只支持本地传)

  上传/推    客户端上传服务端

  -r :在传文件的基础上,增加了传目录。

  scp -r  本地路径   目标路径

  scp -r aaa/1.txt root@192.168.15.41:/root/bbb   远程主机账户,而且是可以登录系统的账户,root,这样就不安全,因为只是上传给对方一个文件,就需要拿到对方root账户。

 

下图是服务端,发现无论scp -r /aaa/还是/aaa    root@192.168.15.41:/bbb 都是传了一个文件夹。

 

 

 如果想只想传文件,scp -r /aaa/1.txt指定传一个文件 或者/aaa/*传aaa文件夹下所有的文件。 root@192.168.15.41:/bbb 

 

客户端就把文件传给了服务端

 

 

 

再往/aaa目录下创建一个2.txt 传给服务端,

 

 

下载/拉   客户端下载服务端

  scp -r  目标路径   本地路径

  scp -r  root@192.168.15.41:/root/bbb/*    /root/aaa

 

rsync  支持远程传和本地传

yum install rsync -y 本地,远程都要下载这个软件

  1,本地传

  rsync  源路径    目标路径

    -a 递归的把源路径的属性,内容全都拷贝到目标路径,完全保持一致

    -v 拷贝过程中显示详细信息

    -z 传输时进行压缩提升效率

cp

首先拿cp命令演示一下,好和rsync对比一下。

  mkdir test 文件夹

  cd test 目录,然后echo 123> egon.txt 

  \cp -a egon.txt egon111.txt 他们内容都是123   stat egon111.txt 看到change时间是1

然后再cp命令,stat egon111.txt 发现change时间改变为2.

  

  :\cp 是取消别名 因为cp默认别名是cp -i 会有提示信息,或者/bin/cp也是最原始不带别名的cp也可以。-r 是拷贝文件夹

  总结:说明即使内容一样,cp命令每次都是源文件覆盖目标文件。

rsync

然后rsync和上面cp进行对比

  cd test目录下,rsync -a egon.txt egon222.txt 

  stat egon222.txt 时间1   再 rsync -a egon.txt egon222.txt ,stat egon222.txt change时间还是1,change不变

  因为rsync拷贝时,就会先对比内容,如果发现内容不变,就什么都不做。

如果echo 333 >>  egon.txt    然后rsync -a  egon.txt egon222.txt ,  stat egon222.txt change时间就会发生改变。因为rsync对比发现,内容不同。

  

rsync拷贝文件夹

 

 注:这里如果不想拷贝文件夹,rsync -a /src/  /dst 就可以不拷贝文件夹,只拷贝文件夹下的文件到目标文件夹。-a 带有-r效果,就是也可以拷贝文件夹。

stat /dst/*

看到两个文件的change时间

再执行 rsync -a /src/  /dst

stat /dst/*

因为内容不变,rsync不做任何事,change时间不变。

echo 333 >> /src/1.txt 

rsync -a /src/ /dst 

stat /dst/*

看到1.txt 内容改变,所以change时间改变,2.txt 内容不变,所以change时间不变。

总结:rsync 拷贝时,会先对比内容是否一样,如果一样,就不进行任何操作,只覆盖改变的。 

 

rsync 选项

  -a 包含非常多,一定会用。

  -z 压缩,远程传输使用

  -c 打开校验开关,对文件传输进行校验。传到服务端要对数据是否完整进行校验

  -n 它没有完成真的拷贝,是先试一下,通常搭配v显示一下这一次拷贝把哪些源拷贝过去。

   -v  显示详细信息

 

 

 上图的例子,说明,rsync只拷贝 目标目录下文件和自己一样的文件,而没有管不同的地方,这样的话就显的和它本身的“同步”不符合,真正的同步应该一切按源为准。也就是/src是234文件,dst也应该被改的和/src目录的文件数量一样。

  如果想一切以源为准,一模一样,就需要 --delete

  --delete 以源为准。强制保持一致。

  --exclud 排除,可以用通配符*代表所有,[ ]可以指定范围

 

   --include 包含

  rsync -a --include "*.txt" --exclude "*" 111/ 222

  rsync -a 111/*.txt 222

  这两个只要txt结尾的文件。

 

 

 

本地模式介绍完毕。开始远程传输模式。

 

也能远程传输

 远程与本地

setenfore 0

systemctl stop firewalld 

   语法

rsync      选项       源路径(有可能本地,有可能是远程)   目标路径(同理)

                                              推,本地                                                  远程

                拉    远程                                                  本地

远程传输需要经过验证才可以,验证方式有两种

1,ssh认证    (快不安全)systemctl status sshd查看一个服务的状态。

  https://www.cnblogs.com/linuxandy/p/11205730.html(ssh命令网址)

  (1)本地与远程都需要安装rsync软件

  (2)远程主机需要开启sshd服务

  (3)需要用到的账号是远程主机的系统账号密码(不收文件夹的限制)---》不安全

  (4)不受文件夹的限制----》不安全

   rsync -az  /mmm/ root@192.18.15.41:/nnn   推

   rsync -az  root@192.168.15.41:/etc/passwd    /mmm   拉 (这里passwd后面没加/等于拉过来一个passwd的目录。)

 

2,基于rsync-daemon  守护进程   (既快又安全)

   其实就相当于把上面基于ssh认证的进行改进,快是因为rsync本身的机制,主要需要加强安全,远程连接一定会验证用户信息,而root用户权限过强,所以存在风险,如果有一个虚拟用户仅仅只是登录系统。还有就是不受文件夹限制,也是风险,如果改进成只能去目标某几个文件夹推拉东西就可以很好的保证安全,改进这俩点,就可以达到完美,既快又安全,这俩点做好,也是daemon的精髓所在!

  (1)本地与远程都需要安装rsync软件

    (2)远程主机不需要开启sshd服务,但是远程主机需要开启rsync-daemon守护进程

   (3)修改好配置(期中架构要和各种各样的配置文件打交道)

 

 守护进程模式搭建   file:///C:/Users/DK/Documents/WeChat%20Files/wxid_l726ymtggfd421/FileStorage/File/2021-04/rsync(2)(1).pdf

  1,环境准备

  主机           ip                角色

  本地  192.163.15.100    rsync客户端

  远程  192.163.15.41    rsync服务端

2,本地与远程均执行下述两条命令

  setenforce 0

  systemctl stop firewalld (关闭防护墙)

3,安装rsync(本地和远程主机都要安装)

  yum install rsync -y

 4,在远程主机配置并启动守护进程

  vim /etc/rsyncd.conf

 

 

1,uid,gid改成rsync,所以需要创建用户rsync,是一个系统用户,是用来启守护进程用的,和这个进程的用户身份,没有关系,只是给客户端使用的用户,和对应的权限。

2,port 是端口号。

3,是否允许root用户来启动这个软件。

4,是否允许转换成root用户,

5,设置最多有几个用户同步数据(公司内部的事情,没必要很大)

6,设置超时时间,如果很久没连接上,自动断开,不要让客户端傻等。

7,不会报错

8,本来是只读,false,等于改成也允许写

9,

10,egon。 假的用户,用来远程传输的时候,给客户端用的假的账号。虚拟账号,对于服务端这个是系统账号,代表了这个进程在我自己操作系统上的权限。客户端拿着这个假的账号推拉数据,这个假账号一到服务端系统上来,就会转换成rsync账号,然后得到了rsync设置好的权限,客户端使用的假账号,就等于在使用rsync这个账号,但是客户端拿这个假账号,是无法登上我的系统,这样就很好的解决了安全的问题。

11,/etc/rsync.passwd 假用户的密码放在哪里呢?自己可以指定密码文件。

12,指定日志文件 /var/log/rsyncd.log

 

目前来说,解决了系统账号密码的安全性,还需要解决文件夹的安全性。

[   ] 这里面写的是假的文件名,模块名,相当于一个代号。

  path=/etc_bak 才是真的文件名

  comment(描述)=“备份文件的目录”

 

想方设法欺骗客户端。以上不用背,直接复制。

 首先要在服务端需要开启rsync守护进程(上面是基于sshd服务),所以需要在服务端打开rsync配置文件,先把服务端搞定,一会要在服务端开启一个rsync这样一个进程,而启进程一定需要搭配一个用户,这里为什么创建一个用户?因为这个进程起来以后必定要操作文件,操作文件,你有没有权限呢?而有没有权限就和用户有关系。如果你规定是rsync这个用户启动,就需要创建出来,而这个用户就代表了rsync服务端这个服务端管理软件的权限,现在是一个普通用户,只能操作一些非常有限的文件,如果想操作任意的文件,应该把启动用户变成root。

  这里俩种方式:

    我用普通用户启动,把权限控制的比较死,我一会规定一个文件夹,用户登同步过来的文件只能在这个文件夹里放,因为一会用户要给我推数据,推给我之后,我肯定要把数据写本地去,那一定是要在一个文件里放,我有没有权限呢?要看这个进程是以什么身份启动起来的,目前是普通用户身份,那这个普通用户必须要对这个文件夹有权限,才能够写进去。所以一会要做好以下几件事。     你规定一会启动rsync守护进程,是使用rsync用户启动起来,所以第一件事要把rsync这个用户创建出来。第二件事,把远程机器的文件夹权限属组属组改成rsync,这样服务端这个软件才能对我这个文件才有写权限,客户端推的数据,我才能像写进去。(也可以直接启动用户就是root,这样就不用管权限的事,直接就是最大权限。)

 

围绕配置文件的三个准备工作

设置过vim /etc/rsyncd.conf  配置文件后

1,首先需要建真用户,rsync用户   (和配置文件保持一致

useradd rsync -s /sbin/nologin -M        万一rsync泄露了,客户端也登录不来,因为是一个系统用户,同时不创建家目录,因为没必要。

2,虚拟账户的密码文件没有搞定。(和配置文件保持一致)

首先看上面设置rsyncd.conf文件   secrets file = 哪个文件?   上面是:/etc/rsync.passwd

所以,vim /etc/rsync.passwd

  虚拟用户名:密码

  egon:123   

  :wq保存退出 

  chmod 600 /etc/rsync.passwd

  (改成600的原因:如果不是root用户启动的守护进程,就无法进入这个文件,无法进入这个文件,那么远程客户端输入的egon用户输入密码时就无法和这个文件里写的密码进行比对,就会验证失败,客户端无法推拉数据到服务端。这里如果改成000,任何用户都对这个文件没有权限,除了root,如果启动守护进程是root用户,那么就可以进行密码比对,正确,客户端就可以推拉数据给服务端。严格来讲服务端的进程应该在普通用户启动这个进程,并且普通用户要对密码文件有读权限。即使服务端有bug,对方恶意顺着用户登录到系统,也只是一个权限小的普通用户。)

  

3,真目录的没有建,权限没有建。(和配置文件保持一致

  mkdir /egon_bak(创建备份文件夹)

建完,要把权限给足,因为客户端把数据传给rsyncd这个进程之后,我这个进程需要把客户端传的数据写入/egon_bak这个文件夹下面,就代表我这个esyncd进程要对这个文件夹有权限,这个rsyncd进程是以rsync这个身份启动起来的,怎么才能对它有权限,就需要让rsync这个用户作为这个文件夹的主人和组,那我对这个文件夹就有任意的权限。

  chown -R rsync.rsync /egon_bak/

 这样rsync用户,就对这个文件有了读,写,执行权限。 -R是递归的赋值属性,目前就他一个文件夹,不需要加,加也可以。

 

这样围绕配置文件的三个准备工作就做完了,客户端首先使用假的账号,egon:123,到了服务端其实对应的是rsync的权限,而rsync只对/egon_bak/这个文件夹拥有所有权限。

 

启动rsync守护进程   rsync    --daemon  (在后台运行,连的时候才相应)

netstat  -an | grep 873 (查看端口在不在)

listen 监听状态。

服务端就完成了!接下来就是搞客户端,客户端用egon:123 ,文件用xxx

 

强调,前面老师说错了。

  1,配置文件里的,uid,gid 不是代表启动进程的用户身份,你是以什么用户提交的命令,该进程的身份就是该用户。该进程的身份和配置文件没关系,即当前登录的用户是谁,进程的用户身份就是谁。(这里用户提交的命令指的是,rsync --daemon是在哪个用户身份提交的,这里是root用户,那该进程的身份就是root用户身份,如果登录的用户是xxx,然后改了配置文件,提交了上面的命令,那么该进程的身份就是xxx用户的身份),

 

 

  拓展:pkill -9 rsync   (杀掉rsync)

  systemctl   start   rsyncd

  systemctl     status    rsyncd    (启动一个系统服务,一直在运行)

 

小总结一下:

  

 

  这里ip后面需要跟两个:: 然后加上/etc/rsyncd.conf  假的目录名。

  其实客户端要在服务端的文件夹下写东西,就是远程的写操作,客户端使用的假账号,对应的权限就是rsync,所以这个rsync其实是给客户端用的,是客户端用的假账号。客户端想要完成远程的写操作,那客户端就需要权限,客户端使用的是egon,egon对应的就是rsync的权限。更之前的是,先登录验证一下,验证用户身份就是客户端把账号密码提交到服务端,服务端软件需要打开一个服务端设置好的密码文件进行对比,这时候服务端软件需要对密码文件有读权限,理论上没有权限,但是服务端启动进程是root用户,所以有,如果是普通用户,就没办法验证密码。因为是root可以验证,输对,开始客户端开始给文件夹写,就涉及到写权限,客户端的身份,是rsync用户的权限,就看服务端对密码文件有没有写权限,ll -d /egon_bak/  发现有权限,为什么有权限,因为虚拟用户对应的是文件夹里的uid,虚拟用户就转成了uid,

 

  验证密码这一步,和客户端没关系,认证就看服务端对密码文件有没有读权限,第二步,远程写就需要看客户端有没有权限,客户端是拿着egon身份进来的,egon转成rsync身份去写的,有权限之后,写过来,会发现写过来的文件的用户身份是rsync,证明egon登录过来,虽然服务端软件是root启动的,但是是以rsyncd.conf配置文件里的uid指定的用户来写的,是以一个普通用户来写的,虽然服务端软件是root启动的,能不能写就是看这个普通人对这个文件有没有权限,如果没权限,加上,就可以写进去,那个文件的用户和组就是uid指定的用户,为什么这么做,安全,连接自己的客户端是很多,完全有可能有的客户端是来攻击你的,他们来了之后限制都是普通身份,服务端是以某个用户启动起来以后和客户端远程连过来没有关系!我服务端可能是root启动起来的,我连过来的是uid指定的那个身份。(nginx也有类似的配置,root启动的进程,那么nginx就是root身份启动起来的,但是nginx配置文件里指定的uid是www,gid是www,上网就是上传下载的过程,上传就是写操作,下载就是把我的东西下载走了,就是读写操作,说白了你要远程操作我的服务器,那我肯定要限制你的权限啊,但凡来个客户端,你的身份就是www,即便这个进程有漏洞,客户端进来也是www,更进一步,在公司里应该这么做,这种方式只是相对安全一点,在公司里,首先启动进程就应该用普通用户下面启,你要让这个服务端软件对它操作的文件夹之类的要有相对的权限,uid,gid是对客户端权限的限制,以什么用户启动这个软件,关系到服务端这个软件的权限,配置文件里的uid,gid关系到客户端权限,这是两件事,不能混为一谈。

 

  

最后总结

1,首先客户端,服务端,都关闭防护墙

  setenforce 0

  systemctl stop firewalld

2,然后远近都安装rsync软件。

3,vim /etc/rsyncd.conf

uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = egon
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[xxx]
comment = "备份"
path = /egon_bak

4,围绕配置文件创建rsync用户,useradd rsync -s/sbin/nologin -M 指定为不可登录的系统用户,更安全,-M是没有家目录。创建密码文件,echo "egon:1" /etc/rsync.passwd ,chmod 600 !$,创建真实目录 mkdir /egon_bak ,chown -R rsync.rsync /egon_bak/  

注意:首先客户端给buckup传数据时,会先验证用户密码,使用的是虚拟用户密码,buckup服务端收到用户密码,就会和自己的/etc/rsync.passwd 里的用户密码对比,这就需要当前启动rsync进程的用户对这个文件有读权限,所以必须指定权限,不然就无法验证传输,除非启动rsync进程的用户是root。不然就需要chomd 600 /etc/rsync.passwd

  第二,既然传输数据,那么就相当于客户端对backup服务端进行一个写权限,就需要创建目录/egon_bak ,而客户端egon登录进来的就是rsync这个用户,而创建的/egon_ak组,属组都是root,这是rsync对应其他权限,没有写,所以要加上,chown -R rsync.rsync /egon_bak 。 

  然后启动守护进程

  rsync --daemon

netstat -anpt | grep rsync 查看是否启动成功。

注意:我们是以root用户启动的rsync进程,所以rsync进程的身份就是root,一定与配置文件中的uid指定的身份区分开。

我们以什么用户启动服务端的rsync进程,控制的是服务端软件的权限

而配置文件中的uid控制的则是客户端的权限,对目录/egon_bak的权限

 

 

 

推:rsync -az /aaa/ egon@192.168.15.41::xxx

拉:rsync -az  egon@192.168.15.41::xxx   /yyy

 

posted @ 2021-04-19 12:32  sagelasi  阅读(288)  评论(0编辑  收藏  举报