强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第1章 SSH 协议与 OpenSSH 简介

第1章 SSH 协议与 OpenSSH 简介

1.1 什么是 SSH?

SSH(Secure Shell,安全外壳协议)是一种网络协议,用于在不安全的网络上安全地进行远程登录、命令执行和文件传输。它最初由芬兰程序员 Tatu Ylönen 于 1995 年开发,目的是取代 Telnet、rsh、rlogin 等明文传输协议。

SSH 的核心价值:

特性说明
加密传输所有数据经过加密,防止窃听
身份验证支持密码、密钥、证书等多种认证方式
数据完整性防止数据在传输过程中被篡改
端口转发可以安全地隧道化其他协议
广泛支持几乎所有 Unix/Linux 系统原生支持

1.2 SSH 协议版本演进

SSH-1(1995年)

第一版协议,存在多个已知安全漏洞:

  • CRC-32 完整性检查可被绕过
  • 密钥交换过程存在弱点
  • 已被弃用,不应在生产环境使用

SSH-2(2006年,RFC 4251)

当前标准版本,安全性和功能大幅增强:

  • 基于 DH(Diffie-Hellman)或 ECDH 的密钥交换
  • 支持更强的加密算法(AES-256-GCM、ChaCha20-Poly1305)
  • 改进的 MAC(消息认证码)算法
  • 支持 SSH 证书认证
  • 不兼容 SSH-1
SSH 协议架构:

┌─────────────────────────────────────────────┐
│            应用层 (Application)              │
│   Shell / SFTP / SCP / 端口转发 / X11      │
├─────────────────────────────────────────────┤
│          连接层 (Connection)                 │
│   通道复用 / 会话管理 / 流量控制            │
├─────────────────────────────────────────────┤
│         认证层 (Authentication)              │
│   公钥 / 密码 / 证书 / 键盘交互             │
├─────────────────────────────────────────────┤
│          传输层 (Transport)                  │
│   密钥交换 / 加密 / 完整性 / 压缩           │
├─────────────────────────────────────────────┤
│            TCP/IP                            │
└─────────────────────────────────────────────┘

1.3 SSH 握手过程

理解 SSH 连接建立的过程,对于排查问题和理解安全机制至关重要。

阶段一:传输层协商(Transport)

客户端                                服务器
  │                                      │
  │──── TCP 三次握手 ────────────────────>│
  │                                      │
  │──── 协议版本交换 ───────────────────>│
  │<─── 协议版本交换 ────────────────────│
  │                                      │
  │──── 算法协商 (KEX) ─────────────────>│
  │<─── 算法协商 (KEX) ─────────────────│
  │                                      │
  │──── DH 密钥交换 ────────────────────>│
  │<─── DH 密钥交换 + 主机密钥 ─────────│
  │                                      │
  │<═══ 加密通道建立 ═══════════════════>│

阶段二:用户认证(Authentication)

客户端                                服务器
  │                                      │
  │──── 认证请求 (用户名) ──────────────>│
  │<─── 可用认证方法列表 ────────────────│
  │                                      │
  │──── 公钥认证 / 密码认证 ────────────>│
  │<─── 认证结果 ────────────────────────│
  │                                      │
  │<═══ 认证成功,进入会话 ═════════════>│

阶段三:会话请求(Session)

客户端                                服务器
  │                                      │
  │──── 请求通道 (session) ─────────────>│
  │<─── 通道确认 ────────────────────────│
  │                                      │
  │──── 执行命令 / 请求 Shell ──────────>│
  │<─── 数据流 (stdout/stderr) ─────────│

1.4 SSH 的加密机制

对称加密(Symmetric Encryption)

用于加密实际传输的数据,客户端和服务器使用相同的会话密钥:

算法密钥长度推荐程度说明
[email protected]256 bit⭐⭐⭐ 首选AES-GCM,同时提供加密和认证
[email protected]256 bit⭐⭐⭐ 首选适合无 AES 硬件加速的环境
aes256-ctr256 bit⭐⭐ 可用CTR 模式,需配合 HMAC
[email protected]128 bit⭐⭐ 可用性能更好,安全性略低
3des-cbc168 bit❌ 避免已不安全
arcfour128 bit❌ 避免RC4 流密码,已不安全

非对称加密(Asymmetric Encryption)

用于密钥交换和身份验证:

算法类型密钥长度推荐程度
ssh-ed25519EdDSA256 bit⭐⭐⭐ 首选
ecdsa-sha2-nistp256ECDSA256 bit⭐⭐ 可用
rsa-sha2-256/512RSA4096 bit⭐⭐ 兼容性好
ssh-dssDSA1024 bit❌ 已弃用

密钥交换算法(Key Exchange)

算法推荐程度说明
curve25519-sha256⭐⭐⭐ 首选最现代的 ECDH 实现
diffie-hellman-group16-sha512⭐⭐⭐ 推荐4096-bit DH
diffie-hellman-group14-sha256⭐⭐ 可用2048-bit DH
diffie-hellman-group1-sha1❌ 避免已不安全

完整性校验(MAC)

算法推荐程度
[email protected]⭐⭐⭐ 首选
[email protected]⭐⭐⭐ 首选
hmac-sha1❌ 避免

注意: etm(encrypt-then-MAC)模式比 mti(MAC-then-encrypt)更安全。


1.5 OpenSSH:事实标准

OpenSSH 是 SSH 协议最广泛使用的开源实现,由 OpenBSD 项目维护。几乎所有的 Linux 发行版、macOS 都默认安装 OpenSSH。

OpenSSH 组件

