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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 重点学习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
目录
相关文章
|
4月前
|
Ubuntu Shell Linux
使用sshpass工具通过SSH执行远程命令
`sshpass`是一个用于在脚本中自动输入SSH密码的工具 **在Debian/Ubuntu上安装sshpass:** ```bash sudo apt-get install sshpass ``` **在CentOS/RHEL上安装sshpass:** ```bash sudo yum install sshpass ``` **在Fedora上安装sshpass:** ```bash sudo dnf install sshpass ``` 安装完成后,你可以使用`sshpass`命令通过SSH执行远程命令。以下是一个示例: ```bash sshpass -p 'yo
521 0
|
4月前
|
网络协议 安全 Shell
配置ssh服务
配置ssh服务
|
4月前
|
安全 前端开发 Shell
SSH原理与运用
SSH原理与运用
|
4月前
|
网络安全 数据安全/隐私保护
如何使用ssh key免密码登录服务器?
如何使用ssh key免密码登录服务器?
|
Ubuntu 网络安全 数据安全/隐私保护
ssh和sshpass
ssh和sshpass
171 0
|
网络安全 开发工具 数据安全/隐私保护
ssh方式已经out了,AccrssToken了解下
在过往中,我们都是本地配置ssh生成key,然后在github的ssh中粘贴本地生成的key,这种方式其实挺繁琐的,如果我换一台电脑,貌似我又需要重复一遍这样的操作
138 0
ssh方式已经out了,AccrssToken了解下
|
安全 算法 Shell
SSH 的原理与应用
SSH 的原理与应用
SSH 的原理与应用
|
网络安全
将ssh key添加到ssh-agent使用命令ssh-add ~/.ssh/id_rsa结果报错
将ssh key添加到ssh-agent使用命令ssh-add ~/.ssh/id_rsa结果报错 Error connecting to agent: No such file or directory 开启ssh-agent:ssh-agent 报错: unable to start ssh-...
8896 0
|
网络安全
生成多个ssh key添加到ssh-agent测试连接报错
ssh key添加到ssh-agent测试连接报错 ssh -T git@github.com 如下报错,说明是~/.ssh/config文件问题.ssh/config: line 5: Bad configuration option: usekeychain修改配置文件解决问题,完整流程看这里Mac系统如下 Host new HostName github.
3378 0