SSH远程管理协议

1,065 阅读15分钟

SSH协议

SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式已经慢慢不被接受。SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的登录和其他安全网络服务。作为Telnet和其他不安全远程shell协议的安全替代方案,目前SSH协议已经被全世界广泛使用,大多数设备都支持SSH功能。

  1. SSH是如何工作的?

SSH由服务器和客户端组成,在整个通信过程中,为建立安全的SSH通道,会经历如下几个阶段:

  1. 连接建立

SSH服务器在指定的端口侦听客户端的连接请求,在客户端向服务器发起连接请求后,双方建立一个TCP连接。

  1. 版本协商

SSH协议目前存在SSH1.X(SSH2.0之前的版本)和SSH2.0版本。SSH2.0协议相比SSH1.X协议来说,在结构上做了扩展,可以支持更多的认证方法和密钥交换方法,同时提高了服务能力。SSH服务器和客户端通过协商确定最终使用的SSH版本号。

  1. 算法协商

SSH支持多种加密算法,双方根据各自支持的算法,协商出最终用于产生会话密钥的密钥交换算法、用于数据信息加密的加密算法、用于进行数字签名和认证的公钥算法以及用于数据完整性保护的HMAC算法。

  1. 密钥交换

服务器和客户端通过密钥交换算法,动态生成共享的会话密钥和会话ID,建立加密通道。会话密钥主要用于后续数据传输的加密,会话ID用于在认证过程中标识该SSH连接。

  1. 用户认证

SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证。SSH支持以下几种认证方式:

-密码(password)认证:客户端通过用户名和密码的方式进行认证,将加密后的用户名和密码发送给服务器,服务器解密后与本地保存的用户名和密码进行对比,并向客户端返回认证成功或失败的消息。
-密钥(publickey)认证:客户端通过用户名,公钥以及公钥算法等信息来与服务器进行认证。
-password-publickey认证:指用户需要同时满足密码认证和密钥认证才能登录。
-all认证:只要满足密码认证和密钥认证其中一种即可。

7. 会话请求

认证通过后,SSH客户端向服务器端发送会话请求,请求服务器提供某种类型的服务,即请求与服务器建立相应的会话。

  1. 会话交互

会话建立后,SSH服务器端和客户端在该会话上进行数据信息的交互。

                          网络
SSH客户端<----------------------------------------->SSH服务端
             数据传输是加密的,可以防止信息泄露
             数据传输是压缩的,可以提高传输速度

目前SSH协议应用较为广泛(加密传输) QQ截图20220817140126.png

TELNET是铭文传输,用抓包软件即可截取传输的所有数据,不安全 QQ截图20220817140437.png

  • SSH常用工具
  1. SSH客户端:Putty Xshell CRT
  2. SSH服务端:OpenSSH

OpenSSH

是实现 SSH 协议的开源软件项目。适用于各种 UNIX LINUX 操作系统软件

在centos7中 ssh程序是默认打开的默认端口是 TCP 22 QQ截图20220817161906.png

QQ截图20220817162914.png 默认端口为TCP 22 QQ截图20220817165352.png SSH是默认开启的远程管理程序,如果没有开启SSH服务就需要去机房接上显示器去打开服务

启动SSH服务
[root@localhost ssh]# systemctl start sshd

QQ截图20220817163331.png

sshd 服务端的默认配置文件是/etc/ssh/sshd_config

sshd_config     //服务端配置文件(常修改的配置文件)

ssh_config      //客户端配置文(基本不修改)

QQ截图20220817165910.png

[root@localhost ssh]# vim /etc/ssh/sshd_config   //服务端配置文件
#Port 22   //监听端口为22(需要修改不然容易被爆破)
#ListenAddress 0.0.0.0   //监听地址为任意网段所有,也可以指定OpenSSH服务器的具体IP(apv4)
#ListenAddress ::   //监听ipv6的所有端口

#LoginGraceTime 2m    //登录验证时间为2分钟
#PermitRootLogin yes   //禁止root用户直接登录
#MaxAuthTries 6   //最大重试次数为6次
#PermitEmptyPasswords no   //禁止空密码用户登录
#UseDNS yes     //禁止 DNS 反向解析,以提高服务器的响应速度

