Linux笔记 No.28---( rsync服务、SSH服务)

一、rsync服务

rsync(remote sync)是类unix系统下的数据镜像备份工具。

rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync”算法,可以将一个客户机和远程文件服务器之间的文件同步,也可以 在本地系统中将数据从一个分区备份到另一个分区上。如果rsync在备份过程中出现了数据传输中断,恢复后可以继续传输不一致的部分。rsync可以执行 完整备份或增量备份

特点:

  • 可以镜像保存整个目录树和文件系统;

  • 可以很容易做到保持原来文件的(属性信息)权限、时间、软硬链接;无须特殊权限即可安装;

  • 可以增量同步数据,文件传输效率高,因而同步时间短;

  • 可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;

  • 支持匿名传输,以方便进行网站镜象等;

  • 加密传输数据,保证了数据的安全性;

  • 可以有排除(tar、find)指定文件或目录同步的功能,相当于打包命令tar的排除功能

不足:

随着系统规模的不断扩大,rsync做数据同步时,需要扫描所有文件后进行对比,然后进行差量传输。如果文件很大,扫面文件是非常耗时的,而且发生变化的文件往往是很少一部分,此时效率就会较低。其次,rsync不能实时监测、同步数据,虽然它可以通过Linux守护进程的方式触发同步,但是两次触发动作一定会有时间差,可能导致服务器端和客户端数据出现不一致。

用法:

rsync [OPTION]... SRC DEST
  rsync [OPTION]... SRC [USER@]HOST:DEST
  rsync [OPTION]... [USER@]HOST:SRC DEST
  rsync [OPTION]... [USER@]HOST::SRC DEST
  rsync [OPTION]... SRC [USER@]HOST::DEST
  rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

对应于以上六种命令格式,rsync有六种不同的工作模式:

  • 拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data /backup
  • 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src
  • 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/bar /data
  • 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@172.16.78.192::www /databack
  • 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /databack root@172.16.78.192::www
  • 列出远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://172.16.78.192/www

选项 :

rsync参数的具体解释如下:
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 --partial
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second

常见用法: -avz

rsync的工作方式:

  1. 本地之间的数据传输(类似于cp)
  2. 借助ssh、rcp等通道数据传输(类似于scp)
  3. 以守护进程(socket)方式数据传输 (sync自身重要功能)

第一次运行命令会由于需要扫描并同步所有文件及目录,因此时间会长一些,相当于全部拷贝。如果再次备份会通过对比算法比对所有文件和目录,仅同步有变化(内容,修改时间等各种属性)的文件或目录,即增量拷贝,速度更快

【例 】

将本地/etc下的所有文件拷贝至/opt下

[root@eddy /]# rsync -avz /etc /opt    #包括etc目录本身
[root@eddy /]# rsync -avz /etc/ /opt    #不包括etc目录本身

当本地的不同目录之间需要数据传输,特别是经常需要增量传输时,这个命令可以替代cp等命令,提升拷贝的效率

将本地file文件传输至远端的/tmp下

# 交互式(即要输入对端用户登陆密码)
[root@eddy ~]# rsync -avz /root/test/file root@192.168.126.10:/tmp
root@192.168.126.10's password: 
sending incremental file list

sent 43 bytes  received 12 bytes  12.22 bytes/sec
total size is 6  speedup is 0.11
# 非交互式(即在命令行显式的给出登录密码),也可以使用ssh key 免密钥登录
[root@eddy ~]# sshpass -p 123456 rsync -avz /root/test/file root@192.168.126.10:/tmp
sending incremental file list

sent 43 bytes  received 12 bytes  36.67 bytes/sec
total size is 6  speedup is 0.11

#命令说明
root@192.168.126.10:通过root账户登录192.168.126.10这台主机
:/tmp:表示将文件拷贝至对端的位置,即/tmp下

借助ssh通道在不同主机之间传输数据

# 交互式(即要输入对端用户登陆密码)
[root@eddy ~]# rsync -avz -e 'ssh -p 22' /etc root@192.168.126.10:/tmp
# 非交互式(即在命令行显式的给出登录密码)
[root@eddy ~]# sshpass -p 123456 rsync -avz -e 'ssh -p 22' /etc root@192.168.126.10:/tmp

#命令说明
-e 'ssh -p 22' 表示以ssh的方式通过22端口推送,如果不写默认22端口
root@192.168.126.10:通过root账户登录192.168.126.10这台主机
:/tmp:表示将文件拷贝至对端的位置,即/tmp下

以root用户将远端设备192.168.126.10的/opt目录(包含目录本身)数据拷贝到本地的/tmp目录下

