SSH 基本框架
- 传输层协议
- 用户认证协议
- 连接协议
同时SSH协议框架中还为许多高层的网络安全应用协议提供扩展的支持。它们之间的层次关系可以用如下图来表示: - 传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性 等的支持;
- 用户认证协议(The User Authentication Protocol) 则为服务器提供客户端的身份鉴别;
- 连接协议(The Connection Protocol) 将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用; 各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。
SSH安全验证级别
- 第一种级别(基于口令的安全验证),只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
- 第二种级别(基于密匙的安全验证)需要依靠密匙
- 先为自己创建一对密匙,并把公匙放在需要访问的服务器上;
- 客户端软件会向服务器发出请求,请求用你的密匙进行安全验证;
- 服务器收到请求之后,在该服务器目录下寻找公匙,然后把它和你发送过来的公匙进行比较。若两密匙一致,服务器就用公匙加密“质询”(challenge)并把它发送给客户端软件;
- 客户端软件收到“质询”之后就可以用 私密 解密再把它发送给服务器。
用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令,它不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。
SSH 的工作过程
在整个通讯过程中,为实现 SSH的安全连接,服务器端与客户端要经历如下五个阶段:
- 版本号协商阶段,SSH目前包括 SSH1和SSH2两个版本, 双方通过版本协商确定使用的版本
- 密钥和算法协商阶段,SSH支持多种加密算法, 双方根据本端和对端支持的算法,协商出最终使用的算法
- 认证阶段,SSH客户端向服务器端发起认证请求, 服务器端对客户端进行认证
- 会话请求阶段, 认证通过后,客户端向服务器端发送会话请求
- 交互会话阶段 ,会话请求通过后,服务器端和客户端进行信息的交互
1 . 版本号协商阶段
- 服务器打开端口 22,等待客户端连接。
- 客户端向服务器端发起 TCP初始连接请求,TCP连接建立后,服务器向客户端发送第一个报文,包括版本标志字符串,格式为“SSH-<主协议版本号>.<次协议版本号>-<软件版本号>”,协议版本号由主版本号和次版本号组成,软件版本号主要是为调试使用。
- 客户端收到报文后,解析该数据包,如果服务器端的协议版本号比自己的低,且客户端能支持服务器端的低版本,就使用服务器端的低版本协议号,否则使用自己的协议版本号。
- 客户端回应服务器一个报文,包含了客户端决定使用的协议版本号。服务器比较客户端发来的版本号,决定是否能同客户端一起工作。
- 如果协商成功,则进入密钥和算法协商阶段,否则服务器端断开 TCP连接。
Note: 版本号协商阶段报文都是采用明文方式传输的。
2. 密钥和算法协商阶段
- 服务器端和客户端分别发送算法协商报文给对端,报文中包含自己支持的公钥算法列表、加密算法列表、MAC(Message Authentication Code,消息验证码)算法列表、压缩算法列表等;
- 服务器端和客户端根据对端和本端支持的算法列表得出最终使用的算法。
- 服务器端和客户端利用 DH交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成会话密钥和会话 ID。
通过以上步骤,服务器端和客户端就取得了相同的会话密钥和会话ID。- 对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全
- 在认证阶段,两端会使用会话 ID用于认证过程。
Note: 在协商阶段之前,服务器端已经生成 RSA或 DSA密钥对,他们主要用于参与会话密钥的生成。
3. 认证阶段
- 客户端向服务器端发送认证请求,认证请求中包含用户名、认证方法、与该认证方法相关的内容(如:password认证时,内容为密码)。
- 服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。
- 客户端从认证方法列表中选取一种认证方法再次进行认证。
- 该过程反复进行, 直到认证成功或者认证次数达到上限, 服务器关闭连接为止。
SSH提供两种认证方式:
- password认证:客户端向服务器发出 password认证请求,将用户名和密码加密后发送给服务器;服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败的消息。
- publickey 认证:采用数字签名的方法来认证客户端。目前,设备上可以利用RSA和 DSA两种公共密钥算法实现数字签名。客户端发送包含用户名、公共密钥和公共密钥算法的 publickey 认证请求给服务器端。服务器对公钥进行合法性检查,如果不合法,则直接发送失败消息;否则,服务器利用数字签名对客户端进行认证,并返回认证成功或失败的消息
SSH2.0还提供了 password-publickey 认证和 any 认证:
- password-publickey 认证:指定该用户的认证方式为 password 和 publickey认证同时满足。客户端版本为 SSH1的用户只要通过其中一种认证即可登录;客户端版本为 SSH2的用户必须两种认证都通过才能登录。
- any认证:指定该用户的认证方式可以是 password,也可以是 publickey。
4.会话请求阶段
- 服务器等待客户端的请求;
- 认证通过后,客户端向服务器发送会话请求;
- 服务器处理客户端的请求。请求被成功处理后, 服务器会向客户端回应 SSH_SMSG_SUCCESS包,SSH进入交互会话阶段;否则回应 SSH_SMSG_FAILURE包,表示服务器处理请求失败或者不能识别请求。
5.交互会话阶段
在这个模式下,数据被双向传送:
- 客户端将要执行的命令加密后传给服务器;
- 服务器接收到报文,解密后执行该命令,将执行的结果加密发还给客户端;
- 客户端将接收到的结果解密后显示到终端上.
6.SSH Q & A
Q1: SSH的版本和区别。
SSH2避免了RSA的专利问题,并修补了CRC的缺陷。SSH2用数字签名算法(DSA)和Diffie-Hellman(DH)算法代替RSA来完成对称密钥的交换,用HMAC来代替CRC。同时SSH2增加了AES和Twofish等对称加密算法。
A1: SSH(Secure SHell)到目前为止有两个不兼容的版本——SSH1和SSH2。SSH1又分为1.3和1.5两个版本。SSH1采用DES、3DES、Blowfish和RC4等对称加密算法保护数据安全传输,而对称加密算法的密钥是通过非对称加密算法(RSA)来完成交换的。SSH1使用循环冗余校验码(CRC)来保证数据的完整性,但是后来发现这种方法有缺陷。
更多内容请参考The SSHv1 Protocol
& The SSHv2 Protocol
Q2: 什么是HMAC?
A2: HMAC(Hash Message Authentication Code) ,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
Q3: 什么是X11 forwarding?
A3: sh的X11 forwarding特性可以使X client和X server安全地通讯。使用X11 forwarding后,从X client到X Server方向的数据先被送至ssh server,ssh server利用和ssh client的安全通道转发给ssh client,再由ssh client转发给X server,从X server到X client的数据流同理。这里ssh server和ssh client充当了X client和X server间数据的转发器,由于ssh server和X client、ssh client和X server一般在同一台机器上,它们之间是一种安全的进程间通讯,而ssh server和ssh client间的通讯也是安全的,所以X client和X server间的通讯就是安全的。
Q4: 什么是TTY?
A4: 终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是 Teletype的缩写。Teletype是最早出现的一种终端设备,很象电传打字机,是由Teletype公司生产的。设备名放在特殊文件目录/dev/下。
Q5: 简单描述下SSH运行的过程?
A5:简要过程如下:
- Client端向Server端发起SSH连接请求。
- Server端向Client端发起版本协商。
- 协商结束后Server端发送Host Key公钥 Server Key公钥,随机数等信息。到这里所有通信是不加密的。
- Client端返回确认信息,同时附带用公钥加密过的一个随机数,用于双方计算Session Key。
- 进入认证阶段。从此以后所有通信均加密。
- 认证成功后,进入交互阶段。
SSH1加密技术
˙ Client向SSH Server的22 port做出连线请求。 ˙ Server传送public key给Client:
关于这个地方,您需先了解什么是host key pair及server key pair。
host key pair是指存在于SSH Server上的一对公钥(host public key)及私钥(host private key)。
server key pair是指在每次SSH服务启动时,所随机产生的一对公钥(server public key)及私钥(server private key),且这个server key预设每小时会更换一次。
而SSH Server所回应给Client的public key,就是指host public key及server public key。˙ Client端比对host public key:
Client端对SSH Server所传送过来的host public key进行比对,如果与~/.ssh/known_hosts档案内容相符,则继续进行下一步,否则会询问您是否要接受这个key,此时输入yes就对了。
当使用者第一次与Server做连线时,由于之前并没有取得这个key,因此会询问您是否要接受Server所传来的host public key,那万一先前已做过连线,现在还是看到这个讯息,这就表示Server上的host public key与Client的known_hosts比对不符合的结果,比如像Server的SSH套件重新安装过后就会有这种情形发生。那万一您遇到的状况是在key比对不符后,直接拒绝您连线,这该怎么办呢?很简单,只要把Client的~/.ssh/目录下的known_hosts档删除后,再与Server做连线,以重新取得host public key就行了。 ˙ Client随机产生一个256 bit的乱数(session key):
当第三步骤通过后,Client随即产生这个乱数,并使用刚刚从Server那里所得到的那两把key来一起做加密,完成后就传回给Server。˙ Server使用private key来解密。 ˙ 尔后就透过这session key来作对称式的加密使用。 ˙ Client端开始进行认证,通过后,SSH连线正式建立起来。 SSH2加密技术
˙ Client向SSH Server的22 port做出连线请求。 ˙ Server传送host public key给Client:
在SSH2里,sshd daemon启动时,并不会产生server key,所以只会传送host public key给Client。˙ Client端比对host public key:
与SSH1的做法相同,不再赘述。˙ 使用Diffie-Hellman的演算法来产生session key,以作为连线加密使用。 ˙ Client端开始进行认证,通过后,SSH连线正式建立起来。