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
# 重新连接并核对新指纹
练习(动手操作)#
- 在两台主机上完成OpenSSH安装并确认端口22监听。
- 使用
ssh-keygen生成Ed25519密钥并完成免密登录。 - 使用
ssh -v连接并从输出中找出“KEX”和“Authentication”步骤。 - 人为修改
authorized_keys权限为644,观察并记录登录失败原因。 - 使用
ssh-keygen -lf核对服务器主机密钥指纹,写下指纹值。