# 交互式登录
[root@eddy ~]# rsync -avz root@192.168.126.10:/opt /tmp
# 非交互式登录
[root@eddy ~]# sshpass -p 123456 rsync -avz root@192.168.126.10:/opt /tmp
# 也可以使用域名
[root@eddy ~]# cat /etc/hosts
192.168.126.10 server01
[root@eddy ~]# rsync -avz root@server01:/opt /tmp
[root@eddy ~]# sshpass -p 123456 rsync -avz root@server01:/opt /tmp

同步功能:

[root@client haha]# rsync -avz --delete /dir1/  /dir2/

#--delete :表示同步增,删,改(文件内容出现变化,也会同步的)

删除dir2目录中dir1目录下没有的文件,并将dir1目录下dir2目录中没有的文件拷贝至DIR2目录下

风险提示:

(1)

rsync 选项 --delete 服务器端地址 客户端地址

使用–delete参数,如果从rsync服务器端往rsync客户端同步数据时,一定要小心,最好不用,它比从rsync客户端带–delete参数往往rsync服务端推送危险的多。

(2)

rsync 选项 --delete 客户端地址 服务器端地址

客户端带–delete参数往服务端同步时会删除服务端目录下与客户端不同的文件。
而前者有能力删除rsync客户端本地的所有数据包括根下的所有目录。

rsync限速:

rsync -arz   --bwlimit=速率  源目录  目标目录  

同步时排除某些文件

[root@server ~]# sshpass -p 123456 rsync -avz --exclude=file1 --exclude=file2 --exclude=file3  root@192.168.126.10:/root/dir/ /root/

# 将远端192.168.126.10设备中的/root/dir/目录下除了名为file1,file2,file3的文件全部拷贝至本地的/root/目录下
--exclude=文件名 #除了指定的文件;该选项可以指定任意多个
如果排除的文件较多,可以将所有要排除的文件名写入到一个文件FILE中(一个文件名一行),再使用 --exlude-from=FILE即可实现
[root@server ~]# cat file
file1
file2
file3
[root@server ~]# sshpass -p 123456 rsync -avz --exclude-from=/root/file  root@192.168.126.10:/root/haha/ /root/

rsync以守护进程(socket)的方式传输数据

部署环境:

[root@server ~]# uname -a
Linux server 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

操作系统:

主机名IP用途
server192.168.126.8rsync服务端
client192.168.126.10rsync客户端

具体需求:

要求在server上以rsync守护进程的方式部署rsync服务,使得所有rsync节点客户端主机,可以把本地数据通过rsync的方式备份到数据备份服务器server上

(一)在server端部署rsync服务

(1)确认软件是否安装

[root@eddy ~]#  rpm -qa | grep rsync 
rsync-3.1.2-10.el7.x86_64
#若未安装,执行
yum install rsync -y

(2)配置rsyncd.conf

[root@eddy ~]#  cp -p /etc/rsyncd.conf{,.bak}
[root@eddy ~]#  vim /etc/rsyncd.conf
[share]									# 模块名(客户端依据此模块名进行上传;此模块名映射到下一行的物理路径)
path = /backup/							# 指定服务器端存放文件目录
uid = root								# 指定当使用该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是"nobody"。
gid = root								# 指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。
use chroot = no							# 程序安全设置
max connections = 200					# 指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。	默认0,即无限制,负值为禁止连接
timeout = 300							# 通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。
pid file = /var/run/rsyncd.pid			# 进程号文件位置,rsync daemon启动后将其进程pid写入此文件。如果这个文件存在,
rsync不会覆盖该文件,而是会终止
lock file = /var/run/rsync.lock			# 进程锁,指定lock文件用来支持“max connections”参数,使得总连接数不会超过
限制
log file = /var/log/rsyncd.log			# 日志文件位置
ignore errors							# 指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IO错误,一般来说rsync在出现IO错误时将将跳过--delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题。
read only = false						# 该选项设定是否允许客户上传下载文件。如果为true那么任何上传下载请求都会失败,如果为false并且服务器目录读写权限允许那么上传下载是允许的。默认值为true。)
list=false								# 是否允许客户端可以查看可用模块列表,默认为可以
hosts allow = 192.168.126.0/24			# 允许IP;指定可以联接的客户端主机名或和ip地址或地址段,默认情况没有此参
数,即都可以连接
hosts deny = 0.0.0.0/32					# 禁止IP;指定不可以联接的客户端主机名或ip地址或地址段,默认情况没有此参
数,即都可以连接
auth users = rsync_backup				# 指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。
secrets file = /etc/rsync.password		# 指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,需要限式指定一个(例如:/etc/rsyncd.passwd)。注意:该文件的权限一定要是600,否则客户端将不能连接服务器。