组件类型功能
sshd服务端SSH 守护进程,监听连接请求
ssh客户端远程登录和命令执行
scp客户端基于 SSH 的文件复制(已逐步被 sftp 取代)
sftp客户端安全文件传输协议
ssh-keygen工具生成和管理密钥对
ssh-copy-id工具将公钥部署到远程服务器
ssh-agent工具密钥代理,缓存私钥密码
ssh-add工具向 ssh-agent 添加密钥
sshd-config工具检查 sshd_config 语法(较新版本)

OpenSSH 版本与特性对照

版本发布年份重要特性
6.52014Ed25519 密钥支持
7.02016禁用 SSH-1、弃用 DSA
7.42017新增 Include 指令
8.02019FIDO/U2F 硬件密钥支持
8.22020FIDO2/WebAuthn 支持
8.82021弃用 ssh-dss
9.02022默认禁用 ssh-rsa 签名
9.32023Include 支持通配符
9.62023连接修复、安全改进
9.82024regreSSHion 漏洞修复(CVE-2024-6387)

1.6 SSH 的适用场景

场景一:远程服务器管理

最基础的用途——通过终端远程管理 Linux 服务器:

# 连接到远程服务器
ssh [email protected]

# 执行单条命令
ssh [email protected] "df -h && free -m"

# 指定端口连接
ssh -p 2222 [email protected]

业务场景: 运维人员管理分散在各地的云服务器,无需物理接触设备。

场景二:安全文件传输

替代 FTP 等不安全的文件传输协议:

# 使用 scp 复制文件
scp backup.tar.gz user@server:/backups/

# 使用 sftp 交互式传输
sftp user@server

# rsync over SSH(推荐)
rsync -avz -e ssh /local/path/ user@server:/remote/path/

业务场景: 部署应用代码、传输数据库备份、同步日志文件。

场景三:端口转发与隧道

将不安全的网络流量通过 SSH 加密隧道传输:

# 本地转发:访问本地 8080 端口 = 访问远程 80 端口
ssh -L 8080:localhost:80 user@server

# 远程转发:外部访问服务器 9090 端口 = 访问本地 3000 端口
ssh -R 9090:localhost:3000 user@server

# 动态转发:SOCKS5 代理
ssh -D 1080 user@server

业务场景: 安全访问内网服务、穿透防火墙、加密公共 Wi-Fi 流量。

场景四:自动化运维

通过 SSH 实现批量服务器管理和自动化部署:

# 批量执行命令
for host in web{01..10}; do
    ssh "$host" "systemctl restart nginx"
done

# Ansible 通过 SSH 管理服务器集群
ansible all -m ping

业务场景: CI/CD 流水线中的自动部署、配置管理、健康检查。

场景五:Git 远程操作

Git 使用 SSH 进行认证和数据传输:

# 克隆仓库(SSH 协议)
git clone [email protected]:user/repo.git

# 配置 SSH 密钥用于 Git 认证
ssh-keygen -t ed25519 -C "[email protected]"

业务场景: 开发团队代码协作、CI/CD 系统拉取代码。

场景六:跳板机/堡垒机

通过中间服务器访问隔离网络中的主机:

# 通过跳板机连接内网服务器
ssh -J [email protected] [email protected]

业务场景: 企业安全合规要求、多层网络架构中的运维访问。


1.7 SSH 与其他远程协议对比

特性SSHTelnetRDPVNC
加密传输部分
跨平台❌ (主要 Windows)
带宽占用中~高
图形界面需 X11
端口转发
文件传输✅ (SFTP)剪贴板剪贴板
认证方式多种仅密码密码/证书密码
安全性极低低~中
适用系统Linux/macOS/Windows遗留系统Windows图形桌面

1.8 常见误解澄清

误解一:SSH 默认端口 22 很危险

事实: 端口本身不是安全问题。危险的是弱密码和错误配置。更改端口只是减少噪音日志,不能替代真正的安全措施。

误解二:SSH 密钥比密码更安全

事实: 密钥认证确实更安全,但前提是你妥善保管私钥。一个没有密码保护的私钥文件,如果泄露,比弱密码更危险。

误解三:SSH 是万能的安全方案

事实: SSH 只是安全体系的一部分。它保护传输层安全,但不解决应用层漏洞、权限管理、网络隔离等问题。

误解四:关闭 SSH 服务 = 服务器更安全

事实: 关闭 SSH 意味着你失去了远程管理能力。在云环境中,你可能完全无法访问服务器。安全的做法是正确配置 SSH,而非关闭它。


1.9 SSH 的安全边界

SSH 保护什么?

✅ SSH 保护的内容:
├── 传输中的数据(加密)
├── 用户身份(认证)
├── 数据完整性(防篡改)
└── 会话机密性(防窃听)

❌ SSH 不保护的内容:
├── 服务器本身(SSH 不是防火墙)
├── 私钥文件(需要你自己保护)
├── 应用层漏洞(SSH 不检查应用数据)
├── 已认证用户的行为(SSH 不做授权审计)
└── 物理安全(无法防止物理接触)

1.10 学习路径建议

初学者路线                    进阶路线
─────────────                ──────────
01. 简介 (你在这里)           06. sshd_config 深入
02. 安装配置                   07. 隧道与转发
03. 密钥与连接                 08. X11 / Agent 转发
04. 密钥认证                   09. SFTP 文件传输
05. 密码与 MFA                 10. 安全加固实战
                               11. 跳板机 / 堡垒机
                               12. 自动化运维
                               13. Docker 与 SSH
                               14. 故障排查
                               15. 最佳实践

扩展阅读


下一章: 第2章 安装与初始配置 → 学习在各平台上安装 OpenSSH 服务器并完成基础配置。