1. SSH服务介绍
SSH是Secure Shell Protocol的简写,由IETF国际互联网工程任务组制定。在进行数据传输之间,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据传输,以确保传输数据安全。
SSH是专为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以有效地防止远程管理过程中的数据信息泄露问题,在当前的生产环境运维工作中,几乎99%的企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密连接)等。
在默认状态下,SSH服务主要提供一下两个服务功能:
- 类似telnet远程联机服务器的服务,即上面提到的SSH服务。
- 类似FTP服务的SFTP-server,借助SSH协议提供更安全的SFTP服务。
1.1 SSH连接排错思想
SSH远程管理服务已经普遍应用于各大中小型的企业运维中,实现对主机设备的远程管理和远程控制,远程管理服务是所有互联网技术人员都需要掌握的基础技术能力,特别是对于运维技术人员而言,当SSH远程服务出现问题时,一定要具有熟练的排错能力,及时定位远程服务故障原因,协调相关部门技术人员,尽快解决远程连接问题。
利用下图所示信息,可以把SSH远程管理服务排错过程分为3步:
1.1.1 检查远程访问链路是否通畅(SSH客户端)
确认网络连接是否通畅,如果网络线路连接已经出现问题,不仅远程服务会受影响,其他服务可能也会出现问题,所以应该首先排除线路问题。
# 检查线路问题命令方法,注意是在SSH客户端进行排查。
ping 服务器IP地址 ---确认主机链路状态,但可能禁ICMP协议了
tracert -d 服务器IP地址 ---进行路由追踪,确认链路状态,-d参数表示禁止反向DNS解析
下面是在Xshell SSH客户端里访问的结果,显示是通的状态
[C:\~]$ ping 192.168.9.8
正在 Ping 192.168.9.8 具有 32 字节的数据:
来自 192.168.9.8 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.9.8 的回复: 字节=32 时间<1ms TTL=64
如果是在虚拟软件中部署操作系统,出现线路问题时检测步骤如下:
1)查看网卡是否有IP地址,IP地址是否书写正确。
2)克隆(跳板机)。
- 清空/etc/udev/rules.d/70-persistent-net.rules(CentOS7系统不需要此步操作)。
- 删除UUID和HWADDR这两行(CentOS7系统不需要此步操作)。
3)是否为NAT模式(VM虚拟网络编辑器中),独立环境桥接也可以。
4)Windows VMware服务是否开启。
1.1.2 检查远程访问是否做了策略控制(SSH客户端)
确认是否做了策略控制,阻止了远程的访问,一般出现这种远程访问问题都是出于安全性考虑禁止有些远程主机进行连接;造成这种问题的原因大部分是被防火墙策略阻止,或者被其他安全服务禁止。
# 排查与解决策略控制问题
systemctl stop firewalld ---如果防火墙开启了,可以将防火墙关闭
systemctl disable firewalld ---禁止开机自启动
systemctl status firewalld ---检查防火墙有没有开启,后端服务器不用开启系统防火墙功能
1.1.3 检查远程管理服务器是否开启(SSH客户端)
确认远程管理服务是否开启也是重要的检查步骤,因为有时候部署一台服务器时,会忘记将SSH远程服务设置为开机自启动,而有时服务器一旦重启就会发现远程连接不上了,可能前两项检查都是正确的,但还是不能进行远程连接。
# 排查远程服务是否开启文件
Telnet服务器IP地址 SSH服务端口号 ---利用服务端口测试命令确认服务是否开启
Nmap服务器IP地址 -p SSH服务端口号 ---利用服务端口测试命令确认服务是否开启
下面是在Xshell SSH客户端里访问的结果,显示是通的状态
[C:\~]$ telnet 192.168.9.8 22
Connecting to 192.168.9.8:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
SSH-2.0-OpenSSH_7.4
1.2 SSH远程连接介绍
运维人员在企业日常工作中基本上都是远程登录Linux系统对系统服务进行管理配置,比较常见的远程管理服务主要有以下两种:
SSH和Telnet远程登录主机数据传输对比如下图:
1)ssh命令使用方法(Xshell软件中用法)如下:
[C:\~]$ help ssh
NAME
ssh - connects to a host using the SSH protocol.
SYNOPSYS
ssh [-pa ][-a ][-A ][-i user_key ][-J jump_host ][user:pass@]host[ port][;host[ port]] ---ssh命令使用语法格式
jump_host: [user:pass@]host[:port][,[user:pass@]host[:port]]
OPTIONS
-pa Use Password authentication. Ignore other auth parameters(-A -i).
-a Do not use Xagent for user authentication.
-A Use Xagent for user authentication.
-i user_key User key authentication.
-J jump_host Use jump host proxy.*
user Indicates the user's login name.
pass If pass is definded, use password authentication.
host Indicates the name, alias, or Internet address of the
remote host.
port Indicates a port number (address of an application).
If the port is not specified, the default ssh port
(22) is used.
# 远程连接测试
[C:\~]$ ssh 192.168.9.8 22
Connecting to 192.168.9.8:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Thu Mar 12 10:06:05 2020 from gateway
2)Telnet命令使用方法(Xshell软件中用法)如下:
[C:\~]$ help telnet
NAME
telnet - connects to a host using the TELNET protocol.
SYNOPSYS
telnet [user@]host [port] ---命令使用语法格式
OPTIONS
host Indicates the name, alias, or Internet address of the
remote host.
port Indicates a port number (address of an application).
If the port is not specified, the default telnet port
(23) is used.
# 远程连接测试
[C:\~]$ telnet 192.168.9.8 22
Connecting to 192.168.9.8:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
SSH-2.0-OpenSSH_7.4
1.3 SSH知识要点小结
1)SSH是安全的加密协议,用于远程连接Linux系统。
2)SSH默认端口是22,安全协议版本为SSH2,除了SSH2之外还有SSH1(有漏洞)。
3)SSH服务端主要包含两个服务功能:SSH远程连接和SFTP服务。
4)Linux SSH客户端包含ssh远程连接命令、远程拷贝scp命令、sftp连接命令等。
2. SSH服务工具详解
SSH服务由服务端软件OpenSSH和客户端[常见的有SSH(Linux)/SecureCRT/Putty/Xshell]组成,SSH服务默认使用22端口提供服务,它有两个不兼容的SSH协议版本,分别是1.x和2.x。
# 获取openssh相关软件包信息
[root@localhost ~]# rpm -qa | grep openssh
openssh-server-7.4p1-16.el7.x86_64
openssh-clients-7.4p1-16.el7.x86_64
openssh-7.4p1-16.el7.x86_64
以下为远程管理客户端软件大礼包中涉及的重要文件数据信息说明:
# SSH客户端软件包列表信息
[root@localhost ~]# rpm -ql openssh-clients
/etc/ssh/ssh_config ---SSH客户端配置文件信息
/usr/bin/scp (重要) ---安全的远端拷贝工具
/usr/bin/sftp ---安全的FTP传输工具
/usr/bin/ssh (重要) ---SSH客户端远程连接工具
/usr/bin/ssh-copy-id (重要) ---将公钥发送到远程并修改为authorized_keys名字
---省略部分内容信息---
以下为远程管理服务器端软件OpenSSH-server大礼包中涉及的重要文件数据信息说明:
# SSH服务器软件包列表信息
[root@localhost ~]# rpm -ql openssh-server
/etc/pam.d/sshd
/etc/ssh/sshd_config (重要) ---SSH服务器端配置文件信息
/etc/sysconfig/sshd
/usr/lib/systemd/system/sshd-keygen.service
/usr/lib/systemd/system/sshd.service (重要) ---systemctl管理的SSH服务配置
/usr/lib/systemd/system/sshd.socket
/usr/lib/systemd/system/sshd@.service
/usr/lib64/fipscheck/sshd.hmac
/usr/libexec/openssh/sftp-server
/usr/sbin/sshd (重要) ---SSH服务守护进程命令
/usr/sbin/sshd-keygen (重要) ---SSH密钥创建工具
OpenSSH同时支持SSH 1.x和2.x协议。SSH2.x的客户端程序不能连接到SSH 1.x的服务程序上。
SSH服务器端是一个守护进程,它在后台运行并响应来自客户端的连接请求。SSH服务端的进程名为“SSHD”,负责实时监听远程SSH客户端的连接请求并进行处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接等。这个SSH服务就是前面Linux基础系统优化中保留的开机自启动的服务之一。
SSH客户端包含SSH以及像scp(远程拷贝)、slogin(远程登录)、SFTP(安全FTP文件传输)等应用程序。
SSH的工作机制大致是本地的SSH客户端先发送一个连接请求到远程的SSH服务器端,服务器端检查请求连接的客户端发送的数据包(含用户、密码)和IP地址,如果确认合法,就会发送密钥给SSH的客户端,此时,本地客户端再将密钥发回给服务器端,自此连接建立。SSH 1.x和SSH 2.x在连接协议上有一些安全方面的差异。
2.1 SSH加密技术说明
SSH加密技术就是将人类可以看得懂的数据,通过一些特殊的程序算法变成杂乱的无意义的信息,然后,通过网络进行传输,而当到了目的地后,再通过对应的解密算法把传过来的加密数据信息解密成加密前的可读的正常数据。因此,当数据在互联网上传输时即使被有心的黑客监听窃取了,他们也很难获取到真正需要的数据。
当前,网络上的数据包加密数据一般是通过所谓的一队公钥与私钥(Public Key and Pivate Key)组合成的密钥对进行加密与解密操作。如下图所示,B-Server要给A_Client传数据,首先会通过本地的公钥(Public Key或Server Key)加密后再到发到网络上传输。而加密的数据到达A_Client端后,再经由A_Client本地的私钥将加密的数据解密出来。由于在Internet上传输的数据时加密过的,所以,传输的数据内容一般来说是比较安全的。
OpenSSH是SSH服务器端的软件之一,可同时支持SSH 1.x和SSH 2.x协议,可以在配置文件中使用Protocol指令指定只支持其中一种或两种都支持。另外,SSH 2.x同时支持RSA和DSA密钥,但是SSH 1.x仅支持RSA密钥。
2.1.1 SSH加密算法v1.x
每一台SSH服务器主机都可以使用RSA加密方式来产生一个1024-bit的RSA Key,这个RSA的加密方式就是用来产生公钥与私钥的算法之一。SSH 1.x的整个联机加密步骤如下:
1)当SSH服务启动时,就会产生一个768-bit的临时公钥(sshd_config配置文件中ServerKeyBits 768)存放在Server中(CentOS5-CentOS7各有不同,但不影响理解加解密过程。
[root@localhost ~]# grep ServerKey /etc/ssh/sshd_config ---CentOS5下的sshd是产生768字节
#ServerKeyBits 768
[root@localhost ~]# grep ServerKey /etc/ssh/sshd_config ---CentOS6下的sshd是产生1024字节
#ServerKeyBits 1024
2)当Client端SSH联机请求传送过来时,Server就会将这个768-bit的公钥传给Client端,此时,Client会将此公钥与先前存储的公钥进行对比,看是否一致。判断标准是Client端联机用户目录下~/.ssh/known_hosts文件原有的内容(Linux客户端)。
[root@localhost ~]# ssh -p22 root@192.168.9.5
The authenticity of host '192.168.9.5 (192.168.9.5)' can't be established.
ECDSA key fingerprint is SHA256:lpAQ77XAqJ/27nex4tZvKv8y9craDayqf12ZB9V3QKk.
ECDSA key fingerprint is MD5:c8:94:09:a2:27:8b:92:6f:b7:60:fc:94:bd:f9:14:88.
Are you sure you want to continue connecting (yes/no)?
2.1.2 SSH加密算法v2.x
在SSH 1.x的联机过程中,当Server接受Client端的Private Key后,就不再针对该次联机的Key Pair进行校验。此时若有恶意黑客针对该联机的Key Pair插入恶意的程序代码,由于服务器端不会再检验联机的正确性,因此可能会接受该程序代码,从而造成系统被黑掉。
为了弥补这个缺点,SSH version 2多加了一个确认联机正确性的Diffie-Hellman机制,在每次的数据传输中,Server都会以该机制检查数据的来源是否正确,这样,可以避免联机过程中被插入恶意程序代码的问题。也就是说,SSH version 2是比较安全的。
由于SSH 1.x协议本身存在较大安全问题,因此,建议大家尽量用SSH 2.x的联机模式。而联机版本的设置则需要在SSH主机端与客户端均设置好才行。事实上,当前的CentOS5.x系统SSH服务端的配置,默认就是只支持SSH 2.x的,我们只需要在SSH客户端远程连接时指定通过SSH 2.x协议进行连接即可。
2.2 SSH服务认证类型
从SSH客户端来看,SSH服务主要提供两种安全登录模式,具体如下。
2.2.1 基于口令的安全验证
基于口令的安全验证的方式就是大家一直在用的,只要知道服务器的SSH连接帐号和口令(当然也要知道对应服务器的IP及开放的SSH端口,默认为22),就可以通过SSH客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。
以下为Xshell及SSH客户端连接口令验证的测试。
[root@localhost ~]# ssh -p22 root@192.168.9.5
The authenticity of host '192.168.9.5 (192.168.9.5)' can't be established.
ECDSA key fingerprint is SHA256:lpAQ77XAqJ/27nex4tZvKv8y9craDayqf12ZB9V3QKk.
ECDSA key fingerprint is MD5:c8:94:09:a2:27:8b:92:6f:b7:60:fc:94:bd:f9:14:88.
Are you sure you want to continue connecting (yes/no)? ^C
[root@localhost ~]# ssh -p22 root@192.168.9.5
The authenticity of host '192.168.9.5 (192.168.9.5)' can't be established.
ECDSA key fingerprint is SHA256:lpAQ77XAqJ/27nex4tZvKv8y9craDayqf12ZB9V3QKk.
ECDSA key fingerprint is MD5:c8:94:09:a2:27:8b:92:6f:b7:60:fc:94:bd:f9:14:88.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.9.5' (ECDSA) to the list of known hosts.
root@192.168.9.5's password: ---输入密码,不显示
Last login: Sun Mar 1 16:39:58 2020 from gateway
2.2.2 基于密钥的安全验证
基于密钥的安全验证方式需要依靠密钥,也就是必须事先建立一个密钥对,然后把公钥(锁头)放在需要访问的目标服务器上,另外,还需要把私钥(钥匙)放到SSH的客户端或对应的客户端服务器上。
此时,如果要想连接到这个带有公钥的SSH服务器,客户端SSH软件或者客户端服务器就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后把它和连接的SSH客户端发送过来的公钥进行比较。如果两个密钥一致,SSH服务器就用公钥加密“质询”(Challenge)并把它发送给SSH客户端。
SSH客户端收到“质询”之后就可以用自己的私钥揭解密,再把它发送给SSH服务器。使用这种方式,需要知道联机用户的密钥文件。与第一种基于口令验证的方式相比,第二种方式不需要在网络上传送口令密码,所以安全性更高了,这时我们也要注意保护我们的密钥文件,特别是私钥文件,一旦被黑客获取,危险就很大了。