SSH是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。ssh 协议交互过程如下:
SSH以非对称加密方式实现身份验证,主要有以下两种:
基于密码的安全验证
基于密钥的安全验证
下面就对这两种方法展开介绍:
是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录。具体过程如下:
1、客户端发送登录请求,ssh user@hostname
2、服务器接受请求,将服务器的公钥 ser_rsa.pub 发送给客户端
3、客户端输入密码,密码使用 ser_rsa.pub 加密后发送给服务器(敏感信息安全传输)
4、服务器接受加密后的密码,使用服务器私钥 ser_rsa 解密,匹配认证密码是否合法(如果合法!登录成功)
至此,身份认证通过,然后是交换会话密钥(对称加密)
5、客户端生成会话数据加密 sess_key,使用 ser_rsa.pub 加密后传输给服务器(会话密钥)
6、服务器获取到后使用 ser_rsa 解密,得到sess_key
使用会话密钥对之后传递的数据进行加密。注:使用对称加密效率高。
7、客户端和服务器通过 sess_key 进行会话数据安全传输
但是,这种认证方式无法避免“中间人”攻击,可能会有别的服务器在冒充真正的服务器。
如图所示,如果有人截获了登录请求,然后冒充服务器,将伪造的公钥发给客户端,那么客户端很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。可以设想,如果攻击者插在客户端与服务器之间,用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。
所以一般在首次登录服务器时,系统会出现下面的提示:
$ ssh user@host
The authenticity of host 'host (192.168.100.1)' can't be established.
RSA key fingerprint is 2d:37:16:58:4d:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
确认之后,就可以登录(其实在实际生活中并没有什么用啊?谁会去手动比对fingerprint~)
当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台服务器,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
客户端生成一对公钥和私钥,并将自己的公钥储存在服务器上。客户端请求登录的时候,服务器会向客户端发送一段随机字符串,客户端用自己的私钥加密后,再发回来。服务器用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录,不再要求密码。从而避免了“中间人”攻击。具体过程如下:
基于密钥的安全验证简单的描述如图中所示。但在实际传输过程中所有的数据都是需要加密以保证数据传输安全,即同样会生成会话密钥,使用会话密钥对传输数据进行加密的过程。详细过程如下:
Ac:客户端公钥
Bc:客户端私钥
As:服务器公钥
Bs:服务器私钥
***在认证之前,客户端需要将公钥 Ac 放到服务器上。***
1、客户端发送登录请求,ssh user@hostname
2、服务器接受请求,将服务器的公钥 As 发送给客户端
服务器生成会话ID(session id),设为 p,发送给客户端。
3、客户端生成会话密钥(session key),设为 q,并计算 r = p xor q。
客户端将 r 用 As 进行加密,结果发送给服务器。
4、服务器用 Bs 进行解密,获得 r。
服务器进行 r xor p 的运算,获得 q。
至此,服务器和客户端都知道了会话密钥q,以后的传输数据都将被 q 加密。
5、服务器生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端
6、客户端使用 Bc 解密 S(x) 得到 x
客户端计算 q + x 的 md5 值 n(q+x),q为上一步得到的会话密钥
客户端将 n(q+x) 发送给服务器
7、服务器计算 q + x 的 md5 值 m(q+x)
服务器比较 m(q+x) 和 n(q+x),两者相同则认证成功。
至此,服务器和客户端认证通过,可以使用会话密钥进行加密和解密传输
8、客户端和服务器通过 q 进行会话数据安全传输
风险点:在将客户端公钥Ac放置到服务器这一步,核实Ac的来源至关重要,因为SSH只验证客户端是否拥有与公钥相匹配的私钥,只要接受公钥且私钥匹配服务器就会授予许可。这样的话,一旦接受了恶意攻击者的公钥,那么系统也会把攻击者视为合法用户。
ps:文中提到了非对称加密(密钥对)和对称加密(会话密钥),需要自行查询资料进行了解。
参考链接:
https://my.oschina.net/sallency/blog/1547785
https://blog.csdn.net/marywang56/article/details/78784608