SSH学习(二)- SSH-TRANS相关

简介: 重点学习SSH Transport Layer相关的密码学内容。

背景

在《SSH学习(一)- 概念了解》一文中,我们对SSH相关的概念做了学习,接下来在本文中,将针对[SSH-TRANS]涉及到的密码学相关内容进行学习。
基于RFC 4253的定义,The Transport Layer Protocol [SSH-TRANS]主要负责服务端认证,以及消息的机密性和完整性。结合日常工作,涉及到的关键点(mac算法忽略)如下:

  1. kex_algorithms,协商通过什么样的交换算法来实现加密密钥的交换。比如说,ecdh-sha2-*,diffie-hellman-group-exchange-sha256等等,即DHE和ECDHE交换中使用的不同曲线等参数;
  2. server_host_key_algorithms,协商什么样的Server Host Key是可以被客户端接受的。如ssh-ed25519,ssh-rsa等等;
  3. encryption_algorithms:采用什么用的加密算法来保证消息的机密性。如AEAD_AES_256_GCM,aes192-ctr,CHACHA20-POLY1305等;

    理论知识

    kex_algorithms

    密钥交换,Key Exchange,使得客户端和服务端在一个不安全的网络中,协商出会话期间对数据进行加密的会话密钥,从而建立一个安全的、加密的通信信道。
    目前SSH支持的kex algorithm可以参考IANA SSH Parameter页面:IANA SSH Parameter,截图如下:
    image.png
    而OpenSSH目前支持的算法列表截图如下,完整信息可以在OpenSSH的manual Page中找到:
    image.png
    curve25519-sha256为例,代表密钥交换采用ECDHE方式,使用了curve25519曲线。椭圆曲线的介绍可以参考SafeCurves

    server_host_key_algorithms

    为了避免中间人攻击,客户端和服务端进行密钥交换的最后一步,需要使用服务端的Host Key对密钥交换过程中对的临时公钥进行签名。所以server host key algorithm就是定义了一系列服务端支持密钥签名算法,比如说ssh-ed25519,OpenSSH支持的算法列表见下图:
    image.png

    encryption_algorithms

    对称加密算法,在协商过程中,客户端和服务端的通信信道的不同方式应该被视为独立的数据流,即客户端发送给服务端的数据加密算法和服务端发送客户端的数据加密算法可以支持不同的对称加密算法(客户端 -> 服务端:aes128-gcm,服务端 -> 客户端:chacha20-poly1305@openssh.com)。但是在实际实现中,推荐客户端和服务端的通信均使用一个加密算法,以及采用不同的密钥派生方法。
    image.png
    可以在RFC文档中看到,当客户端和服务端协商出共享的内容k后,两个方向的加密密钥采用了不同的计算方式来派生:
    image.png

    算法协商流程

    在SSH协议中,上述不同的算法类型,客户端和服务端均会有一个自己支持的算法列表,对应的协商过程均为:

  4. 客户端发送支持的算法列表给出到服务端;

  5. 服务端发送支持的算法列表给出到客户端;
  6. 在客户端支持的算法列表中,从第一个开始遍历,找到一个在服务端支持的算法则是此次协商选中的算法,否则断开SSH连接;

Notice:在TLS的握手中,算法协商是客户端发送支持的算法列表,然后服务端明确选中一个作为本次的协商算法,而SSH协议是各自发送自己的算法列表,然后按照默认规则来选中。

实际SSH操作

首次正常的SSH连接

Client: ubuntu 22.04,Server:Aliyun Linux 3.2

通过ssh -v选项来展示SSH建连过程中的详细信息:
image.png
可以看到上图红框部分,为Client和Server协商好的密钥交换算法为curve25519-sha256,Server host key为ssh-ed25519,两边的各自通道的加密算法为chacha20-poly1305@openssh.com。
image.png
由于Client到Server是首次连接,因此需要基于TOFU机制来信任服务的ed25519公钥指纹。
image.png
在PublicKey方式认证环境,Client向服务端提供ecdsa算法模式的公钥,经过验证完成登录。
验证通过以后,服务端还返回rsa和ecdsa的host key对应的公钥,并保存在Client端的~/.ssh/known_hosts文件。至此,Server端的3种host key均被客户信任。
image.png

修改Client和Server配置后建连

