2.6.1 SSH工作原理与认证方式

SSH(Secure Shell)通过在不可信网络上建立加密通道,实现远程登录、命令执行与文件传输。核心是客户端-服务器模型与加密协议协商,保证机密性、完整性与身份认证。

原理草图(流程与认证位置)

文章图片

工作流程概览
1. 协议协商:客户端连接后交换版本与算法列表(KEX、加密、MAC、压缩)。
2. 密钥交换:使用DH/ECDH生成对称会话密钥。
3. 服务器认证:客户端校验服务器主机密钥(known_hosts)。
4. 用户认证:密码、公钥或多因素。
5. 会话建立:创建加密通道,开启Shell/SFTP/端口转发。

SSH认证方式与要点
- 密码认证:依赖PAM或本地账户,易被暴力破解。
- 公钥认证:客户端私钥签名,服务器验证authorized_keys
- 主机认证:校验服务器指纹,防中间人攻击。
- GSSAPI/LDAP/Kerberos:企业统一认证。
- MFA:结合OTP/硬件令牌提升安全。

关键概念
- 主机密钥:服务器身份标识,首次连接写入~/.ssh/known_hosts
- 会话密钥:每次连接动态生成。
- authorized_keys:服务器端信任公钥列表。
- ssh-agent:管理私钥,避免私钥落地。


安装与基础验证(示例)#

安装 OpenSSH 服务器

# Debian/Ubuntu
sudo apt update
sudo apt install -y openssh-server

# RHEL/CentOS/Alma/Rocky
sudo yum install -y openssh-server
sudo systemctl enable --now sshd

验证服务状态与端口

sudo systemctl status sshd
sudo ss -lntp | grep sshd
# 预期:LISTEN 0 128 0.0.0.0:22 ... sshd

认证方式示例(含命令说明)#

1) 密码认证(客户端连接)#

ssh user@192.168.10.10
# 说明:使用密码方式登录,默认端口22

2) 公钥认证(完整流程)#

客户端生成密钥

ssh-keygen -t ed25519 -C "ops@laptop"
# 说明:生成~/.ssh/id_ed25519(私钥)与id_ed25519.pub(公钥)

上传公钥到服务器

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.10.10
# 说明:将公钥写入服务器~/.ssh/authorized_keys

测试免密登录

ssh -i ~/.ssh/id_ed25519 user@192.168.10.10
# 说明:指定私钥进行认证

3) 服务器主机密钥校验(防中间人)#

ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
# 说明:输出服务器主机公钥指纹

客户端首次连接提示指纹时核对一致性。


关键命令解释(常用)#

ssh -p 2222 user@host
# 指定端口

ssh -o PreferredAuthentications=publickey user@host
# 强制使用公钥认证

ssh -v user@host
# 开启调试输出,用于排错

常见算法查看示例#

ssh -Q kex
ssh -Q cipher
ssh -Q mac
# 说明:查看本地客户端支持的算法列表

排错示例(最小可复现)#

问题1:连接被拒绝(Connection refused)

# 检查服务是否启动
sudo systemctl status sshd

# 检查端口监听
sudo ss -lntp | grep sshd

# 检查防火墙
sudo firewall-cmd --list-ports
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --reload

问题2:公钥认证失败

# 服务端权限修正
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# 服务端查看日志
sudo journalctl -u sshd -n 50

问题3:主机密钥变更导致警告

# 删除旧指纹
ssh-keygen -R 192.168.10.10
# 重新连接并核对新指纹

练习(动手操作)#

  1. 在两台主机上完成OpenSSH安装并确认端口22监听。
  2. 使用ssh-keygen生成Ed25519密钥并完成免密登录。
  3. 使用ssh -v连接并从输出中找出“KEX”和“Authentication”步骤。
  4. 人为修改authorized_keys权限为644,观察并记录登录失败原因。
  5. 使用ssh-keygen -lf核对服务器主机密钥指纹,写下指纹值。