【原理】SSH协议原理深度解析:安全远程登录的机制

阿里云推广

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安全的基础。

发表评论