- 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