(3)创建共享目录及添加rsync程序用户

[root@server ~]# useradd -M -s /sbin/nologin rsync
[root@server ~]# mkdir /backup/	 # 要与配置文件中一致

(4)更改共享文件夹的属性

[root@server ~]# chown -R rsync:rsync /backup
[root@server ~]# chmod 755 /backup  # 确保客户端能够在此目录中进行上传和下载操作

(5)创建rsync虚拟账户名和密码,并将账户密码文件权限设置为600

[root@server ~]# echo "rsync_backup:123456" > /etc/rsync.password
[root@server ~]# chmod 600 /etc/rsync.password

(6)设置开机自启动

[root@server ~]# systemctl enable /usr/lib/systemd/system/rsyncd.service

(7)以守护进程方式来启动rsync服务

[root@server ~]# rsync --daemon 
  • –daemon #表示以守护进程的方式启动rsync服务

  • –address #绑定指定ip地址

  • –config=FILE #更改配置文件路径,而不是默认的/etc/rsyncd.conf

  • –port=PORT #更改其它端口提供服务,而不是缺省的873端口

rsync服务的重启必须先关闭再启动
 pkill rsync 
 rsync --daemon

(二)客户端配置

(1)安装rsync

yum install rsync -y

(2)创建密码文件并将密码文件的权限设置为600

[root@client ~]# echo "123456" > /etc/rsync.password  # 确保(rsync虚拟用户)客户端和服务器端密码一致
[root@client ~]# chmod 600 /etc/rsync.password

(三)测试

将rsync服务端(server)中共享目录(模块名为share,映射的物理路径为/backup/)下的文件同步到本地的/root/dir/目录下

[root@client ~]# rsync -avz  rsync_backup@192.168.126.8::share  /root/dir/ --password-file=/etc/rsync.password
#注意:这里的share要和服务端的配置文件中所写的模块名一致[share],即客户端使用的服务器端的物理地址为服务器端配置文件的模块名(服务器端会依据配置文件将此模块名映射到对应的目录下)

将本地的文件上传到服务器的共享目录下:

[root@client ~]# rsync -avz  test.tar.gz rsync_backup@192.168.126.8::share --password-file=/etc/rsync.password 

二、ssh服务

(一)SSH介绍

  1. SSH是Secure Shell Protocol的简写。在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全。

  2. SSH是专为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境工作中,普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密的)等。

  3. 在默认状态下,SSH服务主要提供两个服务功能:一个是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务;另一个是类似FTP服务的sftp-server,借助SSH协议来传输数据的,提供更安全的SFTP服务。

(二)SSH结构

SSH服务由服务端软件OpenSSH(openssl)和客户端(常见的有SSH),SecureCRT,Putty,xshell组成,SSH服务默认使用22端口提供服务。

  • SSH服务端是一个守护进程(daemon),它在后台运行并响应来自客户端的连接请求。SSH服务端的进程名为sshd,负责实时监听远程SSH客户端的连接请求,并进行处理,一般包括公共密钥认证,密钥交换,对称密钥加密和非安全连接等。这个SSH服务就是我们前面基础系统优化中保留开机自启动的服务之一。
  • ssh客户端包含ssh以及像scp(远程拷贝),slogin(远程登录),sftp(安全FTP文件传输)等应用程序。
  • ssh的工作机制大致是本地的ssh客户端先发送一个连接请求到远程的ssh服务端,服务端检查连接的客户端发送的数据包和IP地址,如果确认合法,就会发送密钥发回给服务端,自此连接建立。

(三)SSH加密技术

在这里插入图片描述
服务器端组件监听指定的端口,负责安全连接的建立、对连接方的身份认证、以及为通过身份认证的用户建立正确的环境

客户端负责发起最初的TCP握手、安全连接的建立、验证服务器的身份与之前记录中的一致、并将自己的验证信息提供给服务器

一个SSH会话的建立过程分为两个阶段。第一阶段,双方沟通并同意建立一个加密连接通道以供后续信息传输用。第二阶段,对请求接入的用户进行身份验证以确定服务器端是否要给该用户开放访问权限

(四)ssh命令

用于登录远程主机, 并且在远程主机上执行命令

用法:

ssh [options] [arguments] [user@]hostname [command]

