SSH学习(一)- 概念了解

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 整体上对SSH协议进行一个概括了解。

## 背景

SSH为Secure Shell Protocol的简写,用于在不安全的网络上进行安全的远程登录和其它安全网络服务。作为代码工作人员,我们日常登录服务器时就使用了SSH协议,本文旨在于对SSH 2.0的理论和OpenSSH这个具体实现的常识做一些总结。

## 理论知识

SSH协议存在两个版本,分别是SSH v1和SSH v2,其对应的实现中,提供的SSH协议版本存在三种取值:


1. SSH-1,代表SSH实现支持的协议版本为v1;

2. SSH-2,代表SSH实现支持的协议版本为v1;

3. SSH-1.99,仅用于服务端,代表该服务端支持SSH v2并同时兼容SSH v1。


下文中将针对所有出现SSH都指代SSH 2.0(SSH v2),SSH v1将不再提及。

### SSH协议的组成部分

SSH协议的核心标准总共有5篇RFC文档(RFC4250-RFC4254),其对应的访问链接和其它的能力扩展相关RFC访问链接均可以通过OpenSSH提供的[Specifications](https://www.openssh.com/specs.html)页面查看。

RFC 4251中,对SSH的组成定义为3个主要部分:


1. The Transport Layer Protocol [SSH-TRANS]:SSH协议的底层传输层,一般运行在TCP协议之上。主要负责服务端认证,以及消息的机密性和完整性;

2. The User Authentication Protocol [SSH-USERAUTH]:运行在SSH-TRANS之上,完成服务端对客户端的认证;

3. The Connection Protocol [SSH-CONNECT]:运行在SSH-USERAUTH之上,在一个加密通道之上复用为多个逻辑通道,给上层的应用协议使用;


下面结合我们日常使用SSH时,经常接触的指纹、公钥、密码等概念,来简单学习[SSH-TRANS]和[SSH-USERAUTH]两个协议。

### SSH-TRANS

基于RFC 4253的定义,The Transport Layer Protocol [SSH-TRANS]主要负责服务端认证,以及消息的机密性和完整性。结合日常工作,涉及到的关键点如下:


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等;

4. mac_algorithms:采用什么样的mac算法来保证消息的完整性。如hmac-sha2-512,hmac-sha2-256等;


所有涉及到的参数均可在[IANA SSH Parameter](https://www.iana.org/assignments/ssh-parameters/ssh-parameters.xhtml)页面中找到。

### SSH-USERAUTH

RFC4252,定义了SSH协议支持的认证方式,以及对应认证请求报文格式和交换流程。目前SSH支持的认证方式为:


1. Password:通过明文密码方式进行认证,最容易理解的模式,和电脑登录一样的模式;

2. PublicKey:采用公钥验证方式,通过在服务端内置一个文件来指明接受的公钥列表,然后客户端使用私钥来签发服务端返回的挑战码来实现认证登录;目前推荐使用的公钥算法有:rsa、ecdsa、ed25519。

3. hostbased,不常用,不推荐使用。

### 关键信息Host Keys

Host Key是服务端在密钥交换环节中,用于向客户端证明自己身份的一个永久公私钥对。每个服务端都应该有一个Host Key,同时可能存在多个使用了不同的算法Host Key对,以及多个服务端可能使用同一个Host Key。

基于Host Key,客户端对服务端的身份验证有两个模式:


1. 客户端存在一个本地数据库,用于保存host name和public host key的映射关系;这种方式的好处是没有中央管理设施和没有第三方参与,坏处则是客户端和服务端数量上涨以后难以维护;

2. 基于可信CA来认证host name和host key的关系,客户端基于CA的根证书来验证服务端的host key是不是被CA签发过;

## 服务器具体实现

以Ubuntu 22.04为例,其对应的OpenSSH版本如下:

![image.png](https://cdn.nlark.com/yuque/0/2024/png/243670/1708828754161-8e2ec26a-6bb6-4fcc-912d-d0624cf8eaaa.png#averageHue=%233b3b3a&clientId=udacff0aa-f062-4&from=paste&height=44&id=u9e25ee09&originHeight=110&originWidth=1160&originalType=binary&ratio=2.5&rotation=0&showTitle=false&size=116316&status=done&style=none&taskId=ufe43b85d-43a8-4597-a290-5dc59d4a6cd&title=&width=464)

查看`/etc/ssh/`目录,可见如下信息:

![image.png](https://cdn.nlark.com/yuque/0/2024/png/243670/1708828809412-bec9cee8-48fa-4dfa-9424-94ef5f9b9b80.png#averageHue=%23333332&clientId=udacff0aa-f062-4&from=paste&height=224&id=u6ffdf6ff&originHeight=560&originWidth=1480&originalType=binary&ratio=2.5&rotation=0&showTitle=false&size=601120&status=done&style=none&taskId=uf0dc923e-39a6-4db1-b580-0b6a55117e1&title=&width=592)

其中以ssh_host前缀的文件,就是上文中的Host Key部分:

![image.png](https://cdn.nlark.com/yuque/0/2024/png/243670/1708828970270-e84e7c0c-f23c-4d5c-aed6-56f85b1c5dc9.png#averageHue=%23e3e3e2&clientId=udacff0aa-f062-4&from=paste&height=226&id=ua54fafa9&originHeight=566&originWidth=2406&originalType=binary&ratio=2.5&rotation=0&showTitle=false&size=746688&status=done&style=none&taskId=u68a78119-b6b2-47c4-92c3-361d5e056d6&title=&width=962.4)

`/etc/ssh/sshd_config`文件则是服务端针对SSH的配置,可以参考[sshd_config](https://man.openbsd.org/sshd_config.5),配置了服务端支持的kex_algorithms,encryption_algorithms,以及使用的Host Key。

在服务端中,每个用户下的`~/.ssh/authorized_keys`文件,则表明了,服务器上每个用户支持的可以登录的公钥列表。单个用户支持多个公钥。

## 客户段具体实现

客户端中的`/etc/ssh/ssh_config`文件类似于服务端的`/etc/ssh/sshd_config`文件,同样配置了客户端支持的kex_algorithms,encryption_algorithms等配置信息,具体配置可以参考[ssh](https://man.openbsd.org/ssh.1)配置。

对比服务端中每个用户的`~/.ssh/authorized_keys`文件,客户端中的每个用户下的`~/ssh`目录下包含了多个公私钥对,当公钥放置于服务端用户目录下的`~/.ssh/authorized_keys`文件中,客户端就可以通过私钥登录到服务端。

![image.png](https://cdn.nlark.com/yuque/0/2024/png/243670/1708829414699-f7018cab-d014-4f5f-8b9f-5fb113a5f3c5.png#averageHue=%23ececeb&clientId=udacff0aa-f062-4&from=paste&height=320&id=uf300bc27&originHeight=800&originWidth=2446&originalType=binary&ratio=2.5&rotation=0&showTitle=false&size=857328&status=done&style=none&taskId=ua65b1f87-b158-40cd-8d26-c609337d971&title=&width=978.4)

客户端中每个用户目录下`~/.ssh/known_hosts`文件就是客户端采用Host Key信任模式中第一种方式的数据库,基于首次信任(Trust of first use,TOFU)的原则,客户端第一次链接到服务端时,会提示客户端是否信任该服务端的指纹来决定是否继续SSH连接。

当我们使用云上ECS的时候,如果出现同一个IP通过解绑重绑方式复用到不同ECS机器时(或者服务器重新初始化系统,对应的Server Host Key文件就会重新生成),就会出现服务器指纹不匹配的问题,这个时候可以通过手动删除`~/.ssh/known_hosts`文件中的指纹或者通过 `ssh-key-gen -R 主机`来清除对应主机的指纹来实现重新连接。

## 总结

本文目标旨在于解释一些SSH协议使用中的常识信息,其对应的内容均可以在OpenSSH的manual pages找到,其服务端和客户端对应的配置命令分别为sshd和ssh。基于上述内容对SSH协议有一个基本的了解后,还需要学习SSH协议中使用的对称加密和非对称加密算法的应用,可以通过`ssh -v`选项来展示SSH链接过程的详细信息来进一步了解。

## 参考文档


1. OpenSSH: SSH Speifications: [https://www.openssh.com/specs.html](https://www.openssh.com/specs.html)

2. IANA SSH Parameter:[https://www.iana.org/assignments/ssh-parameters/ssh-parameters.xhtml](https://www.iana.org/assignments/ssh-parameters/ssh-parameters.xhtml)

3. SSH详解:[https://segmentfault.com/a/1190000011395818](https://segmentfault.com/a/1190000011395818)

4. Introduction SSH:[https://www.techtarget.com/searchsecurity/tip/An-introduction-to-SSH2](https://www.techtarget.com/searchsecurity/tip/An-introduction-to-SSH2)

5. OpenSSH manual Pages:[https://www.openssh.com/manual.html](https://www.openssh.com/manual.html)


相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
6月前
|
存储 弹性计算 算法
SSH学习(三)- SSH协议中的Public Key Algorithm
在SSH协议中,有两个地方涉及到公钥算法,分别是: 1. 服务端认证:服务端在进行密钥协商的时候证明自己身份,防止中间人攻击,此时为SSH-TRANS协议发生的事情; 2. 客户端认证:客户端通过PublicKey方式证明自己身份,完成SSH登录认证,此时SSH-USERAUTH发生的事情; 这两种情况下的公钥算法使用的是同一个概念,接下来本文将主要基于PublicKey公钥认证方式,学习对应的内容。
430 1
SSH学习(三)- SSH协议中的Public Key Algorithm
|
Java 网络安全 Spring
SSH框架学习中遇到的问题
SSH框架学习中遇到的问题
51 0
|
安全 网络安全
系统安全学习之旅(服务器ssh加固)
系统安全学习之旅(服务器ssh加固)
97 0
|
存储 前端开发 JavaScript
【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习
当下,几乎所有开发者都要接触版本控制系统(VersionControlSystem, 简称VCS), 这种工具让他们在分工合作时避免了不必要的重复与冲突,如果遇到什么问题,也可以及时回退到之前的版本。当今最流行的版本控制系统(至少在网络开发者中是这样的)是Git,和与之关联的编程社区网站GitHub、Gitee等等。我们很少独自完成一个项目,而在分工合作的同时我们都会有与他人的工作相冲突的风险:尤其是当两个人同时尝试修改同一段代码的时候。所以我们需要有相应的机制用以避免这种情况。
131 0
【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习
|
Linux 网络安全
【Linux】学习环境搭建,ip配置及ssh连接
参考资料: 1.视频课程《Linux运维》 2.书籍PDF版《Linux运维 Web集群实战》 搭建学习环境 VMware Workstation 12 装双系统不是工作环境 安装 CentOS虚拟机 下载镜像 新建虚拟机,选择磁盘10G,2网...
1190 0
|
Shell 网络安全 数据安全/隐私保护