SSH协议原理深度解析
SSH是服务器管理的标配工具。理解其工作原理,有助于更好地配置和使用SSH。
一、SSH vs Telnet
【Telnet】(已淘汰) 明文传输 → 密码和数据可被截获 无身份验证 → 容易遭受中间人攻击 端口:23 【SSH】(Secure Shell) 加密传输 → 数据安全 身份验证 → 防止中间人攻击 端口:22
二、SSH连接建立过程
客户端 服务器 | | |-------- TCP连接建立(端口22) --------->| | | |<------- 服务器发送公钥指纹 ------------| | | | 客户端验证指纹(首次连接提示) | | | |-------- 密钥交换(Diffie-Hellman) ---->| |<---------------------------------------| | 双方协商出会话密钥(对称加密) | | | |======== 加密通道建立 ===================| | | |-------- 用户认证(密码/密钥) --------->| |<------- 认证成功,分配Shell ------------| | | |======== 交互会话 =====================|
三、密钥认证原理
【密钥对生成】 ssh-keygen -t rsa -b 4096 生成的文件: ~/.ssh/id_rsa # 私钥(保密!) ~/.ssh/id_rsa.pub # 公钥(可以分发) 【认证过程】 1. 客户端发送公钥指纹给服务器 2. 服务器检查 ~/.ssh/authorized_keys 3. 如果匹配,服务器用公钥加密一个随机数发送给客户端 4. 客户端用私钥解密,证明拥有私钥 5. 认证成功 【为什么安全?】 - 私钥从不离开客户端 - 即使公钥泄露,没有私钥也无法登录 - 每次认证使用不同的随机数,防止重放攻击
四、SSH配置优化
# /etc/ssh/sshd_config # 1. 禁用root登录 PermitRootLogin no # 2. 禁用密码认证(只用密钥) PasswordAuthentication no PubkeyAuthentication yes # 3. 修改默认端口(减少扫描) Port 2222 # 4. 限制允许用户 AllowUsers user1 user2 # 5. 空闲超时 ClientAliveInterval 300 ClientAliveCountMax 2 # 6. 禁用空密码 PermitEmptyPasswords no # 7. 限制认证尝试 MaxAuthTries 3 # 重启生效 systemctl restart sshd
五、SSH隧道(端口转发)
# 本地转发(访问远程内网服务) # 场景:通过跳板机访问内网数据库 ssh -L 3306:db.internal:3306 user@bastion # 然后本地连接 localhost:3306 就是连接远程数据库 # 远程转发(让远程访问本地服务) ssh -R 8080:localhost:3000 user@remote # 远程服务器访问 localhost:8080 就是访问本地的3000端口 # 动态转发(SOCKS代理) ssh -D 1080 user@remote # 配置浏览器使用SOCKS5代理 localhost:1080
六、SSH Agent转发
# 场景:A → B → C,需要在B上继续用密钥连接C
# 方式1:Agent转发(推荐)
ssh -A user@B
# 然后在B上可以直接用本地密钥连接C
# 方式2:ProxyJump(更简单)
ssh -J user@B user@C
# 直接跳到C,B只是跳板
# 在~/.ssh/config中配置
Host C
HostName c.internal
User user
ProxyJump B
七、SSH安全审计
# 查看登录记录 last lastb # 失败的登录 # 查看当前登录用户 who w # 查看SSH日志 grep sshd /var/log/auth.log grep "Accepted" /var/log/auth.log grep "Failed" /var/log/auth.log # 检查authorized_keys cat ~/.ssh/authorized_keys # 确保没有陌生公钥
八、免密登录配置
# 1. 生成密钥对(如果还没有)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 2. 复制公钥到服务器
ssh-copy-id user@server
# 等价于:
# cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 3. 配置SSH别名
# ~/.ssh/config
Host myserver
HostName 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
# 4. 现在可以简单连接
ssh myserver
总结
SSH的核心是加密+认证。使用密钥认证、禁用密码登录、合理配置安全选项,是SSH安全的基础。