选项:

  • -a :禁止转发认证代理的连接.

  • -A :允许转发认证代理的连接. 可以在配置文件中对每个主机单独设定这个参数.

  • -b bind_address :在拥有多个接口或地址别名的机器上, 指定收发接口.

  • -c blowfish|3des|des :选择加密会话的密码术

  • -f :要求在执行命令前退至后台. 它用于当准备询问口令或密语, 但是用户希望它在后台进行. 该选项隐含了 -n 选项. 在远端机器上启动 X11 程序的推荐手法就是类似于 ssh -f host xterm 的命令.

  • -g :允许远端主机连接本地转发的端口.

  • -i identity_file :指定一个 RSA 或 DSA 认证所需的身份(私钥)文件

  • -l login_name :指定登录远程主机的用户. 可以在配置文件中对每个主机单独设定这个参数.

  • -n :把 stdin 重定向到 /dev/null (实际上防止从 stdin 读取数据). 在后台运行时一定会用到这个选项.

  • -p port :指定远程主机的端口. 可以在配置文件中对每个主机单独设定这个参数.

  • -q :安静模式. 消除所有的警告和诊断信息.

  • -x : 禁止 X11 转发.

  • -X :允许 X11 转发

  • -C : 要求进行数据压缩 (包括 stdin, stdout, stderr 以及转发 X11 和 TCP/IP 连接 的数据)

  • -F configfile :指定一个用户级配置文件. 如果在命令行上指定了配置文件, 系统级配置文件 (/etc/ssh/ssh_config ) 将被忽略. 默认的用户级配置文件是 $HOME/.ssh/config

  • -L port:host:hostport :将本地机(客户机)的某个端口转发到远端指定机器的指定端口

  • -R port:host:hostport :将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口

  • -D port :指定一个本地机器动态的应用程序端口转发.

  • -1 :强制 只使用协议第一版.

  • -2 :强制 只使用协议第二版.

  • -4 :强制 只使用 IPv4 地址.

  • -6 :强制 只使用 IPv6 地址.

  • -o option :可以在这里给出某些选项, 格式和配置文件中的格式一样. 它用来设置那些没有命令行开关的选项

【例 】

使用ssh连接远程主机

#最简单的用法只需要指定用户名和主机名参数即可,主机名可以是 IP 地址或者域名。
ssh user@hostname

ssh连接到其他端口

#使用-p选项指定端口号(不指定默认为22端口)
 ssh -p 端口号 user@hostname

使用ssh在远程主机执行一条命令并显示到本地, 然后继续本地工作

#直接连接并在后面加上要执行的命令就可以了
ssh root@192.168.126.10 cat /etc/passwd      #查看远程主机passwd文件内容

在远程主机运行一个图形界面的程序

#使用ssh的-X选项,然后主机就会开启 X11 转发功能
ssh -X user@hostname

绑定源地址

#如果你的客户端有多于两个以上的 IP 地址,你就不可能分得清楚在使用哪一个 IP 连接到 SSH 服务器。为了解决这种情况,我们可以使用 -b 选项来指定一个IP 地址。这个 IP 将会被使用做建立连接的源地址。

ssh -b IP  user@hostname

对所有数据请求压缩

#使用 -C 选项,所有通过 SSH 发送或接收的数据将会被压缩,并且任然是加密的
ssh -C  user@hostname

打开调试模式

#因为某些原因,我们想要追踪调试我们建立的 SSH 连接情况。SSH 提供的 -v 选项参数正是为此而设的。其可以看到在哪个环节出了问题
ssh -v user@hostname

关于 -o StrictHostKeyChecking

在进行ssh远程登录时,当你第一次进行远程连接时,ssh会试图把远程主机的IP信息存储到~/.ssh/known_hosts文件里,所以,一定会在第一步交互时询问yes或no;使用该选项可以直接在命令行指定,无需进行交互式确认

# 指定-o StrictHostKeyChecking=no 表示忽略密码提示(即忽略第一次交互)

ssh -o StrictHostKeyChecking=no user@hostname

(五)sshpass命令

sshpass 是一个简单、轻量级的命令行工具,通过它能够在命令行显式提供密码(非交互式密码验证),这样就可以通过 cron 调度器执行自动化的 shell 脚本进行备份。

选项:

-f filename:从文件中获取密码
-d number:使用数字作为获取密码的文件描述符
-p password:指定明文本密码输入(安全性较差)

【例 】

直接远程连接主机

sshpass -p 密码 ssh 用户名@主机IP

远程连接指定ssh的端口

sshpass -p 密码 ssh -p 端口 用户名@主机IP

从密码文件读取文件内容作为密码去远程连接主机

