serverhostkey缓存阶段
需要:
- 服务端host密钥对
流程:
- 服务端发送public server host key 公钥,和其他信息
- 客户端不提示警告,说明之前访问过服务,已经获取到了服务的公钥和服务器相关信息并缓存到了
/.ssh/known_hosts,客户端只需要将信息与/.ssh/known_hosts中的公钥等信息进行比对即可 - 客户端提示警告,就将新的host key缓存到~/.ssh/known_hosts,提示警告情况如下:- 如果是未访问的服务,说明第一次建立通信- 如果是访问过的服务可能是中间人攻击
会话建立阶段
需要:
- 客户端临时密钥对
- 服务端临时密钥对
流程:
- 客户端发送ssh会话请求(协商加密算法等)
- 服务端发送public server key给客户端(响应加密算法)
- 客户端向服务端发送public client key给服务端,此时密钥情况:- 客户端:public client key、private client key、public server key- 服务端:public server key、private server key、public client key- 客户端和服务端具备了生成同一个key(也就是对称加密密钥)的能力
- 生成对称加密密钥session key(也叫共享安全密钥)进行加密通信
客户端主机密钥验证阶段
需要:
- 服务端host密钥对
- 客户端缓存public server host key公钥
- 主机密钥验证算法,可由参数 HostKeyAlgorithms 指定,用于客户端验证服务器信息的算法
流程:
- 服务端生成exchange hash
- 服务端用host 私钥签名对生成exchange hash进行签名,签名算法使用HostKeyAlgorithms 指定的算法
- 客户端通过HostKeyAlgorithms 指定的算法,使用host公钥进行认证,host公钥从
~/.ssh/known_hosts
文件中获取
注:
- 此过程客户端校验服务端信息
身份验证阶段
密码登录
需要:
- 服务端密钥对
流程:
- 客户端发送ssh登录请求
- 服务端发送公钥
- 客户端接受公钥并加密密码,发送
- 服务端接受到密文,用私钥解密获得密码,进行验证
密钥登陆
需要:
- 客户端有登录密钥对
- 服务端有登录密钥对的公钥
- 暂且称登录密钥对为login key与之前的临时密钥对和session key(共享安全密钥)做区分
- 参数PublickeyAcceptedKeyTypes,客户端发送公钥的类型,此参数控制了 服务器 接受的公钥认证算法类型,决定了服务器公钥认证时使用的算法。
流程:
- 客户端发送ssh登录请求
- 服务端生成随机数A并用login key公钥加密成密文A(加密算法受PublickeyAcceptedKeyTypes影响)
- 客户端私钥解密得到随机数A,生成摘要digest = sessionkey + 随机数Ahash(使用md5加密)
- 服务端以相同的方式生成摘要digest = sessionkey + 随机数Ahash(使用md5加密)与客户端发过来的摘要做对比
ssh安全性理论研究
中间人攻击以及ssh防御措施
条件:
- hostkey缓存阶段,服务端在没有发送public host key到客户端之前均可攻击,一旦客户端接收到了public host key,攻击条件丧失,原因如下:- 在接下来的完整性会话建立阶段,中间人没有private host key,因此无法对生成的exchange hash进行签名
ssh防御措施:
- hostkey缓存阶段的提示
暴力破解密钥登陆
条件:
- 获取某一用户的login公钥
爆破:
- 网上下载密钥对,进行login公钥对比,查看哪个密钥对匹配
- 读取密钥对的私钥,进行登录
本文转载自: https://blog.csdn.net/anddddoooo/article/details/141752781
版权归原作者 anddddoooo 所有, 如有侵权,请联系我们删除。
版权归原作者 anddddoooo 所有, 如有侵权,请联系我们删除。