目录
基本概念
SSH协议的组成
SSH工作原理
SSH版本协商阶段(确定V1版本或V2版本)
算法协商阶段
密钥交换阶段
用户认证阶段
会话交互阶段
基本概念
SSH(Secure Shell)安全外壳协议,是一种用于在不安全网络上进行安全远程登录和实现其他安全网络服务的协议(建立在应用层基础上的安全协议,TCP端口号22)
SSH协议的组成
SSH协议主要由三个组件组成
SSH传输层协议-主要进行SSH版本协商、算法协商、密钥交换
SSH传输层和TCP的传输层是不同的概念,SSH传输层是一个安全传输协议
SSH传输层通常建立在TCP/IP连接上,但是也可以在任何可靠的数据流上建立
SSH用户认证协议-主要用于用户认证
为服务器提供客户端的用户鉴别,使得服务器信任客户端
运行在SSH传输层协议之上
SSH连接协议-主要用于建立SSH会话连接
运行在SSH运输层协议和用户认证协议之上
SSH会话连接可以复用成若干个逻辑通道(包含TCP/IP转发通道、X11通道、交互式登录会话通道、远程执行命令通道) 用的比较多的是交互式登录会话
TCP/IP转发通道
Telent、SMTP、IMAP等其它基于TCP/IP的不安全协议就可以通过此通道变得安全
X11通道
11是X协议的版本,Linux底层协议就是X协议
X11主要用于登录Linux图形化界面时使用的,保证通信安全
交互式登录会话通道
程序进行远程执行时,保证其安全(程序可以是Shell、应用程序、系统命令或一些内置的子系统) 例如通过Python进行远程配置时就通过此通道保证安全
在Python中通过Paramiko库的SSHClient类中的incoker_shell()方法可以开启交互式登录会话通道
远程执行命令通道
Linux执行命令(查看目录等)时保障其安全
在Python中通过Paramiko库的SSHClient类中的exec_command()方法可以开启远程执行命令通道
SSH工作原理
为实现SSH的安全连接,服务器和客户端需要经历以下五个阶段
其中前三个阶段明文传输,后两个阶段密文传输
(以下介绍的SSH传输层协议是建立在TCP/IP连接上的)
SSH版本协商阶段(确定V1版本或V2版本)
会话交互阶段报文交互
SSH协商版本报文携带SSH版本号、次协议号、软件协议号
其中SSH版本号是必须携带的,此协议号和软件协议号可选
服务器如何协商SSH版本
服务器收到报文后,解析SSH版本号
如果客户端和服务器支持的版本号一致,则协商成功
如果客户端的SSH版本号比自己的低,且服务器能支持客户端的低版本,就使用客户端的协议号,协商成功;如果服务器不支持客户端的低版本,协商失败
如果客户端的SSH版本号比自己的高,则协商失败
算法协商阶段
确定密钥交换算法、公钥算法、对称加密算法、消息认证算法
算法类型
算法协商阶段的报文交互
服务器收到Client Key Exchange Init之后,根据客户端的算法查找自身的算法列表进行匹配
每种算法(密钥交换算法、公钥算法、加密算法、认证算法)都匹配成功才会进入下一阶段
服务器如何协商算法
服务器从客户端的算法列表取出第一个算法,在自己的算法列表中查找,如果协商成功,继续协商下一种算法;否则继续从客户端的算法列表中取出下一个算法进行协商
当服务器和客户端之间有多个相同的算法,则会根据算法的优先级选择优先级最高的算法
(例如:两边的认证算法都支持MD5和SHA,这个时候就会协商出一个优先级高的认证算法来使用)
密钥交换阶段
根据上阶段协商出来的密钥交换算法,动态产生会话密钥用于后续会话加密
密钥交换阶段报文交互
一般密钥交换算法使用DH算法,密钥交换过程类似IPsec的密钥交换过程
在密钥交换过程中私钥Xc,Xs始终是保密不传播的,由于DH算法的复杂其他用户即使获取了p,g,Yc,Ys也无法推断出私钥Xc,Xs,从而保证了会话密钥的安全性。
注意
密钥交换阶段产生的公私钥仅用于产生会话密钥,与后续用户认证无关
密钥交换阶段产生的公私钥在生成Session Key之后就会清除掉
密钥交换阶段完成后,后续所有报文交互均会被会话密钥Session Key加密
用户认证阶段
口令认证或公钥认证两种认证方式 报文被加密
口令认证方式
客户端通过用户名和密码登录到服务器,完成用户认证
每次认证都要输入用户名和密码
公钥认证方式
服务器通过客户端的公钥解密客户端发来的数字签名,完成用户认证(信任客户端)
会话交互阶段
进行报文交互 报文加密