加密与安全通信

SSH (安全外壳协议)

约 5 分钟阅读

什么是 SSH

SSH (Secure Shell) 是一种为了安全地远程连接网络上的计算机而设计的协议。它对所有通信内容进行加密,从而排除了密码和命令内容被第三方窃听的风险。

在 SSH 出现以前,人们使用 Telnet 和 rlogin 等协议,但它们以明文 (未加密) 传输通信内容,对网络上的窃听毫无防备。1995 年,芬兰的 Tatu Ylönen 开发了 SSH,其后它以 OpenSSH 的形式开源,成为事实上的标准协议。

如今,SSH 被用于服务器管理、云基础设施操作、Git 仓库访问、自动化部署流水线等 IT 基础设施的各种场景。默认的端口号是 22。

公钥认证的工作原理

SSH 的认证方式中最受推荐的是公钥认证。它不使用密码,而是用数学上成对的两把密钥 (公钥和私钥) 来完成身份确认。

  1. 生成密钥对:在客户端运行 ssh-keygen 命令,生成公钥与私钥的密钥对。私钥保存在客户端,绝不能泄露到外部。
  2. 注册公钥:把生成的公钥登记到服务器的 ~/.ssh/authorized_keys 文件中。
  3. 认证过程:连接时,服务器生成随机的挑战数据并发送给客户端;客户端用私钥对挑战数据签名,服务器再用公钥验证该签名。私钥本身不会流经网络。
密码认证
设置简单,但难以抵御暴力破解攻击。密码会流经网络 (虽然经过加密,但在服务器一侧会被还原成明文)。
公钥认证
由于私钥不会流经网络,即使通信被窃听也是安全的。暴力破解攻击实际上不可能实现。若设置了密码短语,即使私钥文件泄露,也不会被立即滥用。

密钥算法目前推荐 Ed25519。RSA 也在广泛使用,但建议密钥长度为 4096 位以上。DSA 和 ECDSA (nistp256) 因安全方面的顾虑已不再推荐。

端口转发

SSH 的端口转发 (隧道) 是通过 SSH 的加密连接,把其他协议的通信安全地转发出去的功能。

  • 本地转发:把对客户端一侧端口的连接,经由 SSH 隧道转发到远程服务器一侧的指定端口。例如用 ssh -L 3306:db-server:3306 bastion,即可从本地的 3306 端口经跳板机连接数据库。用于连接因防火墙而无法直接访问的服务。
  • 远程转发:把对远程服务器一侧端口的连接,经由 SSH 隧道转发到客户端一侧。用于把位于 NAT 内侧的服务器对外公开等场景。
  • 动态转发:把 SSH 连接当作 SOCKS 代理使用。执行 ssh -D 1080 server 后,只要把浏览器的代理设置指向 localhost:1080,所有网页通信都会经过 SSH 隧道。对公共 Wi-Fi 上的通信保护很有效。

在尚不至于要搭建 VPN、但需要安全连接特定服务的场合,端口转发非常实用。经由跳板机 (Bastion Host) 的多级 SSH 连接,也可以用 ~/.ssh/configProxyJump 指令简洁地配置。

SCP 和 SFTP 文件传输

利用 SSH 的加密通道进行文件传输的协议,有 SCP 和 SFTP 两种。

SCP (安全复制协议)
用一条命令就能复制文件的简单工具,用法形如 scp file.txt user@server:/path/。不能中断与续传,也不适合目录的同步。从 OpenSSH 9.0 开始,其内部改为使用 SFTP 协议。
SFTP (SSH 文件传输协议)
可以进行类似 FTP 的交互式文件操作,支持目录列表显示、文件的删除与重命名、传输的中断与续传。GUI 客户端也很丰富 (WinSCP、FileZilla、Cyberduck)。名字相似,但与 FTPS (FTP over TLS) 是不同的协议。

传统的 FTP 以明文传输密码和文件内容,因此如今出于安全上的理由,强烈建议迁移到 SFTP。除了需要与旧系统保持兼容的情况,新建系统都应选择 SFTP。

SSH 安全最佳实践

SSH 即使保持默认设置也能提供加密通信,但在生产环境中施加以下配置,可以大幅降低受攻击的风险。

  • 禁用密码认证:在 /etc/ssh/sshd_config 中设置 PasswordAuthentication no,仅允许公钥认证。仅此一项就能让绝大多数暴力破解攻击失效。
  • 禁止 root 登录:设置 PermitRootLogin no,改为以普通用户登录后再用 sudo 提升权限的运维方式。
  • 更改端口号:把默认的 22 端口改为其他端口。这并不能从本质上强化安全性,但能大幅减少自动扫描带来的攻击尝试。
  • 限制来源 IP:用防火墙把对 SSH 端口的访问限定在特定的 IP 地址。在云环境中则用安全组来控制。
  • 部署 Fail2ban:这是把认证失败超过一定次数的 IP 地址自动封锁的工具,是针对暴力破解攻击的有效对策。
  • 密钥的轮换:定期更新 SSH 密钥,把离职人员和不再需要的密钥迅速从 authorized_keys 中删除。一旦疏于清点密钥,离职人员仍能继续访问服务器的状态就会被放任下去。

常见误解

SSH 只有系统管理员才会用
开发人员通过 SSH 访问 Git 仓库 (git@github.com:...),CI/CD 流水线通过 SSH 部署代码,数据科学家通过 SSH 连接远程 GPU 服务器。几乎所有 IT 从业者都在日常工作中使用 SSH。
改了 SSH 端口就安全了
更改端口可以减少自动扫描,但通过端口扫描很容易发现。真正的安全需要禁用密码认证、强制公钥认证、限制来源 IP 等多重措施。
SSH 密钥创建后可以永久使用
SSH 密钥应该定期轮换。风险包括离职人员密钥未删除、私钥泄露可能性以及加密算法过时等问题。
分享

相关术语

相关文章