SecureShellProtocol(ssh)
目录
1.0 简介
基础理论名词
诠释加密算法
2.0 交互工作流程
sshv1与sshv2
sshv1
交互工作过程
sshv1存在问题
sshv2
sshv2的安全性
v2交互阶段
3.0 ssh小实验
文件解读
客户端免密登录服务器示例
ssh远程小实验
1.0 简介
🔭ssh基本信息
ssh全称安全外壳协议(SecureShellProtocol)
ssh是一个协议,而openssh是对ssh的一个具体的实现,它是真实用于远程连接的软件
ssh端口号:22
基础理论名词
-
单向加密算法:MD5、 SHA-1、SHA-256、SHA-3
-
对称秘钥(对称加密算法):DES、3DES、AES、Blowfish、IDEA等
-
非对称秘钥(非对称加密算法):RSA、ECC、Diffie-Hellman密钥交换(D-H算法)等
-
D-H算法作用:Diffie-Hellman (DH) 算法是一种密钥交换协议,允许两个以前不共享秘密密钥的参与者在不安全的信道上协商一个安全密钥(会话秘钥)
-
公钥(public key):用来加密的,所有人都可以获取公钥来加密数据
-
私钥(private key):用来解密的,只有自己拥有
诠释加密算法
-
单向加密算法:也称为哈希算法,用于提取文件特征码;目的:不被篡改。
-
缺点:不可逆。
-
优点:保证数据的完整性。
-
-
对称加密算法:加密和解密使用同一个秘钥。
-
缺点:需要妥善保管秘钥。
-
优点:加密速度快。
-
-
非对称加密算法:公钥可以公开,私钥保密,无需安全通道传输密钥
-
缺点:速度慢
-
优点:安全性高
-
2.0 交互工作流程
sshv1与sshv2
sshv1
交互工作过程
客户端请求连接,服务器回复Serverkey(服务端公钥)接受请求,客户端生成共享秘钥请求建立会话,服务端回包建立会话

sshv1存在问题
由于sshv1的连接过程中,当服务器端接受用户端的Private key后,就不会对此次连接中的Key pair进行检验,黑客可以针对Key pair对插入恶意代码,服务端可能会接受到恶意程序,进而系统被黑掉,由此引出了sshv2
sshv2
sshv2的安全性
sshv2多加了一个确认连接正确性的Diffie-Hellman(DH算法)机制,再每此传输数据中,服务端都会以该机制检查数据的来源是否正确。
v2交互阶段
| 阶段 | 过程 | 说明 |
|---|---|---|
| 阶段一 | 版本号协商阶段 | SSH目前包括SSH1和SSH2两个版本,双方通过版本协商确定使用的版本 |
| 阶段二 | 密钥和算法协商阶段 | SSH支持多种加密算法,双方根据本端和对端支持的算法,协商出最终使用的算法 |
| 阶段三 | 认证阶段 | SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证 |
| 阶段四 | 会话请求阶段 | 认证通过后,客户端向服务器端发送会话请求 |
| 阶段五 | 交互会话阶段 | 会话请求通过后,服务器端和客户端进行信息的交互 |
🔭文字简述
阶段一、二:相互确认使用的协商出版本号、秘钥、算法。
阶段三:此阶段有两种认证方法(密码认证 、秘钥认证);使用秘钥和算法传输用户认证信息,基于DH算法各自生成会话秘钥,认证通过后进入阶段4。
阶段4:服务端告诉客户端:可以开始会话。
阶段5:使用会话秘钥开始会话。