#设置黑白名单
#llowUsers yuji@192.168.85.10 lisi   //只允许yuji用户从192.168.85.10访问,允许lisi从所有地址访问
#enyUsers liwu   //不允许使用liwu用户登录


#白名单的优先级高于黑名单。如果一个用户同时加入了白名单和黑名单,那么该用户是可以访问的。  
#如果不设置白名单,则所有用户都可以登录访问。一旦设置了白名单,那么只有白名单内的用户可以访问。

sshd服务支持两种验证方式;1.密码验证 对服务器中本地系统用户的登录名称、密码进行验证。简便,但可能会被暴力破解

QQ截图20220817215523.png

QQ截图20220817215005.png

QQ截图20220817215134.png

QQ截图20220817215451.png 如果在刷新SSHD服务出错了 关闭防火墙即可 QQ截图20220817220718.png 根据上面设定的不允许root用户直接登录

QQ截图20220818000116.png 反正加入3次后会被强制退出

QQ截图20220818000123.png 日志文件中也会有体现

QQ截图20220818000324.png 没有密码的用户也被禁止了所以也无法登陆

QQ截图20220818000804.png 虽然不可以直接登录root但是可以用别的账户登录以后再去登录root账户

QQ截图20220818000855.png

黑白名单

白名单的优先级高于黑名单,如果一个地址既在白名单也在黑名单中,该地址是可以访问的。

如果有人在攻击我可以查看

日志的管理文件,记录了日志的规则
[root@localhost ~]# vim /etc/rsyslog.conf
/var/log/secure


#设置黑白名单
#allowUsers yuji@192.168.85.10 lisi   //只允许yuji用户从192.168.85.10访问,允许lisi从所有地址访问
#denyUsers liwu   //不允许使用liwu用户登录

直接在配置文件中添加即可实现
[root@localhost log]# vim /etc/ssh/sshd_config

secure文件包含了所有的登录信息 QQ截图20220821161519.png 进入这个文件中就会看到登录失败的信息

QQ截图20220821161752.png

密钥对严重

密钥对验证:要求提供匹配的密钥信息才能通过验证,首先在客户端创建一对密钥文件(公钥、私钥),后把公钥文件放到需要远程连接的服务器中。

公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。 公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。通过这种算法得到的密钥对能保证在世界范围内是唯一的。 使用这个密钥对的时候,如果用其中一个密钥加密一段数据,则必须用另一个密钥才能解密。. 比如用公钥加密的数据就必须用私钥才能解密,如果用私钥进行加密也必须用公钥才能解密,否则将无法成功解密。

说明:由于私钥的非公开属性,建议在SSL证书申请过程中,由客户自己生成私钥,并妥善保管。

vim /etc/ssh/sshd_config
PasswordAuthentication yes     //启用密码验证
PubkeyAuthentication yes    //启用密钥对验证
AuthorizedKeysEile .ssh/ authorized_keys    //指定公钥库文件

使用 SSH 客户端程序

l.ssh远程登录

当用户第一次登漱SSH服务器时,必须接受服务器发来的ECDSNA密钥(根据提示输入"yes")后才能继续验证。接收的密钥信息将保存到~/.ssih inown_hosts文件中。密码验证成功以后,即可登录目标服务器的命令行环境中了。

SSH [选项] lisi@192.168.85.10

选项:

-p :指定非默认的端口号,缺省时默认使用 22端口

SSH -p 123 lisi@192.168.85.10

不指定用户代表默认使用当前用户去登录别的主机 ssh 192.168.85.10

使用ssh第一次登录服务器是就会验证

QQ截图20220821194032.png 同时也会创建出.ssh文件

目录当中也会出现登陆过的信息 QQ截图20220821194553.png

更改端口号

系统默认是22端口

[root@localhost ~]# vim /etc/ssh/sshd_config
[root@localhost ~]# systemctl restart sshd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

查看端口号
[root@localhost ~]# netstat -lntp | grep sshd

QQ截图20220821213735.png 端口号就改变了 QQ截图20220821213825.png 客户端登录

不加上-p 的话登录不上,因为更改过端口号了
[root@localhost ~]# ssh root@192.168.85.10
ssh: connect to host 192.168.85.10 port 22: Connection refused

