一文讲清楚SSH技术原理

一文讲清楚SSH技术原理

SSH 是什么

SSH(Secure Shell)是一个提供数据通信安全、远程登录、远程指令执行等功能的安全网络协议,也叫做安全外壳协议。SSH 用于加密两台计算机之间的通信,并且支持各种身份验证机制。其本质上是进行加密的 Shell,它既可以代替 Telnet,又可以为 FTP、POP等提供一个安全的“通道”。

几乎主流的UNIX平台都能运行 SSH,现在主流的开源实现是 OpenSSH,并且基本所有的 Linux 发行版都自带 OpenSSH。

SSH目前主要有两个不兼容的版本——SSH1 和 SSH2。SSH2 在安全性和特性方面都优于SSH1,项目中发现某些网络设备使用 SSH1 协议。SSH 为什么是安全的

传统的网络服务协议如:FTP、POP 和 Telnet 在本质上都是不安全的,因为它们在网络上用明文的方式传送口令和数据,非常容易被截获。其次,这些服务程序的安全验证方式也是有其弱点的,非常容易受到“中间人攻击”(Man-in-the-MiddleAttack,简称MITM)。所谓“中间人”的攻击方式,就是“中间人”冒充真正的 Server 接收你的传给 Server 的数据,然后再冒充你把数据传给真正的服务器。Server 和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现非常严重的问题。

SSH 则通过非对称加密解决了上述问题。

对称加密:数据的加密和解密使用的是同一个秘钥;

非对称加密:在进行数据加密处理的时候通常使用公钥对数据进行加密,私钥进行解密,安全性更高。

3. SSH 认证类型

SSH 主要提供密码口令和秘钥认证两种认证类型。

3.1 基于密码口令认证

基于口令的安全验证的方式就是大家现在一直在用的,只要知道服务器的SSH连接帐号和口令(当然也要知道对应服务器的 IP及开放的 SSH端口,默认为22 ),就可以通过 SSH 客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。

密码口令认证示意图如下:

密码口令认证流程:

1.客户端向服务端发起连接请求;

2.服务端收到请求,并将自己生成的公钥返回给客户端;

3.客户端用返回来的公钥加密自己的登录密码,发送给服务端;

4.服务端用自己的私钥解密,并验证密码是否正确,如果正确,允许登录。

密码口令认证的缺点:

繁琐,每次登陆服务器都需要输入密码,短的密码不安全,长的密码不好记。(可以通过 JumpServer 托管密码解决)

安全性差,易受“中间人攻击”,面临「客户端如何保证接受到的公钥就是目标服务端的?」,而基于秘钥认证的方案则可以有效解决这一问题。

3.2 基于密钥认证

秘钥认证很好的解决了密码口令认证易受“中间人攻击”的问题,通过事前创建的包含公钥和私钥的密钥对来实现。

其中,私钥不能在网络中传输—私钥可以解密公钥;公钥可以再网路中传输—公钥不能解密私钥。(关于私钥解密公钥我们将在后面的章节里结合 JumpServer 推送用户和批量改密时展开介绍)

密钥认证登录流程:

1.用户手动将客户端的公钥追加至服务端的 ~/.ssh/authorized_keys ,私钥自己保管;

2.服务端收到请求,在 authorized_keys 中匹配客户端的公钥,并生成随机数 X ,用客户端的公钥对 X 进行加密得到 Y,然后将 Y 返回给客户端;

3.客户端通过私钥对 Y 进行解密得到 X,然后对 X 和本次会话的 SessionKey 利用 MD5 生成摘要 Digest1,并发送至服务端;

4.服务端也对 X 和 SessionKey 使用通用的摘要算法生成 Digest2;

5.服务端比较 Digest1 和 Digest2 是否相同,完成认证过程。

SSH 密钥认证登录配置方法

4.1 生成密钥对

[root@ecs-3f41 opt]# ssh-keygen -t rsa -C XusongKeyPair -f xusong

Generating public/private rsa key pair.

Enter passphrase (empty for no passphrase): <== 若需要,可在此输入私钥的密码,或直接按 Enter 留空

Enter same passphrase again:

Your identification has been saved in xusong.

Your public key has been saved in xusong.pub.

The key fingerprint is:

SHA256:pqLH42sjuZXsmspSbIG34j7Meb6qb315Z6LY0YA+8vE XusongKeyPair

The key’s randomart image is:

±–[RSA 2048]----+

| |

| |

| . |

|. o . |

| o o. . S |

|. =o . = |

|++o+O o… |

|o*+OBBo.o o |

|*B@XB=Eo + |

±—[SHA256]-----+

私钥密码在需要时可配置,不需要时留空即可

现在,在当前目录下生成私钥 xusong 和公钥 xusong.pub 两个文件。若执行 ssh-keygen 时不指定 -f,则在用户的家目录中生成了一个 .ssh 的隐藏目录,内含私钥 id_rsa 和公钥 id_rsa.pub 两个文件。

4.2 在服务器上添加公钥

方式一:

#客户端执行 ssh-copy-id 将公钥直接复制到服务端

[root@ecs-3f41 opt]# ssh-copy-id -i xusong root@119.3.1.83

方式二:

#先将公钥复制到服务端,然后追加到 authorized_keys 中

[root@ecs-84a2 opt]# cat xusong.pub >> authorized_keys

方式三:

#本地直接打开公钥文件,并拷贝公钥到服务端的 authorized_keys 中

注意:

方式三需注意避免换行符;

方式二和方式三需使用追加的方式,避免覆盖;

authorized_keys 文件权限需配置为 600, ~/.ssh/ 目录权限需配置为 700 ,否则无法使用秘钥连接

4.3 测试登录

服务端开启密钥登入的认证方式

#打开SSH服务配置文件

[root@ecs-84a2 opt]# vim /etc/ssh/sshd_config

#约在43行,开启秘钥登录

PubkeyAuthentication yes

#重启SSH服务

[root@ecs-84a21 opt]# systemctl restart sshd

客户端使用密钥登录服务器

[root@3f41 opt]# ssh -i xusong test@134.175.220.42

Enter passphrase for key ‘xusong’:

Last failed login: Mon Feb 6 18:46:10 CST 2023 from 221.214.211.122 on ssh:notty

There were 7 failed login attempts since the last successful login.

Last login: Mon Feb 6 14:30:36 2023 from 43.254.45.44

相关推荐