3.0 ssh小实验
文件解读
[root@Server ~]# ll /etc/ssh/total 600-rw-r--r--. 1 root root 578094 Jan 5 2024 moduli-rw-r--r--. 1 root root 1921 Jan 5 2024 ssh_configdrwxr-xr-x. 2 root root 28 Oct 25 13:15 ssh_config.d-rw-------. 1 root root 3667 Jan 5 2024 sshd_configdrwx------. 2 root root 59 Oct 25 13:18 sshd_config.d-rw-r-----. 1 root ssh_keys 492 Oct 25 13:22 ssh_host_ecdsa_key-rw-r--r--. 1 root root 162 Oct 25 13:22 ssh_host_ecdsa_key.pub-rw-r-----. 1 root ssh_keys 387 Oct 25 13:22 ssh_host_ed25519_key-rw-r--r--. 1 root root 82 Oct 25 13:22 ssh_host_ed25519_key.pub-rw-r-----. 1 root ssh_keys 2578 Oct 25 13:22 ssh_host_rsa_key-rw-r--r--. 1 root root 554 Oct 25 13:22 ssh_host_rsa_key.pub
🔭文件解读:
/etc/ssh/sshd_config ===> 带d的是服务器端的主配置文件,不带d的:/etc/ssh/ssh_config的是用户端主配置文件;
sshd_config.d、ssh_config.d分别存放着它们的子配置文件:sshd_config.d/01-permitrootlogin.conf,子配置文件中的参数优先级高于主配置文件,所以一般修改子配置文件,不动主配置文件。
第一次远程登录到目的主机时,本机系统会自动创建known_hosts、known_hosts.old文件
要是想要密钥登录则在服务端(要远程的主机)的~/.ssh/下要有authorized_keys文件,可以手动创建,也可以使用 "ssh-copy-id 要远程的主机名" 命令创建,可以自动生成authorized_keys文件(但是之前我windows端对Linux端用不了"ssh-copy-id 要远程的主机名" 命令,要手动创建)
[root@Server ~]# vim /etc/ssh/sshd_config# 以下的是主机私钥,不是主机公钥,主机公钥是派生出来的26 #HostKey /etc/ssh/ssh_host_rsa_key 采用rsa非对称加密算法27 #HostKey /etc/ssh/ssh_host_ecdsa_key 采用ecdsa对称加密算法28 #HostKey /etc/ssh/ssh_host_ed25519_key 采用ed25519非对称加密算法,一般使用优先级是最高的,它们三没有什么安全性的差异,只不过一个比一个新,一个比一个效率高一点,经此而已。
客户端免密登录服务器示例
# 服务端要创建authorized_keys文件来保存客户端的公钥,必须是这个文件名,少一个字母都不得,不然不成功[root@Server ~]# tree .ssh/.ssh/[root@Server ~]# touch .ssh/authorized_keys[root@Server ~]# tree .ssh/.ssh/└── authorized_keys# 客户端生成密钥对,再发送到服务端[root@Client ~]# tree .ssh/.ssh/[root@Client ~]# ssh-keygen -t rsa----# 回车[root@Client ~]# tree .ssh/.ssh/├── id_rsa└── id_rsa.pub[root@Client ~]# ssh root@192.168.126.100Are you sure you want to continue connecting (yes/no/[fingerprint])? yes# 密码登录,登录后系统会自动创建known_hosts、known_hosts.old这两个文件[root@Client ~]# tree .ssh/.ssh/├── id_rsa├── id_rsa.pub├── known_hosts # 里面保存的是第一次登录到服务端时它要客户端保存的密钥指纹└── known_hosts.old # 里面记录的是历史信息,# 使用 "ssh-keygen -R 远程的主机名" 命令后会删除掉known_hosts中有关此主机名的信息,会在known_hosts.old中看到之前删除的主机名信息[root@Client ~]# ssh-keygen -R 192.168.126.100# Host 192.168.126.100 found: line 1# Host 192.168.126.100 found: line 2# Host 192.168.126.100 found: line 3/root/.ssh/known_hosts updated.Original contents retained as /root/.ssh/known_hosts.old# 因为known_hosts里面保存的是第一次登录到服务端时它要客户端保存的密钥指纹,所以要想完成密钥登入才必须执行一次密码登录来让系统生成执行known_hosts、known_hosts.old文件# 用 "ssh-copy-id 远程的账户名@远程的主机名" 也可以很明显的看出来要密码登录一次,之后再登录时就可以免密登录了# 就算你手动创建新的known_hosts、known_hosts.old文件,再手动复制公钥到要远程的服务端的authorized_keys中,也还是要密码登录一次记录指纹才可以实现远程登录
ssh远程小实验
# 1.更改服务端口号# 2.禁止root用户密码用户(值得注意的是子配置文件优先级高于主配置文件,改主配置文件没用,安装系统时勾选的允许root密码登录就写在这个子配置文件中,建议直接改子配置文件/etc/ssh/sshd_config.d/01-permitrootlogin.conf)# 3.白名单(AllowUsers zhangsan--->只有zhangsan可以登录)# 4.密钥登录# 5.客户端普通用户连接服务端普通用户# 6.Windows密钥登录Linux# 写了一遍都太简单了,不全记录了,记录一些注意实现吧
注意!
#注意:客户端生成ecdsa秘钥(当/root/.ssh/目录下有多个秘钥对的时候,需要指定):[root@client ~]# ssh-keygen -q -t ecdsa -P '' -f /root/.ssh/ecdsa_key[root@client ~]# ssh-copy-id -i /root/.ssh/ecdsa_key.pub redhat@192.168.5.137#如果有多个密钥对,那么远程连接的时候需要指定使用的私钥[root@client ~]# ssh redhat@192.168.5.137 -i /root/.ssh/ecdsa_key
