SSH 协议概述
- 不常用容易忘,整理一篇。
SSH 协议介绍
SSH(Secure Shell)是一种网络协议,用于在不安全的网络中建立安全的远程连接。它提供了加密的通信通道,使用户能够在不同的计算机之间安全地传输数据和执行命令。
SSH 最初是为替代 Telnet 和 rlogin 这类不安全的远程登录协议而设计的。与这些协议不同,SSH 使用加密技术来保护数据的机密性和完整性,防止信息被窃听、篡改或伪装。
SSH 协议有两个主要组件:SSH 客户端和 SSH 服务器。客户端是用户用于与远程计算机建立连接的工具,而服务器是接受连接请求并提供服务的计算机。
SSH 提供了很多功能,包括远程登录、远程执行命令、安全文件传输(SCP 和 SFTP)、端口转发等。它被广泛用于管理远程服务器、进行安全的文件传输和远程操作。
SSH 工作原理
SSH 的安全性比较好,其对数据进行加密的方式主要有两种:
对称加密(密钥加密)
非对称加密(公钥加密)
SSH 的加密原理中,使用了 RSA 非对称加密算法。整个过程大致如下:
- 客户端发起连接请求到服务器,并发送公钥给服务器。
- 服务器使用公钥对客户端发送的数据进行加密,并返回加密后的数据给客户端。
- 客户端使用自己的私钥解密服务器返回的数据,并发送解密后的数据给服务器。
- 服务器验证客户端发送的数据,并使用公钥对自己的数据进行加密。
- 客户端使用服务器的公钥解密服务器发送的数据,并进行验证。
- 一旦连接建立,客户端和服务器之间的通信将在加密的通道中进行。
SSH 中间人攻击
SSH 中间人攻击(SSH Man-in-the-Middle Attack)是一种恶意攻击,旨在窃取或篡改通过 SSH 协议进行的通信。
在正常的 SSH 连接中,客户端和服务器之间建立了一个安全的加密通道。然而,中间人攻击者通过伪装成合法的 SSH 服务器,成功插入自己作为连接的中间环节,截获和篡改通信数据。
中间人攻击的过程如下:
- 客户端发起 SSH 连接请求到服务器,然后中间人攻击者截获这个连接请求。
- 中间人攻击者伪装成合法的 SSH 服务器,向客户端发送一个伪造的公钥。
- 客户端接收到伪造的公钥并将其保存为可信的服务器公钥。
- 客户端使用伪造的公钥对通信数据进行加密,并发送给中间人攻击者。
- 中间人攻击者解密客户端发送的数据,并使用合法的公钥对其重新加密。
- 中间人攻击者将重新加密的数据发送给实际的 SSH 服务器。
- SSH 服务器解密数据并进行处理,然后将响应数据发送给中间人攻击者。
- 中间人攻击者使用伪造的公钥对响应数据进行加密,并发送给客户端。
- 客户端接收到响应数据并使用伪造的公钥进行解密。
在这个过程中,中间人攻击者成功绕过了 SSH 连接的安全性,能够窃取敏感数据、篡改通信内容或进行其他恶意操作。
SSH 口令登录
SSH 口令登录(SSH password authentication)是 SSH 协议中的一种身份验证方式,使用用户名和密码来进行远程主机登录。
在 SSH 口令登录中,用户需要提供用户名和相应的密码来进行身份验证,以获得对远程主机的访问权限。
以下是 SSH 口令登录的一般过程:
- 客户端发起 SSH 连接请求到目标服务器。
- 服务器响应连接请求,提示客户端输入用户名。
- 客户端发送用户名给服务器。
- 服务器接收到用户名后,向客户端发送一个随机的挑战(challenge)。
- 客户端使用用户输入的密码和挑战进行计算,生成一个响应(response)。
- 客户端将响应发送给服务器。
- 服务器使用相同的挑战和存储的用户密码进行计算,生成一个期望的响应。
- 服务器将期望的响应与客户端发送的响应进行比较。
- 如果两个响应匹配,服务器验证通过,允许客户端登录。
如果是第一个登录远程主机,会出现以下提示:
1 | ssh user@host |
- 因为公钥长度较长(采用 RSA 算法,长达 1024 位),很难对比,所以对其进行 MD5 计算,将它变成一个 128 位的指纹。
- 经过对比后,如果用户接受了这个远程主机的公钥。系统会出现一句提示语:
1 | Warning: Permanently added 'host,xxx.xxx.xxx.xxx' (RSA) to the list of known hosts. |
表示 HOST 主机已得到认可,然后在输入登录密码就可以登录了。
当远程主机的公钥被接受以后,它就会被保存在文件
~/.ssh/known_hosts
之中。下次再连接这台主机系统就会认出它的公钥已经保存在本地了,从而跳过警告部分直接提示输入密码。
每个 SSH 用户都有自己的
known_hosts
文件,用于保存已知的远程主机的公钥信息。这个文件位于用户的家目录下的.ssh
文件夹中,路径通常是~/.ssh/known_hosts
。需要注意的是,SSH 口令登录存在一些安全风险:
- 密码可能会被窃听:在网络传输过程中,密码可能会被中间人攻击者截获和窃取。
- 密码可能会被暴力破解:攻击者可以使用暴力破解的方法尝试不同的密码组合,直到找到正确的密码。
- 密码可能会被弱密码攻击:使用弱密码容易受到字典攻击或常见密码猜测等攻击方式的影响。
SSH 公钥登录
SSH 公钥登录(SSH public key authentication)是一种更安全和便捷的 SSH 身份验证方式,它使用公钥/私钥对来进行身份验证,而不是传统的用户名和密码。
公钥登录的过程如下:
- 生成密钥对:首先在本地机器上生成一对密钥,包括公钥和私钥。通常使用 SSH 密钥生成工具(例如 ssh-keygen)生成密钥对。
- 将公钥复制到远程主机:将生成的公钥复制到目标远程主机上的
~/.ssh/authorized_keys
文件中。该文件存储了被允许使用公钥进行登录的用户列表。 - 发起 SSH 连接:客户端发起SSH连接请求到目标远程主机。
- 提供私钥进行身份验证:客户端在连接过程中使用私钥对数据进行签名,并将签名结果发送给远程主机。
- 服务器验证签名:远程主机使用预先存储的公钥对客户端发送的签名进行验证。如果验证成功,客户端被授权登录。
注:如果还是不行,就用 vim 打开远程主机的
/etc/ssh/sshd_config
这个文件,将以下几行的注释去掉。
1 | RSAAuthentication yes |
- 公钥登录的优点包括:
- 更强的安全性:公钥/私钥对是加密的,私钥存储在本地机器上,不会在网络上传输,因此不容易被窃取。
- 无需密码:公钥登录不需要用户输入密码,提供了更便捷的身份验证方式。
- 抵御暴力破解:由于不涉及密码,公钥登录可以抵御暴力破解攻击。
SSH 注意事项
- Linux 服务器之间进行 SSH 免密登录时,文件及目录的权限有严格控制,不能过渡授权。
- 主要内容如下:
- /root 目录权限为 700:这将限制对 /root 目录的访问权限仅限于 root 用户自己。这是为了确保 root 用户的敏感文件不会被其他用户访问。
- .ssh 目录权限为 700:这是存放 SSH 相关文件的目录,包括私钥、公钥和授权文件。将目录权限设置为 700 可以确保只有目录的所有者(即 root 用户)可以读取、写入和访问该目录。
- id_rsa 文件权限为 600:这是私钥文件,它相当于一个锁,用于解锁公钥加密的信息。将文件权限设置为 600 可以确保只有文件的所有者可读取和写入该文件,而其他用户没有权限访问。
- id_rsa.pub 文件权限为 644:这是公钥文件,它相当于一个钥匙,用于加密信息,让其他用户(对端)可以进行公钥身份验证。将文件权限设置为 644 允许任何用户可读取该文件,但只有文件的所有者可写入。
- authorized_keys 文件权限为 600:这是存放其他用户(对端)的公钥的文件,用于进行身份验证。将文件权限设置为 600 可以确保只有文件的所有者可读取和写入该文件,其他用户没有权限访问。
- known_hosts 文件权限为 600:这是存放首次SSH互信认证对端的指纹信息的文件。将文件权限设置为 600 可以确保只有文件的所有者可读取和写入该文件,其他用户没有权限访问。