sshpass -f 密码文本文件 ssh 用户名@主机IP 

从远程主机上拉取文件到本地

sshpass -p 密码 scp 用户名@远程主机IP:远程主机目录 本地主机目录

将本地主机目录文件拷贝至远程主机目录

sshpass -p 密码 scp 本地主机目录 用户名@主机IP:远程主机目录

远程连接主机并执行命令

sshpass -p 密码 ssh -o StrictHostKeyChecking=no 用户名@主机IP 'rm -rf /tmp/test'

# -o StrictHostKeyChecking=no 忽略密码提示

(六)ssh服务认证类型

基于口令的安全认证:

基于口令的安全验证的方式就是现在比较常用的,只要知道服务器的SSH连接账号和口令(当然也要知道对应服务器的IP及开放的SSH端口,默认为22),就可以通过ssh客户端登录到这台远程主机。
此时,联机过程中所有传输的数据都是加密的。

基于秘钥的安全认证

  • 基于密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一对密钥对,然后把公用密钥(Public key)放在需要访问的目标服务器上,另外,还需要把私有密钥(Private key)放到SSH的客户端或对应的客户端服务器上。
  • 此时,如果要想连接到这个带有公用密钥的SSH服务器,客户端SSH软件或客户端服务器就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上寻找对应用户的公用密钥,然后把它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公用密钥加密“质询”并把它发送给SSH客户端。
  • SSH客户端收到“质询”之后就可以用自己的私钥解密,再把它发送给SSH服务器。使用这种方式,需要知道联机用户的密钥文件。与第一种基于口令验证的方式相比,第二种方式不需要在网络上传送口令密码,所以安全性更高了。

(七)ssh-keygen命令

生成、管理和转换认证密钥

ssh-keygen 用于为 ssh生成、管理和转换认证密钥,包括 RSA 和 DSA 两种密钥。

  • 通常,这个程序产生一个密钥对,并要求指定一个文件存放私钥,同时将公钥存放在附加了".pub"后缀的同名文件中。

  • 程序同时要求输入一个密语字符串(passphrase),空表示没有密语(主机密钥的密语必须为空)。

  • 密语和口令(password)非常相似,但是密语可以是一句话,里面有单词、标点符号、数字、空格或任何你想要的字符。

  • 好的密语要30个以上的字符,难以猜出,由大小写字母、数字、非字母混合组成。密语可以用 -p 选项修改。

  • 丢失的密语不可恢复。如果丢失或忘记了密语,用户必须产生新的密钥,然后把相应的公钥分发到其他机器上去。 密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于SSH-2的RSA密钥。

用法:

ssh-keygen [选项] [参数]

选项:

  • -f filename :指定密钥文件名。

  • -P passphrase :指定密语。

  • -t type : 指定要创建的密钥类型。可以使用:“rsa1”(SSH-1) “rsa”(SSH-2) “dsa”(SSH-2)

  • -F hostname : 在 known_hosts 文件中搜索指定的 hostname ,并列出所有的匹配项。

  • -R hostname :从 known_hosts 文件中删除所有属于 hostname 的密钥。
    文件

  • ~/.ssh/identity
    该用户默认的 RSA1 身份认证私钥(SSH-1)。此文件的权限应当至少限制为"600"。
    生成密钥的时候可以指定采用密语来加密该私钥(3DES)。
    ssh(1) 将在登录的时候读取这个文件。

  • ~/.ssh/identity.pub
    该用户默认的 RSA1 身份认证公钥(SSH-1)。此文件无需保密。
    此文件的内容应该添加到所有 RSA1 目标主机的 ~/.ssh/authorized_keys 文件中。

  • ~/.ssh/id_dsa
    该用户默认的 DSA 身份认证私钥(SSH-2)。此文件的权限应当至少限制为"600"。
    生成密钥的时候可以指定采用密语来加密该私钥(3DES)。
    ssh(1) 将在登录的时候读取这个文件。

  • ~/.ssh/id_dsa.pub
    该用户默认的 DSA 身份认证公钥(SSH-2)。此文件无需保密。
    此文件的内容应该添加到所有 DSA 目标主机的 ~/.ssh/authorized_keys 文件中。

  • ~/.ssh/id_rsa
    该用户默认的 RSA 身份认证私钥(SSH-2)。此文件的权限应当至少限制为"600"。
    生成密钥的时候可以指定采用密语来加密该私钥(3DES)。
    ssh(1) 将在登录的时候读取这个文件。

  • ~/.ssh/id_rsa.pub
    该用户默认的 RSA 身份认证公钥(SSH-2)。此文件无需保密。
    此文件的内容应该添加到所有 RSA 目标主机的 ~/.ssh/authorized_keys 文件中。

  • /etc/ssh/moduli
    包含用于 DH-GEX 的 Diffie-Hellman groups 。

