一节课详解SSH协议
? Telnet缺少安全的认证方式,而且传输过程采用TCP进行明文传输,存在很大的安全隐患。单纯提供Telnet服务容易招致DoS(Deny of Service)、主机IP地址欺骗、路由欺骗等恶意***。
? 随着人们对网络安全的重视,传统的Telnet和FTP通过明文传送密码和数据的方式,已经慢慢不被人接受。SSH(Secure Shell)是一个网络安全协议,通过对网络数据的加密,解决了这个问题。它在一个不安全的网络环境中,提供了安全的远程登录和其他安全网络服务。
? SSH通过TCP进行数据交互,它在TCP之上构建了一个安全的通道。另外SSH服务除了支持标准端口22外,还支持其他服务端口,以防止受到非法***。
注意:
SSH协议包括SSH1.0,SSH1.5,SSH2.0
SSH的功能
SSH支持的客户端功能
? SSH客户端功能允许用户与支持SSH Server的路由器、UNIX主机等建立SSH连接
SFTP
? SFTP(SSH File Transfer Protocol)是SSH FTP的简称,是一种安全的FTP。SFTP建立在SSH连接的基础之上,远程用户可以安全地登录设备,进行文件管理和文件传送等操作,为数据传输提供了更高的安全保障。同时,由于设备提供了SFTP客户端功能,可以从本设备安全登录到远程SSH服务器上,进行文件的安全传输。
STelnet
? STelnet是基于SSH的安全Telnet服务。与Telnet相比,SSH服务器通过对客户端进行认证及双向的数据加密,为网络终端访问提供了安全的服务。
SCP
? SCP(Secure Copy)是基于SSH的安全协议,对客户端进行认证和数据加密,以保证在传统的非安全网络环境下进行安全的文件传输。
? SCP使用SSH进行数据传输和用户认证,从而确保数据传输的可靠性和机密性。客户端可以发送(上传)文件到服务器,亦可从服务器请求(下载)文件或目录。缺省情况下,SCP运行于TCP协议下的22号端口。
SSH服务支持其他端口
? SSH协议的标准侦听端口号为22,***者不断访问标准端口,导致带宽的浪费和服务器性能的下降,致使其他正常用户无法访问,这是一种DoS(拒绝服务)***。
? 设定SSH服务端的侦听端口号为其他端口,***者不知道SSH侦听端口号的更改,可有效防止***者对SSH服务标准端口访问消耗带宽和系统资源。正常用户通过对非标准端口的SSH服务的访问,降低遭受DoS(拒绝服务)***可能性。
? 只有合法的用户采用SSH服务器设定的非标准侦听端口才能建立Socket连接,进行SSH协议的版本号协商、算法协商及会话密钥生成、认证、会话请求、会话阶段等过程。
安全的远程访问
SSH通过以下措施实现在不安全网络上提供安全的远程访问:
? 支持RSA(Revist-Shamir-Adleman Algorithm 非对称加密算法)/DSA(Digital-Signature Algorithm 数字签名算法)/ECC(Elliptic Curves Cryptography 椭圆曲线加密)公钥验证方式,根据非对称加密体系的加密原则,通过生成公钥和私钥,实现密钥的安全交换,最终实现安全的会话全过程。
? 支持证书验证方式,客户端通过证书签名来进行服务器端验证,有效防止中间人***。
? 支持数据加密标准DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard)。
? SSH客户端与服务器端通信时,对传输的数据进行加密,包括用户名及口令,有效防止对口令的窃听。
? 支持SM2椭圆曲线密码算法,SM2算法与RSA算法一样,同属于非对称密码算法体系,是基于ECC(Elliptic Curves Cryptography)算法的非对称算法。与RSA算法不同的是
? RSA算法是基于大数的因子分解算法,导致了RSA算法的密钥的长度也越来越长。而长密钥带来了运算速度较慢、密钥存储和管理不方便问题。ECC算法是基于离散对数的算法,很难破解,具有更高的安全性。与RSA算法相比,在相同安全性条件下,ECC算法可以大大减少密钥的长度。相较于RSA,椭圆曲线密码算法使用更短的密钥长度就能实现比较牢固的加密强度,同时由于密钥长度相对较短,加密速度也就相对较快。总而言之,ECC椭圆曲线密码算法具有以下优点:
- 相同的安全性,ECC算法的密钥长度比RSA算法更短。
- 计算量小,处理速度快。
- 存储空间小。
- 带宽要求低。
注意:
? 为了保证更好的安全性,建议不要使用DES/3DES/RSA小于2048位的RSA算法做为SSH用户的认证和数据加密方式,推荐使用更安全的ECC认证算法
支持ACL应用
? ACL是访问控制列表。通过ACL对SSH类型的用户界面限制呼入呼出权限,防止一些非法地址的用户进行TCP连接,避免其进入SSH协商,借此提高SSH服务器安全性。
SSH原理介绍
? SSH和telnet、ftp等协议主要的区别在于安全性。这就引出下一个问题:如何实现数据的安全呢?首先想到的实现方案肯定是对数据进行加密。加密的方式主要有两种:
? 对称加密(也称为秘钥加密)
? 非对称加密(也称公钥加密)
对称加密,指加密解密使用同一套秘钥
对称加密的加密强度高,很难破解。但是在实际应用过程中不得不面临一个棘手的问题:如何安全的保存密钥呢?尤其是考虑到数量庞大的Client端,很难保证密钥不被泄露。一旦一个Client端的密钥被窃据,那么整个系统的安全性也就不复存在。
非对称加密应运而生。非对称加密有两个密钥:“公钥”和“私钥”
两个密钥的特性:公钥加密后的密文,只能通过对应的私钥进行解密。而通过公钥推理出私钥的可能性微乎其微。
使用非对称加密方案的登录流程
? 远程Server收到Client端用户TopGun的登录请求,Server把自己的公钥发给用户。
? Client使用这个公钥,将密码进行加密 Client将加密的密码发送给Server端。
? 远程Server用自己的私钥,解密登录密码,然后验证其合法性。若验证结果,给Client相应的响应。
? 私钥是Server端独有,这就保证了Client的登录信息即使在网络传输过程中被窃据,也没有私钥进行解密,保证了数据的安全性,这充分利用了非对称加密的特性。
这样就一定安全了吗?
上述流程会有一个问题:Client端如何保证接受到的公钥就是目标Server端的?,如果一个***者中途拦截Client的登录请求,向其发送自己的公钥,Client端用***者的公钥进行数据加密。***者接收到加密信息后再用自己的私钥进行解密,不就窃取了Client的登录信息了吗?这就是所谓的中间人***
SSH中是如何解决这个问题的?基于口令的认证
从上面的描述可以看出,问题就在于如何对Server的公钥进行认证?在https中可以通过CA来进行公证,可是SSH的publish key和private key都是自己生成的,没法公证。只能通过Client端自己对公钥进行确认。通常在第一次登录的时候,系统会出现下面提示信息:
上面的信息说的是:无法确认主机的真实性,不过知道它的公钥指纹,是否继续连接?[~client001] stelnet 10.1.1.1 Please input the username:client001 Trying 10.1.1.1 ... Press CTRL+K to abort Connected to 10.1.1.1 ... The server is not authenticated. Continue to access it?(Y/N):y //服务器没有经过身份验证。继续访问它 Save the server‘s public key?(Y/N):y //保存服务器的公钥
之所以用指纹代替key,主要是key过于长(RSA算法生成的公钥有1024位),很难直接比较。所以,对公钥进行hash生成一个128位的指纹,这样就方便比较了。
如果输入yes后,会出现下面信息:
The server‘s public key will be saved with the name 172.16.1.1. Please wait... Feb 8 2020 11:34:46-08:00 R2 %%01SSH/4/SAVE_PUBLICKEY(l)[2]:When deciding whether to save the server‘s public key 172.16.1.1, the user chose Y. [R2] Enter password: //输入密码
基于公钥认证
在上面介绍的登录流程中可以发现,每次登录都需要输入密码,很麻烦。SSH提供了另外一种可以免去输入密码过程的登录方式:公钥登录。
? Client将自己的公钥存放在Server上
? Server端接收到Client的连接请求后,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey(R),然后将加密后信息发送给Client
? Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端
? Server端会也会对R和SessionKey利用同样摘要算法生成Digest2
? Server端会最后比较Digest1和Digest2是否相同,完成认证过程
SSH配置如下
通过STelnet登录其他设备配置举例(RSA认证方式和password认证方式)
? 通过STelnet登录其他设备配置的示例。在本示例中,通过在STelnet客户端和SSH服务器端生成本地密钥对,在SSH服务器端生成RSA公钥、并为用户绑定该RSA公钥,实现Stelnet客户端连接SSH服务器。
? 配置两个登录用户为client001和client002,分别使用password方式和RSA方式登录SSH服务器。
配置思路
- 在SSH服务器上配置用户client001和client002,分别使用不同的认证方式登录SSH服务器。
- 分别在STelnet客户端Client002和SSH服务器端生成本地密钥对,并为用户client002绑定SSH客户端的RSA公钥,实现客户端登录服务器端时,对客户端进行验证。
- SSH服务器端STelnet服务使能。
- 配置SSH用户client001和client002的服务方式为STelnet。
- 使能SSH客户端首次认证功能。
- 用户client001和client002分别以STelnet方式实现登录SSH服务器。
注意:
? SSH用户主要有Password、RSA、password-rsa、ECC、password-ecc或all这几种认证方式:
? 如果SSH用户的认证方式为password、password-rsa和password-ecc时,必须配置同名的local-user用户。
? 如果SSH用户的认证方式为RSA、password-rsa、ECC、password-ecc和all,服务器端应保存SSH客户端的RSA或ECC公钥
操作步骤
在服务器端生成本地密钥对<HUAWEI> system-view [~HUAWEI] sysname SSH Server [*HUAWEI] commit [~SSH Server] rsa local-key-pair create //创建密钥对 The key name will be: client002_Host The range of public key size is (2048 ~ 2048). NOTE: Key pair generation will take a short while. [*SSH Server] commit
在服务器端创建SSH用户
配置VTY用户界面。[*SSH Server] user-interface vty 0 4 [*SSH Server-ui-vty0-4] authentication-mode aaa [*SSH Server-ui-vty0-4] protocol inbound ssh [*SSH Server-ui-vty0-4] user privilege level 3 [*SSH Server-ui-vty0-4] commit [~SSH Server-ui-vty0-4] quit
创建SSH用户Client001。
新建用户名为Client001的SSH用户,且认证方式为password。[~SSH Server] ssh user client001 [*SSH Server] ssh user client001 authentication-type password [*SSH Server] commit
为SSH用户Client001配置密码为Hello-huawei123。
[~SSH Server] aaa [*SSH Server-aaa] local-user client001 password cipher Hello-huawei123 [*SSH Server-aaa] local-user client001 service-type ssh [*SSH Server-aaa] commit [~SSH Server-aaa] quit
创建SSH用户Client002。
新建用户名为Client002的SSH用户,且认证方式为RSA。[~SSH Server] ssh user client002 [*SSH Server] ssh user client002 authentication-type rsa [*SSH Server] ssh authorization-type default root [*SSH Server] commit
配置服务器端RSA公钥
客户端Client002生成客户端的本地密钥对<HUAWEI> system-view [~HUAWEI] sysname client002 [*HUAWEI] commit [~client002] rsa local-key-pair create The key name will be: client002_Host The range of public key size is (2048 ~ 2048). NOTE: Key pair generation will take a short while. [*client002] commit
查看客户端上生成RSA公钥。
[~client002] display rsa local-key-pair public ======================Host Key========================== Time of Key pair created : 13:22:1 2010/10/25 Key Name : client002_Host Key Type : RSA Encryption Key ======================================================== Key Code: 308188 028180 B21315DD 859AD7E4 A6D0D9B8 121F23F0 006BB1BB A443130F 7CDB95D8 4A4AE2F3 D94A73D7 36FDFD5F 411B8B73 3CDD494A 236F35AB 9BBFE19A 7336150B 40A35DE6 2C6A82D7 5C5F2C36 67FBC275 2DF7E4C5 1987178B 8C364D57 DD0AA24A A0C2F87F 474C7931 A9F7E8FE E0D5A1B5 092F7112 660BD153 7FB7D5B2 171896FB 1FFC38CD 0203 010001 Host Public Key for PEM format Code: ---- BEGIN SSH2 PUBLIC KEY ---- AAAAB3NzaC1yc2EAAAADAQABAAAAgQCyExXdhZrX5KbQ2bgSHyPwAGuxu6RDEw98 25XYSkri89lKc9c2/f1fQRuLczzdSUojbzWrm7/hmnM2FQtAo13mLGqC11xfLDZn +8J1LffkxRmHF4uMNk1X3QqiSqDC+H9HTHkxqffo/uDVobUJL3ESZgvRU3+31bIX GJb7H/w4zQ== ---- END SSH2 PUBLIC KEY ---- Public key code for pasting into OpenSSH authorized_keys file: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCyExXdhZrX5KbQ2bgSHyPwAGuxu6RDEw9825XYSkri 89lKc9c2/f1fQRuLczzdSUojbzWrm7/hmnM2FQtAo13mLGqC11xfLDZn+8J1LffkxRmHF4uMNk1X3Qqi SqDC+H9HTHkxqffo/uDVobUJL3ESZgvRU3+31bIXGJb7H/w4zQ== rsa-key Host Public key for SSH1 format code: 1024 65537 125048203250833642388841080101906750228075076456213955541037945628567 57310398880086451511608221218821171562865637463140847157102422109476944363593619 24637760514734544191988044752471924402237145321162849626052751701862381759745461 33321165741031171160914926309797395278974490949461701171569544048167828558985421 ======================Server Key======================== Time of Key pair created : 13:22:1 2010/10/25 Key Name : client002_Server Key Type : RSA Encryption Key ======================================================== Key Code: 3067 0260 BDCEC48F 1EDA55AF 80C71881 CF22D6A4 02682F2F E50035C8 E1539F1F 9EB3FCAC 2BFEF147 EEF59F23 7270C3DD 22135C16 AAC236DE EFBF9865 E50D8D26 B7651BCB 6D87BC2B 96559C38 04FC034B 54CFE7B3 2B1BBA18 A96FFC29 EF70069D DD1EE053 0203 010001
将客户端上产生的RSA公钥传送到服务器端。
[~SSH Server] rsa peer-public-key rsakey001 Enter "RSA public key" view, return system view with "peer-public-key end". [*SSH Server-rsa-public-key] public-key-code begin Enter "RSA key code" view, return last view with "public-key-code end". [*SSH Server-rsa-public-key-rsa-key-code] 308188 [*SSH Server-rsa-public-key-rsa-key-code] 028180 [*SSH Server-rsa-public-key-rsa-key-code] B21315DD 859AD7E4 A6D0D9B8 121F23F0 006BB1BB [*SSH Server-rsa-public-key-rsa-key-code] A443130F 7CDB95D8 4A4AE2F3 D94A73D7 36FDFD5F [*SSH Server-rsa-public-key-rsa-key-code] 411B8B73 3CDD494A 236F35AB 9BBFE19A 7336150B [*SSH Server-rsa-public-key-rsa-key-code] 40A35DE6 2C6A82D7 5C5F2C36 67FBC275 2DF7E4C5 [*SSH Server-rsa-public-key-rsa-key-code] 1987178B 8C364D57 DD0AA24A A0C2F87F 474C7931 [*SSH Server-rsa-public-key-rsa-key-code] A9F7E8FE E0D5A1B5 092F7112 660BD153 7FB7D5B2 [*SSH Server-rsa-public-key-rsa-key-code] 171896FB 1FFC38CD [*SSH Server-rsa-public-key-rsa-key-code] 0203 [*SSH Server-rsa-public-key-rsa-key-code] 010001 [*SSH Server-rsa-public-key-rsa-key-code] public-key-code end [*SSH Server-rsa-public-key] peer-public-key end [*SSH Server] commit
为SSH用户Client002绑定SSH客户端的RSA公钥。
[~SSH Server] ssh user client002 assign rsa-key RsaKey001 [*SSH Server] commit
SSH服务器端STelnet服务使能
使能STelnet服务功能。
[~SSH Server] stelnet server enable [*SSH Server] commit
STelnet客户端连接SSH服务器
第一次登录,需要使能SSH客户端首次认证功能。
使能客户端Client001首次认证功能。
<HUAWEI> system-view [~HUAWEI] sysname client001 [*HUAWEI] commit [~client001] ssh client first-time enable [*client001] commit
注意:
? 使能SSH客户端首次认证功能后,在STelnet客户端第一次登录SSH服务器时,不对SSH服务器的RSA、DSA或ECC公钥进行有效性检查。登录后,客户端将自动保存RSA、DSA或ECC公钥,为下次登录时认证。如果没有使能SSH客户端首次登录功能,当STelnet客户端第一次登录SSH服务器时,由于对SSH服务器的RSA、DSA或ECC公钥有效性检查失败,会导致登录服务器失败
使能客户端Client002首次认证功能
[~client002] ssh client first-time enable [*client002] commit STelnet客户端Client001用password认证方式连接SSH服务器,输入配置的用户名和密码。 [~client001] stelnet 10.1.1.1 Please input the username:client001 Trying 10.1.1.1 ... Press CTRL+K to abort Connected to 10.1.1.1 ... The server is not authenticated. Continue to access it?(Y/N):y Save the server‘s public key?(Y/N):y The server‘s public key will be saved with the name 10.1.1.1. Please wait... Enter password:
输入密码Hello-huawei123,显示登录成功信息如下:
Info: The max number of VTY users is 20, and the number of current VTY users on line is 6. The current login time is 2011-01-06 11:42:42. <SSH Server>
STelnet客户端Clent002用RSA认证方式连接SSH服务器。
[~client002] stelnet 10.1.1.1 Please input the username: client002 Trying 10.1.1.1 ... Press CTRL+K to abort Connected to 10.1.1.1 ... The server is not authenticated. Continue to access it?(Y/N):y Save the server‘s public key?(Y/N):y The server‘s public key will be saved with the name 10.1.1.1. Please wait... Info: The max number of VTY users is 20, and the number of current VTY users on line is 6. The current login time is 2011-01-06 11:42:42. <SSH Server>
验证配置结果
配置完成后,在SSH服务器端执行display ssh server status命令、display ssh server session,可以查看到STelnet服务已经使能,并且STelnet客户端已经成功连接到SSH服务器。
查看SSH状态信息
[~SSH Server] display ssh server status SSH Version : 2.0 SSH authentication timeout (Seconds) : 60 SSH authentication retries (Times) : 3 SSH server key generating interval (Hours) : 0 SSH version 1.x compatibility : Enable SSH server keepalive : Disable SFTP IPv4 server : Disable SFTP IPv6 server : Disable STELNET IPv4 server : Enable STELNET IPv6 server : Enable SNETCONF IPv4 server : Enable SNETCONF IPv6 server : Enable SNETCONF IPv4 server port(830) : Disable SNETCONF IPv6 server port(830) : Disable SCP IPv4 server : Enable SCP IPv6 server : Enable SSH IPv4 server port : 22 SSH IPv6 server port : 22 SSH server source address : 10.1.1.1 SSH ipv6 server source address : 0::0 SSH ipv6 server source ***Name : ACL name : ACL number : ACL6 name : ACL6 number : SSH server ip-block : Enable
查看SSH服务器的连接信息。
[~SSH Server] display ssh server session -------------------------------------------------------------------------------- Session : 1 Conn : SFTP 0 Version : 2.0 State : Started Username : user1 Retry : 1 CTOS Cipher : aes256-ctr STOC Cipher : aes256-ctr CTOS Hmac : hmac-sha2-256 STOC Hmac : hmac-sha2-256 CTOS Compress : none STOC Compress : none Kex : diffie-hellman-group14-sha1 Public Key : ECC Service Type : stelnet Authentication Type : password Connection Port Number : 22 Idle Time : 00:00:49 Total Packet Number : 90 Packet Number after Rekey : 90 Total Data(MB) : 0 Data after Rekey(MB) : 0 Time after Session Established(Minute) : 0 Time after Rekey(Minute) : 0 --------------------------------------------------------------------------------
查看SSH用户信息。
[~SSH Server] display ssh user-information ---------------------------------------------------- Username : client001 Authentication-type : password User-public-key-name : - User-public-key-type : - Sftp-directory : - Service-type : stelnet Username : client002 Authentication-type : rsa User-public-key-name : rsakey001 User-public-key-type : - Sftp-directory : - Service-type : stelnet ----------------------------------------------------