SSH:保护远程访问
了解 SSH 握手、主机密钥身份验证,以及 SSH 如何保护远程会话
SSH:保护远程访问 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
SSH-1 与 SSH-2:弃用历程
SSH-1,即最初的安全外壳协议,存在一个根本性的设计缺陷,主动攻击者可以在不被发现的情况下向加密会话中插入任意数据。SSH-2 是于 2006 年以 RFC 4251-4254 发布的完整协议重新设计版本,通过将传输层、认证层和连接层设计为独立协议,并使用 HMAC 进行更强的完整性检查,解决了这些弱点。SSH-1 已被弃用,任何现代服务器都不应启用它。
SSH 传输层:加密与完整性
SSH 传输层协议负责初始密钥交换,并建立加密且受完整性保护的信道。该协议会协商密钥交换算法(通常为 ECDH)、主机认证算法(通常为 Ed25519 或 RSA)、对称加密算法(通常为 AES-256-CTR 或 ChaCha20-Poly1305)以及 MAC(通常为 HMAC-SHA2-256)。之后的每个数据包都会使用协商出的算法进行加密和完整性检查。
SSH 用户认证层
传输层得到保护后,用户认证层会协商用户向服务器证明身份的方式。常见方法有密码认证(用户输入密码,密码会通过传输层加密发送)、公钥认证(用户证明自己持有与服务器上已获授权公钥相对应的私钥)以及 GSSAPI(面向企业环境的 Kerberos 单点登录集成)。
SSH 连接层:多路复用信道
SSH 连接层会在单个加密传输连接上复用多个逻辑信道。典型的 SSH 会话有一个用于交互式 shell 的信道。其他信道支持端口转发、X11 转发和 SFTP 文件传输,所有这些功能共享同一个经过认证和加密的连接。信道请求允许客户端请求伪终端、设置环境变量或执行特定命令。
主机密钥验证与 TOFU
首次连接 SSH 服务器时,客户端会收到服务器的主机密钥,并必须决定是否信任该密钥。默认策略是首次使用时信任(Trust On First Use,TOFU):系统会提示用户验证密钥指纹(通常显示为 SHA256:... 这样的哈希值);如果用户接受,该密钥就会存储在 known_hosts 文件中。在后续连接中,系统会将存储的密钥与服务器出示的密钥进行比较;如果不匹配,就会发出严厉警告,提示可能存在中间人攻击。
known_hosts 与密钥指纹
known_hosts 文件存储在 ~/.ssh/known_hosts 中,用于维护按主机名和 IP 地址索引的服务器主机密钥数据库。每条记录都会将服务器地址与其公钥关联起来。如果服务器的密钥发生变化,可能是因为服务器被重新安装,也可能是因为攻击者正在冒充该服务器,SSH 会拒绝连接并显示警告。管理员会使用基于证书的主机认证,以避免在大规模环境中逐一进行 TOFU 信任决策。
用于无密码登录的 authorized_keys
公钥认证会将用户的公钥存储在服务器上的 ~/.ssh/authorized_keys 中。用户连接时,服务器会发送一个使用公钥加密的质询;只有持有相匹配私钥的一方才能正确响应,从而在不传输私钥或密码的情况下证明身份。公钥认证比密码更安全,因为私钥从不会通过网络发送,也无法通过网络钓鱼骗取。
SSH 密钥算法
目前常用的 SSH 密钥算法有三大类。3072 位或 4096 位的 RSA 密钥与所有服务器兼容。使用 NIST P-256 曲线的 ECDSA,其速度比具有同等安全性的 RSA 更快,但 P-256 的安全参数一直受到质疑。Ed25519 基于 Edwards 曲线数字签名算法,是现代推荐方案:速度快,使用较小的 256 位密钥,具有强大的安全性,并且无需担心特殊参数问题。
SSH 历史:22 端口与 Tatu Ylönen
芬兰研究人员、赫尔辛基工业大学的 Tatu Ylönen 在 1995 年开发了 SSH。当时,他所在大学的网络遭到密码嗅探攻击,数百个凭据因此暴露。他选择 22 作为端口号,是因为它位于 telnet(23)和 ftp(21)之间。SSH 取代了这两种不安全的协议。Ylönen 创立了 SSH Communications Security,后来又通过 IETF 发布了 SSH-2 开放标准。OpenSSH 是目前占主导地位的免费实现,由 OpenBSD 项目于 1999 年创建。
SSH 代理与密钥转发安全性
SSH 代理是在后台运行的进程,会将已解密的私钥保存在内存中,从而无需重复输入密码短语即可单点登录多个服务器。代理转发(-A 选项)更进一步,将代理连接转发到远程服务器,使用户能够单跳访问内部服务器。然而,代理转发存在安全风险:遭到入侵的远程服务器可以利用转发的代理,以您的身份向其他服务器进行认证。请使用 ProxyJump,而不要使用代理转发。
SSH 加固最佳实践
安全的 SSH 配置包括:禁用 root 登录(PermitRootLogin no);禁用密码认证(PasswordAuthentication no),改为仅使用公钥认证;使用 Ed25519 主机密钥;仅启用 SSH-2 协议;配置空闲会话超时;使用 AllowUsers 或 AllowGroups 限制允许登录的用户;以及更改默认端口,作为一种隐藏措施,以减少自动扫描噪声。Fail2ban 或类似工具会阻止来自多次认证失败的 IP 地址。
SSH 认证方法
为什么 SSH 公钥认证被认为比密码认证更安全?
SSH:要点总结
SSH-2 通过独立的传输层、认证层和连接层取代了存在缺陷的 SSH-1。传输层负责协商加密和完整性保护。用户认证支持密码、公钥和 GSSAPI。主机密钥验证使用 TOFU 和 known_hosts。Ed25519 是推荐的密钥算法。代理转发存在安全风险,应改用 ProxyJump。加固措施包括禁用 root 登录和密码认证。
常见问题解答
「SSH:保护远程访问」课时是免费的吗?
是的 — 「SSH:保护远程访问」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「SSH:保护远程访问」这节课中我会学到什么?
了解 SSH 握手、主机密钥身份验证,以及 SSH 如何保护远程会话 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「SSH:保护远程访问」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。