实现SSH基于密钥的免密登录

  1. 客户端创建密钥
[root@server ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  	#创建的密钥对文件名和路径,回车表示默认存放在/root/.ssh/下,会生成两个文件id_rsa(用户私钥),id_rsa.pub(用户公钥)
Enter passphrase (empty for no passphrase):   :	#程序同时要求输入一个密语字符串(passphrase),为进行密钥对验证时输入的密码(和linux用户登录的密码完全没有关
系);空(直接回车)表示没有密语。丢失的密语不可恢复。如果丢失或忘记了密语,用户必须产生新的密钥,然后把相应的公钥分发到其他机器上去。如果我们要进行的是SSH免密码连接,那么这里密码为空跳过即可。
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:GO6lbNqy+AfVBxPwleFh0+e8CRusNIDdoDOnoiuzUpc root@server
The key's randomart image is:
+---[RSA 2048]----+
|      .+o+*+     |
|      .o=+oo. .  |
|      =.o+.. +   |
|     ..B. + + o  |
|    .o+ So o + o |
|  ..E+ o  . . o  |
| ... .=          |
|+  o.+.          |
|o+o.++.          |
+----[SHA256]-----+
[root@server ~]# cd .ssh/
[root@server ~/.ssh]# ls
id_rsa  id_rsa.pub  known_hosts
#
id_rsa(用户私钥),id_rsa.pub(用户公钥)
known_hosts是做服务器认证的。;当你用ssh连接到一个新的服务器的时候,ssh会让你确认服务器的信息(域名、IP、公钥),如果你确认了,就会写到known_hosts里。
A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,
OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
  1. 将客户端生成的公钥id_rsa.pub文件复制到需要连接的ssh服务器下
[root@server ~/.ssh]# scp id_rsa.pub root@192.168.126.10:/root/ 
root@192.168.126.10's password: 
id_rsa.pub                   100%  393    29.5KB/s   00:00 
  1. 在ssh服务器端将拷贝过去的id_rsa.pub文件里的内容追加到~/.ssh/authorized_keys文件(如果没有authorized_keys文件则需创建)
[root@client ~]# cat id_rsa.pub >> .ssh/authorized_keys
  1. 此时在ssh客户端就可以免密登录到ssh服务器端
[root@server ~/.ssh]# ssh root@192.168.126.10

小结:

  • 如果要进行免密码的SSH连接,那么在创建密钥对的时候不要输入密语(即直接回车确定)
  • SSH基于密钥的安全认证的本质其实就是将密钥对中的公钥里的内容拷贝到对方服务器的用户家目
    录下的.ssh目录里的authorized_keys文件里。
  • 要和对方ssh服务器的哪个用户进行密钥对认证,那么你就要把公钥拷到对方该用户的家目录下
    的.ssh目录里的authorized_keys文件里(如果是想和普通用户进行密钥对登录,需要拷贝到/home目
    录下的该用户家目录下。)
  • ssh-keygen -t参数可以指定密钥对的加密类型。如果不指定默认rsa加密。

基于交互式创建密钥对不适用于脚本文件,可以ssh-keygen命令的选项进行非交互式创建密钥对

[root@server ~]# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
#
-t dsa:指定密钥类型为:dsa
-f ~/.ssh/id_dsa:指定密钥文件存放位置及文件名
-P "":无密语

(八)ssh-copy-id命令

ssh-copy-id命令可以将本地主机的公钥复制到远程主机的authorized_keys(即使authorized_keys文件不存在也会自动创建)文件中,可以实现公钥的自动分发

用法:

ssh-copy-id option [user@]hostname

选项:

  • -i filename:指定认证文件(公钥)
  • -f :强制模式
  • -n :测试,不实际替换
  • -p port :指定端口
  • -o option :指定其他 ssh 参数

分发公钥至ssh服务器

[root@server ~/.ssh]# ssh-keygen -f ~/.ssh/id_rsa -t rsa -P ""
[root@server ~/.ssh]# ssh-copy-id -i id_rsa.pub root@192.168.126.10
#之后就可以进行ssh的免密登录

(九)SSH配置文件

  • ssh客户端配置文件为/etc/ssh/ssh_config和~/.ssh/config文件
  • ssh服务端配置为/etc/ssh/sshd_config文件

