如何处理未知的 SSH 主机

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在 Linux 网络环境中,处理未知的 SSH 主机是一项关键的安全措施,有助于保护系统免受潜在的未经授权的访问。本教程提供了关于理解 SSH 主机密钥验证的全面指导,使系统管理员和开发人员能够在维护强大的网络安全协议的同时,建立安全可靠的远程连接。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/RemoteAccessandNetworkingGroup(["Remote Access and Networking"]) linux(("Linux")) -.-> linux/PackagesandSoftwaresGroup(["Packages and Softwares"]) linux/RemoteAccessandNetworkingGroup -.-> linux/ssh("Secure Connecting") linux/RemoteAccessandNetworkingGroup -.-> linux/telnet("Network Connecting") linux/RemoteAccessandNetworkingGroup -.-> linux/scp("Secure Copying") linux/RemoteAccessandNetworkingGroup -.-> linux/sftp("Secure File Transferring") linux/RemoteAccessandNetworkingGroup -.-> linux/nc("Networking Utility") linux/PackagesandSoftwaresGroup -.-> linux/openssl("OpenSSL") subgraph Lab Skills linux/ssh -.-> lab-431304{{"如何处理未知的 SSH 主机"}} linux/telnet -.-> lab-431304{{"如何处理未知的 SSH 主机"}} linux/scp -.-> lab-431304{{"如何处理未知的 SSH 主机"}} linux/sftp -.-> lab-431304{{"如何处理未知的 SSH 主机"}} linux/nc -.-> lab-431304{{"如何处理未知的 SSH 主机"}} linux/openssl -.-> lab-431304{{"如何处理未知的 SSH 主机"}} end

SSH 主机密钥基础

什么是 SSH 主机密钥?

SSH 主机密钥是一种加密密钥,用于在连接建立期间识别和认证 SSH 服务器。当你首次连接到远程 SSH 服务器时,服务器会呈现其唯一的主机密钥以验证其身份,并防止潜在的中间人攻击。

SSH 主机密钥机制

graph TD A[客户端] -->|首次连接| B{主机密钥验证} B -->|未知主机| C[提示用户进行验证] B -->|已知主机| D[建立安全连接] C -->|接受| E[存储主机密钥] C -->|拒绝| F[终止连接]

SSH 主机密钥类型

密钥类型 描述 长度
RSA 最常见的密钥类型 2048 - 4096 位
ED25519 现代、紧凑的密钥 256 位
ECDSA 椭圆曲线密码学 256 - 521 位

查看 SSH 主机密钥

要在 Ubuntu 系统上查看 SSH 主机密钥,你可以使用以下命令:

sudo ls /etc/ssh/ssh_host_*_key.pub

此命令将显示系统上存储的所有公共主机密钥文件。

密钥位置和存储

SSH 主机密钥通常存储在 /etc/ssh/ 目录中,文件名如下:

  • ssh_host_rsa_key
  • ssh_host_ed25519_key
  • ssh_host_ecdsa_key

安全注意事项

  1. 连接到新服务器时始终验证主机密钥
  2. 使用 ED25519 等强大的现代密钥类型
  3. 定期更新和轮换 SSH 主机密钥

通过了解 SSH 主机密钥,用户可以在其 Linux 环境中建立安全可信的连接。LabEx 建议在可控的学习环境中实践这些概念。

未知主机验证

理解未知主机场景

当连接到新的 SSH 服务器时,你会遇到未知主机密钥验证过程。此机制可保护你免受诸如中间人攻击等潜在安全风险。

SSH 连接工作流程

graph TD A[SSH 连接尝试] --> B{主机密钥已知?} B -->|否| C[提示用户] B -->|是| D[验证密钥指纹] C --> E[显示主机密钥指纹] E --> F[用户决策] F -->|接受| G[添加到已知主机] F -->|拒绝| H[终止连接]

处理未知主机

交互式验证

连接到新主机时,SSH 会显示如下消息:

The authenticity of host 'example.com (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

验证选项

操作 命令 描述
临时接受 yes 连接一次但不保存
永久接受 yes 将主机密钥保存到 ~/.ssh/known_hosts
拒绝 no 终止连接

编程式验证

你可以使用 SSH 选项自动执行主机密钥验证:

## 自动接受未知主机(谨慎使用)
ssh -o StrictHostKeyChecking=no user@hostname

## 自动添加未知主机
ssh -o StrictHostKeyChecking=accept-new user@hostname

最佳实践

  1. 始终先手动验证主机密钥指纹
  2. 使用带外方法确认密钥真实性
  3. 小心意外的主机密钥更改

高级验证技术

检查已知主机

## 列出已知主机
ssh-keygen -l -f ~/.ssh/known_hosts

## 删除特定主机条目
ssh-keygen -R hostname

LabEx 建议在可控环境中实践这些验证技术,以了解 SSH 主机密钥管理的细微差别。

安全的 SSH 连接

SSH 安全基础

确保 SSH 连接安全对于保护网络通信和防止未经授权的访问至关重要。

连接安全工作流程

graph TD A[SSH 连接尝试] --> B[认证] B --> C{基于密钥或密码} C -->|基于密钥| D[公钥/私钥验证] C -->|密码| E[凭证验证] D --> F[加密协商] E --> F F --> G[安全通道建立]

认证方法

方法 安全级别 配置
密码 简单,安全性较低
SSH 密钥对 推荐,需要密钥管理
双因素认证 最高 高级,多步验证

实施安全的 SSH 配置

基于密钥的认证

生成 SSH 密钥对:

ssh-keygen -t ed25519 -C "[email protected]"

将公钥复制到远程服务器:

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname

SSH 配置强化

编辑 /etc/ssh/sshd_config

## 禁用 root 登录
PermitRootLogin no

## 限制认证尝试次数
MaxAuthTries 3

## 使用强大的密钥交换算法
KexAlgorithms [email protected]

## 启用严格模式
StrictModes yes

高级安全技术

防火墙配置

## 通过 UFW 允许 SSH
sudo ufw allow ssh

## 限制 SSH 连接
sudo ufw limit ssh

端口转发和隧道

## 本地端口转发
ssh -L local_port:destination_host:destination_port user@ssh_server

## 动态 SOCKS 代理
ssh -D local_port user@ssh_server

监控和日志记录

## 查看 SSH 登录尝试
sudo tail -f /var/log/auth.log

## 检查当前 SSH 会话
who

安全最佳实践

  1. 使用基于密钥的认证
  2. 实施强密码策略
  3. 定期更新 SSH 软件
  4. 监控和记录访问尝试

LabEx 建议在可控环境中持续学习和实践这些安全技术,以掌握 SSH 连接安全。

总结

对于寻求维护安全远程连接的 Linux 系统管理员而言,掌握 SSH 主机密钥验证至关重要。通过理解主机密钥验证机制、实施谨慎的认证策略以及对潜在安全风险保持警惕,专业人员能够有效地管理未知的 SSH 主机,并保护其网络基础设施免受潜在威胁。