SSH协议
建连过程
-
第一阶段:协议版本协商
- 如果能一起工作,进入下一阶段,如不能,服务器断开 TCP 连接,会话结束
- 明文传输
-
第二阶段:算法协商
- 公钥算法列表、加密算法列表、消息验证码算法列表、压缩算法列表等
- 通过DH秘钥交换算法生成并传递会话秘钥,以后的通信数据都通过该秘钥使用对称加密算法加密(例如AES算法)
- DH算法虽然也是非对称算法,但是专门用来交换秘钥,不用于加密
- 双方利用自己的私钥,对方公钥和原始共享素数来计算共享密钥。虽然这个过程各自独立,都使用自己私钥和对方公钥,所以能生成相同共享密钥
- 此后的通信都已经被加密了
-
第三阶段:认证阶段
- 服务器会发送公钥给客户端
- 客户端会和保存在
~/.ssh/known_hosts
中的公钥对比,以验证服务端的合法性
- 客户端会和保存在
- 密码登陆
- 认证协议中密码以明文的形式存在,其安全性依赖于传输层通过协商的秘钥进行加密来实现
- 公钥认证登陆
- 首先要手动将客户端的公钥复制到服务端的
~/.ssh/authorized_keys
文件中 - 原理
- 服务端用客户端的公钥加密一个 256 位的随机字符串
- 客户端接收后使用自己的私钥解密,然后将这个字符串和会话 id 合并在一起,对结果应用 MD5 散列函数并把散列值返回给服务器
- 服务器进行相同的 MD5 散列函数处理,如果客户端和该值可以匹配,那么认证成功,允许登陆
- 首先要手动将客户端的公钥复制到服务端的
- 服务器会发送公钥给客户端
重放攻击
- 如果有人窃听了第三阶段的数据进行重放攻击,会造成非法登录吗?
- 每次建连前都会交换会话秘钥用于加密,而每次会话秘钥都不一样,所以重放攻击无效
- 如果有人对于一次操作指令进行重放攻击,会造成非法操作吗?
- 一般会通过时间戳+随机nonce来防御
中间人攻击
- SSH没有采取第三方CA来认证身份,因此理论上存在中间人攻击的风险
- 如果攻击者插在用户与远程主机之间(比如在公共的 wifi 区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么 SSH 的安全机制就荡然无存了
- 虽然 SSH 从原理上不能抵御中间人攻击,但 SSH 首次连接会下载服务端的公钥,并提示服务器的公钥指纹,用户可以核对此指纹与服务器公钥生成的指纹是否一致
- 下次访问时客户端将会核对服务端发来的公钥和本地保存的是否相同,不同就发出中间人攻击的警告拒绝连接
- 结论:如果首次连接没有中间人,之后的连接就无需担心中间人