对于给定用户,共有两个配置文件:针对某个用户的配置文件~/.ssh/config(用户专用)和针对系统所有用户的配置文件/etc/ssh/ssh_config(全局共享)。系统加载后会先读取全局文件再加载专用文件。所以,在两个文件中若配置有相同的参数,则专用文件会覆盖前者生效。即用户可以通过在自己的用户配置文件中设置同样的参数将全局参数设置覆盖掉。

  1. ~/.ssh/config

.ssh/config文件是Linux系统下针对SSH客户端的一个参数配置方案,可以将一些关于SSH命令的参数放到配置文件中去,执行ssh命令的时候从文件中读取,简化命令行的操作。

当用户第一次运行ssh命令时,将自动创建~/.ssh目录,如果没有使用过ssh需要进行创建(该目录的权限一定为700);默认情况下,ssh用户专用的配置文件config不存在,所以需要创建,权限为600或700(即此文件只能由该用户进行读写,其他任何人不应有任何权限)

文件示例:

[root@server ~/.ssh]# cat config
# configuration 1
Host cluster
	HostName 192.168.126.31
	User tom

# configuration 2
Host=aliyun
	Hostname=201.11.22.33
	User tom

说明:

  • 每项配置都是参数名 参数值参数值=参数名 的形式,其中参数名不区分大小写,而参数值区分大小写,如上面的参数名 HostNameHostname 是同一个参数
  • 不同主机的配置通过 Host 参数来区分,一个配置文件里面可以有针对多个Host的配置
  • 以#开头的是注释,会被忽略
  • 同一个Host的配置内部,参数名 参数值参数值=参数名 的形式可以混用

常用参数:

  • Host

    类似设备别名(自定义的),用于标识某个特定的配置,在ssh命令中使用

例如要ssh连接到上例中的#1配置的主机,则在命令行执行如下命令即可:

ssh cluster

如上运行,会使用tom用户连接192.168.126.31主机,如果此时想要要以root用户身份进行连接,并且希望使用所有其他选项,那么可以使用-o选项进行指定替换:

ssh -o "User=root" cluster

如果希望ssh客户端忽略ssh配置文件中指定的所有选项进行连接,则可以使用:

ssh -F /dev/null user@example.com



在没有配置此文件前使用scp命令如下:

scp file tom@192.168.11.11:~/

配置过上例中的文件后,可以简化成这样:

scp a.txt cluster:~/

省略了用户名和IP地址,方便许多

  • HostName

需要ssh连接过去的主机名,一般是IP地址,域名也可以

  • User

登录主机的用户名

  • IdentityFile

认证证书文件,默认位置是~/.ssh/id_rsa, ~/ssh/id_dsa等,如果采用默认的证书,可以不用设置此参数,除非你的证书放在某个自定义的目录,那么就需要设置该参数来指向你的证书

  • Port

SSH访问主机的端口号,默认是22端口。只有在非默认情况下才需要设置该值

  • 其他
    貌似常用的参数就这些,别的参数可以在命令行通过 man ssh_config 来查看,其实涉及的参数还是非常多的。
  1. /etc/ssh/ssh_config

ssh_config和sshd_config都是ssh服务器的配置文件,二者区别在于,前者是针对客户端的配置文件,后者则是针对服务端的配置文件。两个配置文件都允许你通过设置不同的选项来改变客户端程序的运行方式。下面列出来的是两个配置文件中最重要的一些关键词,每一行为“关键词&值”的形式,其中“关键词”是忽略大小写的

‍‍1、编辑 /etc/ssh/ssh_config (客户端)文件

# Site-wide defaults for various options
Host *
        ForwardAgent no
        ForwardX11 no
        RhostsAuthentication no
        RhostsRSAAuthentication no
    ‍    RSAAuthentication yes
        PasswordAuthentication yes
        FallBackToRsh no
        UseRsh no
        BatchMode no
        CheckHostIP yes
        StrictHostKeyChecking no
        IdentityFile ~/.ssh/identity
        Port 22
        Cipher blowfish
        EscapeChar ~

说明:

  • # Site-wide defaults for various options

带“#”表示该句为注释不起作,该句不属于配置文件原文,意在说明下面选项均为系统初始默认的选项。说明一下,实际配置文件中也有很多选项前面加有“#”注释,虽然表示不起作用,其实是说明此为系统默认的初始化设置。

  • Host *

"Host"只对匹配后面字串的计算机有效,“”表示所有的计算机。从该项格式前置一些可以看出,这是一个类似于全局的选项,表示下面缩进的选项都适用于该设置,可以指定某计算机替换号使下面选项只针对该算机器生效。

  • ForwardAgent no