加上端口号即可登录成功
[root@localhost ~]# ssh -p 2345 root@192.168.85.10
The authenticity of host '[192.168.85.10]:2345 ([192.168.85.10]:2345)' can't be established.
ECDSA key fingerprint is SHA256:8sMJzI7gfT3b2V/p1D59j4uLgrXvGOA+pnw9jZwVlNk.
ECDSA key fingerprint is MD5:51:06:17:41:4e:0b:f1:81:6f:9f:db:d3:bf:45:bc:19.
Are you sure you want to continue connecting (yes/no)? yue
Please type 'yes' or 'no': yes
Warning: Permanently added '[192.168.85.10]:2345' (ECDSA) to the list of known hosts.
root@192.168.85.10's password:


[root@localhost ~]# exit    //退出登录
登出
Connection to 192.168.85.10 closed.

就可以直接登录 QQ截图20220821214247.png

scp 远程复制

#下行复制(拉取)
scp root@192.168.85.10 :/etc/passwd /root/passwd10.txt
#将远程主机中的/etc/passwd文件复制到本机
#上行复制(推过去,给对方主机)
scp -r /etc/ ssh/ root@192.168.85.10 : /opt
将本机的/etc/ssh目录复制到远程主机


客户端使用方式
远程登录
ssh  [-p端口]  [用户]@服务端IP
推送   上行复制
scp  [-r 目录]  文件  [用户]@服务端IP:保存路径
拉取   下行复制
scp  -P  [用户]@服务端IP:保存路径   本地路径

sftp [-P]  [用户]@服务端IP

QQ截图20220821220018.png QQ截图20220821220037.png

sftp 安全 FTP

SFTP是SSH File Transfer Protocol的缩写,安全文件传送协议。SFTP与FTP有着几乎一样的语法和功能。SFTP为SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。

ftp    vsftp   tcp 20 21  
常规的文件传输协议,明文传输,传输速度较快但不安全,一般在局域网中使用

sftp           tcp 22
安全ftp,传输时会加密压缩,传输效率比普通ftp要低,但是安全性更高

tftp           udp 69
简单的轻量级文件传输协议,一般用于传输一些小文件
sftp [-P]  [用户]@服务端IP
put abc .txt   可以推送文件

get       #下载文件
get -r    #下载目录
put       #上传文件
put -r    #上传目录
quit、exitbye   #退出

sshd服务支持登录验证方式

sshd服务支持两种验证方式

认证方式: 用户账户密码认证 ,密钥对认证

  • 要求提供相匹配的密钥信息才能通过验证。 通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。 远程登录时,系统将使用公钥、私钥进行加密/解密关联验证。 能增强安全性,且可以免交互登录。
  • 当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。 可根据实际情况设置验证方式
  1. 公钥和私钥是成对生成的,这两个密钥互不相同,可以互相加密和解密;
  2. 不能根据一个密码来推算出另一个密钥;
  3. 公钥对外公开,私钥只有私钥的持有人才知道。

密钥对过程 QQ截图20220821223332.png

配置密钥对验证

1.在客户端创建密钥对 通过ssh-keygen 工.具为当前用户创建密钥对文件。可用的加密算法为RSA、ECDSA或DSA等(ssh-keygen命令的"-t"选项用于指定算法类型)。

[root@localhost ~]# ssh-keygen -t rsa    //生成密钥对文件

[root@localhost ~]# cd .ssh/
[root@localhost .ssh]# ls
id_rsa  id_rsa.pub  known_hosts   

id_rsa   //公钥文件
id_rsa.pub   //私钥文件

不同的算法后缀也是不一样的
[root@localhost .ssh]# ls
id_ecdsa  id_ecdsa.pub  known_hosts

QQ截图20220821224605.png

手动传输私钥文件

主意:如果修改了端口号记得加上 -P 端口

[root@localhost .ssh]# scp id_rsa.pub root@192.168.85.20:/opt
root@192.168.85.20's password:
id_rsa.pub                                 100%  408   620.7KB/s   00:00

QQ截图20220821230055.png

查看私钥里面的文本
[root@localhost opt]# cat id_rsa.pub

复制到这个文件里面,就可以使用了
[root@localhost .ssh]# vim authorized_keys

公钥文件 QQ截图20220821230413.png