根据OpenSSH的sshd_config指引文档,服务端的SSHD配置文件为:/etc/ssh/sshd_config,其对应内容部分截图如下:
image.png
image.png
在密码算法属性部分,可以看到OpenSSH明确提示在此处的修改不会生效,而是跟随系统的Crypto Policy,因此我们需要找到影响SSH的Crypto Policy来配置sshd。通过查询sshd的启动命令,cat /lib/systemd/system/sshd.service,我们可以看到sshd使用了/etc/crypto-policies/back-ends/opensshserver.config作为command option:
image.png
继续查看/etc/crypto-policies/back-ends/opensshserver.config,可以看到前面提到的相关算法配置项。
本次修改服务端的kex_algorithm为ecdh-sha2-nistp*,客户端的kex_algorithm为curve25519-sha256,可以看到SSH建连失败:
image.png
image.png
然后继续修改客户端的kex algorithm为ecdh-sha2-nistp256,可以看到建连成功:
image.png

总结

本文重点针对SSH TRANS中的密钥交换、服务端签名和对称加密进行了学习,然后手动配置服务端和客户端的SSH配置来影响对应的kex algorithm,从而了解OpenSSH在Linux服务器的密码算法配置方式和完整的SSH建连过程。关于host key algorithm、encryption algorithm的配置,不再展开,其配置的具体操作与kex algorithm等同。

参考文档

  1. Crypto policy: https://access.redhat.com/articles/3666211
  2. IANA SSH Parameter:https://www.iana.org/assignments/ssh-parameters/ssh-parameters.xhtml
  3. OpenSSH manual Pages:https://www.openssh.com/manual.html
  4. OpenSSH sshd_config manual Page: https://man.openbsd.org/sshd_config.5#Ciphers
  5. SafeCurves: https://safecurves.cr.yp.to/
  6. public key algorithm: https://docs.ssh.com/manuals/client-user/66/csc-algorithms-publickeyalgorithms.html
目录
相关文章
|
弹性计算 算法 安全
SSH学习(一)- 概念了解
整体上对SSH协议进行一个概括了解。
754 3
|
4月前
|
安全 Unix Linux
Docker中授权普通用户使用docker命令以及解决无权限访问/var/run/docker.sock错误。
通过上述步骤,可以有效解决普通用户无法使用Docker命令的问题,同时处理 `/var/run/docker.sock`权限错误。这样的设置不仅方便用户使用Docker提供的各项服务,同时还能保护系统的安全性。在进行此类配置更改时,请确保理解每一步骤的作用及潜在的安全风险,尤其是在修改文件权限时。在实际的操作中,始终应该努力保持系统的最低必要权限,避免过度放宽权限,这是保障系统安全的一个重要方针。
1377 75
|
Ubuntu Unix Linux
成功解决ERROR: Unable to find the development tool `cc` in your path; please make sure that you have the
成功解决ERROR: Unable to find the development tool `cc` in your path; please make sure that you have the
成功解决ERROR: Unable to find the development tool `cc` in your path; please make sure that you have the
|
11月前
|
缓存 Linux
解决CentOS 7停止更新后yum源失效问题【图文教程】
以上步骤完成后,你的 CentOS 7 系统就会使用阿里云的 yum 源,更换yum以后就可以正常使用啦。
10065 2
|
12月前
|
缓存 应用服务中间件 网络安全
如何使用OCSP进行证书验证
如何使用OCSP进行证书验证
509 4
|
存储 测试技术 数据安全/隐私保护
Docker自建仓库之Harbor部署实战
关于如何部署和使用Harbor作为Docker企业级私有镜像仓库的详细教程。
2073 13
|
存储 弹性计算 算法
SSH学习(三)- SSH协议中的Public Key Algorithm
在SSH协议中,有两个地方涉及到公钥算法,分别是: 1. 服务端认证:服务端在进行密钥协商的时候证明自己身份,防止中间人攻击,此时为SSH-TRANS协议发生的事情; 2. 客户端认证:客户端通过PublicKey方式证明自己身份,完成SSH登录认证,此时SSH-USERAUTH发生的事情; 这两种情况下的公钥算法使用的是同一个概念,接下来本文将主要基于PublicKey公钥认证方式,学习对应的内容。
1395 1
SSH学习(三)- SSH协议中的Public Key Algorithm
channelSftp.put(InputStream src, String dst, int mode);里的mode都是什么类型的
【5月更文挑战第15天】channelSftp.put(InputStream src, String dst, int mode);里的mode都是什么类型的
624 2
|
Linux
CentOS 7 配置yum阿里源 (三步即可)
CentOS 7 配置yum阿里源 (三步即可)
30319 1
|
SpringCloudAlibaba 监控 Java
SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)
SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)