"ForwardAgent"设置连接是否经过验证代理(如果存在)转发给远程计算机。

  • ForwardX11 no

"ForwardX11"设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。

  • RhostsAuthentication no

"RhostsAuthentication"设置是否使用基于rhosts的安全验证。

  • RhostsRSAAuthentication no

"RhostsRSAAuthentication"设置是否使用用RSA算法的基于rhosts的安全验证。

  • RSAAuthentication yes

"RSAAuthentication"设置是否使用RSA算法进行安全验证。

  • PasswordAuthentication yes

"PasswordAuthentication"设置是否使用口令验证。

  • FallBackToRsh no

“FallBackToRsh"设置如果用ssh连接出现错误是否自动使用rsh,由于rsh并不安全,所以此选项应当设置为"no”。

  • UseRsh no

“UseRsh"设置是否在这台计算机上使用"rlogin/rsh”,原因同上,设为"no"。

  • BatchMode no

“BatchMode”:批处理模式,一般设为"no";如果设为"yes",交互式输入口令的提示将被禁止,这个选项对脚本文件和批处理任务十分有用。

  • CheckHostIP yes

“CheckHostIP"设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为"yes”。

  • StrictHostKeyChecking no

“StrictHostKeyChecking"如果设为"yes”,ssh将不会自动把计算机的密匙加入"$HOME/.ssh/known_hosts"文件,且一旦计算机的密匙发生了变化,就拒绝连接。

  • IdentityFile ~/.ssh/identity

"IdentityFile"设置读取用户的RSA安全验证标识。

  • Port 22

"Port"设置连接到远程主机的端口,ssh默认端口为22。

  • Cipher blowfish

“Cipher”设置加密用的密钥,blowfish可以自己随意设置。

  • EscapeChar ~

“EscapeChar”设置escape字符。

2、编辑 /etc/ssh/sshd_config(服务端) 文件:‍

# This is ssh server systemwide configuration file.
          Port 22
          ListenAddress 192.168.1.1
          HostKey /etc/ssh/ssh_host_key
          ServerKeyBits 1024
          LoginGraceTime 600
          KeyRegenerationInterval 3600
          PermitRootLogin no
          IgnoreRhosts yes
          IgnoreUserKnownHosts yes
          StrictModes yes
          X11Forwarding no
          PrintMotd yes
          SyslogFacility AUTH
          LogLevel INFO
          RhostsAuthentication no
          RhostsRSAAuthentication no
          RSAAuthentication yes
          PasswordAuthentication yes
          PermitEmptyPasswords no
          AllowUsers admin

‍下面逐行说明上面的选项设置:

  • Port 22

"Port"设置sshd监听的端口号。

  • ListenAddress 192.168.1.1

"ListenAddress”设置sshd服务器绑定的IP地址。

  • HostKey /etc/ssh/ssh_host_key

"HostKey”设置包含计算机私人密匙的文件。

  • ServerKeyBits 1024

"ServerKeyBits”定义服务器密匙的位数。

  • LoginGraceTime 600

"LoginGraceTime”设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位)。

  • KeyRegenerationInterval 3600

"KeyRegenerationInterval”设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被截获的信息。

  • PermitRootLogin no

“PermitRootLogin”设置是否允许root通过ssh登录。这个选项从安全角度来讲应设成"no”。

  • IgnoreRhosts yes

"IgnoreRhosts”设置验证的时候是否使用“rhosts”和“shosts”文件。

  • IgnoreUserKnownHosts yes

“IgnoreUserKnownHosts”设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的”$HOME/.ssh/known_hosts”

  • StrictModes yes

"StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。

  • X11Forwarding no

"X11Forwarding”设置是否允许X11转发。

  • PrintMotd yes

"PrintMotd”设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。

  • SyslogFacility AUTH

"SyslogFacility”设置在记录来自sshd的消息的时候,是否给出“facility code”。

  • LogLevel INFO

"LogLevel”设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。

  • RhostsAuthentication no

"RhostsAuthentication”设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。

  • RhostsRSAAuthentication no

"RhostsRSA”设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。

  • RSAAuthentication yes

"RSAAuthentication”设置是否允许只有RSA安全验证。

  • PasswordAuthentication yes

"PasswordAuthentication”设置是否允许口令验证。

  • PermitEmptyPasswords no

"PermitEmptyPasswords”设置是否允许用口令为空的帐号登录。

  • AllowUsers admin

"AllowUsers”的后面可以跟任意的数量的用户名的匹配串,这些字符串用空格隔开。主机名可以是域名或IP地址。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值