只要做过远程计算机操作,就绕不开 SSH。Telnet 时代你在远程终端上敲的每一行——包括密码——都是明文跑在网络上的,接在同一网段的任何人抓个包就能看光。1995 年 Tatu Ylönen 因为一次密码嗅探攻击写了 SSH,就是为了把这条裸奔的通道加密起来。这篇把 SSH 的来龙去脉捋一遍:它是什么、连接怎么建立、除了登录还能干什么,以及配置不当会出什么问题。

SSH 是什么

SSH(Secure Shell)是一种加密的网络传输协议,为在不安全网络上提供安全的远程登录和其他网络服务而设计。 它解决的核心矛盾是:远程操作的便利性与网络传输的机密性天然冲突——想操作别的机器就得把命令和数据送出网,而网络本身不可信。SSH 的答案是全程加密 + 双向验证身份。

与相邻的两个协议对比着看更清楚:

维度 Telnet SSH HTTPS
传输内容 明文 全程加密 加密
身份验证 密码明文传输 密码/公钥/Kerberos 证书
典型用途 远程终端(已淘汰) 远程终端、文件传输、端口转发 Web 流量
端口 23 22 443

HTTPS 和 SSH 同为加密协议,但定位不同:HTTPS 保护的是 Web 内容分发,信任锚在 CA 证书体系;SSH 面向运维场景,信任锚在首次连接时的主机密钥指纹核对。两者不是替代关系。

连接是怎么建立的

SSH 建立一条安全连接分三步,顺序有讲究:

  • 密钥交换:客户端与服务器用 Diffie-Hellman 类算法在公开信道上协商出一份只有彼此知道的会话密钥,窃听者拿不到。这一步先把信道保护起来。
  • 用户认证:在已加密的信道里验证”你是谁”,支持密码、公钥、Kerberos 等方式。
  • 数据传输:认证通过后,所有数据都在会话密钥的对称加密之下传输。

这三步不是纸上谈兵,连接时加 -v 就能看到。下面在 Rocky Linux 9 容器(OpenSSH 9.9p1)里实测一次公钥登录,密钥交换与会话加密的算法清清楚楚:

配图1

curve25519-sha256 是密钥交换算法,aes256-gcm@openssh.com 是协商出的对称加密套件,最后公钥认证通过、命令正常返回——理论三步与实际报文一一对应。

功能特性

SSH 不只是远程登录工具,三个能力各自撑起一片场景:

  • 远程操作:安全地访问和操作另一台计算机,这是最基本的用法,也是 Ansible、SaltStack 这类运维工具的传输底座。
  • 文件传输:SSH 之上的 SCP 和 SFTP 负责安全传文件。值得一提的是 OpenSSH 9.0 起 scp 命令底层已改用 SFTP 协议实现,老脚本里依赖的通配符展开等行为可能需要适配。
  • 端口转发:把任意 TCP 端口通过加密隧道转发到本地或远端,让不安全的服务(老数据库、内部管理界面)套上 SSH 的加密通道穿越不可信网络。

风险与边界

SSH 是相对安全的协议,但”相对”两个字要拆开看。它并非没有弱点,更不是万能保险:

  • 配置不当就是入口:协议加密再好,也架不住口子开在配置上——弱密码、私钥泄露、PermitRootLogin 没关,都是攻击者的现成路径。
  • 端点安全协议管不了:SSH 保护的是传输过程,通道两端的机器被入侵时它无能为力。
  • 它不解决授权与审计:谁能登录、登录后能干什么、干过什么,需要配套的权限体系与审计日志,SSH 本身只回答”通道是否安全”。

什么时候不该用 SSH:面向公众的 Web 服务请用 HTTPS 而不是端口转发硬凑;大规模批量管理场景,SSH 只是传输层,编排要交给配置管理工具;对实时性要求极高的音视频传输也不该套 SSH 隧道,TLS/QUIC 更合适。

安全实践

  • 优先公钥认证:比密码抗暴力破解能力强得多,配合禁用密码登录(PasswordAuthentication no)和禁用根登录效果更好。
  • 把密钥当资产管理:定期更换、及时清理离职人员与废弃机器的公钥,私钥绝不离开本机。
  • 收紧服务端配置:改默认端口虽属”隐身”而非加固,但 AllowUsers 白名单、失败锁定、fail2ban 类封禁是实打实的减攻面手段。
  • 端口转发开放前想清楚:它会把哪个服务暴露给谁,避免无意中绕过防火墙策略。

注意事项

  • SSH 安全的前提是配置正确:服务配置不当或密钥管理不善本身就是入侵点,加密救不了配置错误。
  • 认证方式里,公钥认证比密码认证更值得优先考虑,配合禁用根登录效果更好;Kerberos 适用于已有域环境的企业内网。
  • 首次连接时核对主机密钥指纹(ssh-keygen -l -f 或 -v 输出),这是防御中间人攻击的第一道、也是最便宜的一道闸。
  • 别忘了端点安全:SSH 保护的是传输过程,通道两端的机器被入侵时协议无能为力。

从 Telnet 的明文裸奔到 curve25519 + AES-GCM 的全程加密,SSH 用三十年把”远程登录”从高危操作变成了基础设施。协议本身足够可靠,真正决定安全的永远是配置它、保管密钥的人——把公钥认证开起来,把密码登录关下去,这是今天就能做完的第一步。

本文由作者 2020-2024 年间的 CSDN 博客文章重构而来,原发布于 CSDN。