[root@localhost .ssh]# ssh root@192.168.85.20    //直接登录
root@192.168.85.20's password:
Last failed login: Sun Aug 21 21:59:24 CST 2022 from 192.168.85.10 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sun Aug 21 21:32:23 2022 from 192.168.85.1
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.85.20  netmask 255.255.255.0  broadcast 192.168.85.255
        inet6 fe80::debe:70ce:ed53:3915  prefixlen 64  scopeid 0x20<link>

登录后就是另外一台主机 QQ截图20220821230926.png 自动传输

[root@localhost .ssh]# ssh-copy-id wang@192.168.85.20
如果要一次性传输多个密钥对文件 -i  文件  即可
ssh-copy-id -i

创建密钥对验证

1、在客户端创建密钥对
ssh-keygen -t  rsa   ecdsa    dsa (算法)
2.把公钥文件导到 ssh服务端

手动传输   复制客户端公钥文件id_ecdsa.pub 的内容,
文件在服务端用户的家目录  .ssh 目录中  创建authorized_keys 文件并把客户端公钥文件内容粘贴到这个文件中

自动传输  在客户端  ssh-copy-id -i  公钥文件   用户@服务端IP

3.在客户端使用ssh 用户@服务端IP登录服务端,使用密钥对私钥的密码进行验证

实现免交互登录
1.直接创建空密钥对文件即可

2.在导入公钥文件后,在客户端ssh-agent bash
ssh-add ,此方式只能在当前连接中有效

# TCP Wrappers 访问控制

TCP_Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,凡是包含有libwrap.so库文件的的程序就可以受 TCP_Wrappers 的安全控制。 它的主要功能就是控制谁可以访问,常见的程序有rpcbind、vsftpd、sshd,telnet。 TCP_Wrappers有一个TCP的守护进程叫作tcpd。 以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。

有些进程不受tcp_wrappers管理,例如 httpd、smb、squid等

工作原理

  • TCP_Wrappers有一个TCP的守护进程叫作tcpd。以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。

QQ截图20220821233700.png

格式:
<服务程序列表>海<客户端地址列表>

(1)服务程序列表ALL:代表所有的服务。
单个服务程序:_如"ySftpd 。
多个服务程序组成的列长:如"vsftpd,sshd"。
(2)客户端地址列表
ALL:代表任何客户端地址。LOCAL:代丧本机地址。
多个地址以逗号分隔
允许使用通配符“*”和“?”,前者代表任意长度字符,后者仅代表一个字符网段地址,如“192.168.80.”或者192.168.80.0/255.255.255.0
区域地址,如”.benet.com*匹L 配benet.com域中的所有主机。

TCP Wrappers的访问策略

  • 1、策略的配置格式 ❝ 两个策略文件的作用相反,但配置记录的格式相同,如下所示: : 服务程序列表、客户端地址列表之间以冒号分隔,在每个列表内的多个项之间以逗号分隔。 1)服务程序列表 ALL:代表所有的服务; 单个服务程序:如“vsftpd”; ...
  • 2、访问控制的基本原则 关于TCP Wrappers机制的访问策略,应用时遵循以下顺序和原则:首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问;否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问;如果检查上述两个文件都找不到相匹配的策略,则允许访问。
  • 3、TCP Wrappers配置实例 实际使用TCP Wrappers机制时,较宽松的策略可以是“允许所有,拒绝个别”,较严格的策略是“允许个别,拒绝所有”。

黑白名单

“允许所有,拒绝个别”
只需在/etc/hosts.deny文件中添加相应的拒绝策略
“允许个别,拒绝所有”
除了在/tc/hosts.allow中添加允许策略之外,还需要在/etc/hosts.deny文件中设置"ALL:ALL"的拒绝策略。

vi /etc/hosts.allow   //设置允许访问 TCP 服务程序的策略
sshd:12.0.0.1,192.168.80.*

vi ietc/hosts.deny     //设置禁止访问 TCP 服务程序的策略
sshd:ALL
sshd:192.168.85.0.* EXCEPT 192.168.85.10   
禁止该网段的所有地址使用sshd服务进行访问,除了192.168.85.10

服务:客户端地址
先看  lhosts.allow  文件中的策略,匹配上则直接放过,如果没有匹配再去看 hosts.deny 文件中的策略,匹配上则禁止/柜绝访问指定的tcp服务程序,如果也没有匹配上则默认允许放过