SSH密钥认证分步指南

通过这份全面的分步指南解锁卓越的远程访问安全性,了解 SSH 密钥认证。学习如何生成强大的 ED25519 密钥对,安全地分发您的公钥,以及最关键的是,禁用服务器上易受攻击的密码登录。本教程提供了可操作的命令和重要的最佳实践,包括密码短语使用和密钥管理,确保您的 SSH 连接既方便又高度安全。立即提升您服务器的防御能力,抵御暴力破解攻击。

35 浏览量

分步指南:安全设置基于 SSH 密钥的身份验证

安全外壳(SSH)是远程系统管理的核心,它允许通过不安全的网络安全地访问服务器。虽然基于密码的身份验证很常见,但它本质上容易受到暴力破解攻击和凭据填充攻击。基于 SSH 密钥的身份验证提供了一种更强大、更安全的替代方案,它利用加密密钥对来验证身份,而无需传输密码。

本指南将引导您完成设置安全基于 SSH 密钥身份验证的整个过程。您将学习如何生成 SSH 密钥对,安全地将公钥分发到远程服务器,以及最关键的是,通过禁用不安全的密码登录来强化服务器的 SSH 配置。遵循这些步骤,您将显著提升远程访问的安全性,使您的系统更能抵御常见的攻击向量。

理解基于 SSH 密钥的身份验证

基于 SSH 密钥的身份验证依赖于一对通过密码学关联的密钥:一个私钥和一个公钥

  • 私钥:此密钥必须保密并安全地存储在您的本地机器上。它就像一个只有您知道的高度复杂的密码。
  • 公钥:此密钥可以自由共享,并放置在您希望访问的远程服务器上。服务器使用它来验证您的身份。

当您尝试连接时,服务器会使用您的公钥来挑战您的本地机器。您的本地机器随后使用其私钥响应此挑战,从而在不通过网络发送私钥的情况下证明您的身份。这种方法不仅更安全,而且更方便,因为它在正确配置后,每次连接时都无需输入密码。

步骤 1:生成您的 SSH 密钥对

ssh-keygen 工具用于创建新的 SSH 密钥对。建议使用现代、强大的算法,例如 ED25519。

选择密钥类型和强度

虽然 RSA 密钥仍被广泛使用,但 ED25519 提供了出色的安全性,具有更短的密钥长度和更快的操作。对于新设置,通常首选 ED25519。

生成密钥对

在您的本地机器(客户端)上,打开终端并运行以下命令:

ssh-keygen -t ed25519 -C "[email protected]"
  • -t ed25519:将密钥类型指定为 ED25519。
  • -C "[email protected]":为公钥添加注释,通常用于标识。请替换为您的实际电子邮件或描述性标签。

该命令将提示您输入保存密钥的位置以及可选的密码短语。

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/youruser/.ssh/id_ed25519
Your public key has been saved in /home/youruser/.ssh/id_ed25519.pub
The key fingerprint is: SHA256:...
The key's randomart image is: ...

设置强密码短语(强烈推荐)

当系统提示时,务必为您的私钥设置一个强密码短语。此密码短语会在您的本地机器上加密您的私钥,提供额外的安全层。如果您的私钥落入坏人之手,没有密码短语它将毫无用处。您可以使用 ssh-agent 来避免重复输入密码短语(参见步骤 4)。

密钥文件位置

默认情况下,ssh-keygen 会将您的私钥保存到 ~/.ssh/id_ed25519,将您的公钥保存到 ~/.ssh/id_ed25519.pub

私钥的权限

您的私钥文件拥有非常严格的权限至关重要。只有所有者才能读取它。ssh-keygen 通常会正确设置此权限,但最好进行验证:

chmod 600 ~/.ssh/id_ed25519

步骤 2:将您的公钥分发到服务器

生成密钥对后,您的公钥需要复制到您希望访问的远程服务器上。它应该放在远程服务器上您的用户目录 ~/.ssh/ 中名为 authorized_keys 的文件中。

方法 1:使用 ssh-copy-id(推荐)

ssh-copy-id 是最简单和最安全的方法。它会登录到远程服务器(使用您的密码),如果 ~/.ssh 目录不存在则创建它,设置正确的权限,并将您的公钥附加到 ~/.ssh/authorized_keys 文件中。

ssh-copy-id user@your_server_ip

user 替换为远程服务器上的用户名,将 your_server_ip 替换为服务器的 IP 地址或主机名。系统会提示您输入远程服务器的密码。

方法 2:手动复制

如果 ssh-copy-id 不可用,您可以手动复制公钥。

  1. 从您的本地机器复制公钥内容:
    bash cat ~/.ssh/id_ed25519.pub
    将整个输出复制到剪贴板(它以 ssh-ed25519 ... 开头)。

  2. 使用密码登录到远程服务器:
    bash ssh user@your_server_ip

  3. 如果 ~/.ssh 目录不存在,则创建并设置权限:
    bash mkdir -p ~/.ssh chmod 700 ~/.ssh

  4. 将您的公钥附加到 authorized_keys
    bash echo "PASTE_YOUR_PUBLIC_KEY_HERE" >> ~/.ssh/authorized_keys
    请务必将 PASTE_YOUR_PUBLIC_KEY_HERE 替换为您复制的实际内容。 使用 >>(追加)很重要,可以避免覆盖任何现有的密钥。

  5. authorized_keys 设置正确的权限:
    bash chmod 600 ~/.ssh/authorized_keys

    • 警告~/.ssh~/.ssh/authorized_keys 上的权限不正确将导致基于密钥的身份验证无法工作。

步骤 3:测试您的 SSH 密钥身份验证

在禁用密码身份验证之前,验证基于密钥的身份验证是否正常工作至关重要。如果您仍通过手动复制步骤连接到远程服务器,请先注销。

从您的本地机器,尝试连接到服务器,不指定密码:

ssh user@your_server_ip
  • 如果您为私钥设置了密码短语,系统将提示您输入它。
  • 如果连接成功,且没有密码提示(如果适用,在输入密码短语后),则您的基于密钥的身份验证正在工作。您应该会看到远程服务器的提示符。

如果您无法使用 SSH 密钥登录,请勿继续进行步骤 4。 在禁用密码身份验证之前解决所有问题,否则您将面临将自己锁定在服务器之外的风险。

步骤 4:增强安全性 - 禁用密码身份验证

确认 SSH 密钥身份验证正常工作后,您可以在服务器上禁用基于密码的登录,以显著提高安全性。这可以防止针对您密码的暴力破解攻击,并确保只有拥有有效 SSH 密钥的人才能访问服务器。

  1. 使用您的 SSH 密钥登录到远程服务器。
    bash ssh user@your_server_ip

  2. 编辑 SSH 守护进程配置文件。 该文件通常位于 /etc/ssh/sshd_config
    bash sudo nano /etc/ssh/sshd_config
    (您可以使用 vi 或您喜欢的文本编辑器而不是 nano。)

  3. 找到并修改以下指令:

    • 找到 PasswordAuthentication 并将其值更改为 no
      #PasswordAuthentication yes PasswordAuthentication no
      (如果该行被 # 注释掉,请取消注释)

    • 找到 ChallengeResponseAuthentication 并将其值更改为 no
      #ChallengeResponseAuthentication yes ChallengeResponseAuthentication no

    • (可选但推荐)如果您计划以普通用户身份登录后使用 sudo,请考虑直接通过 SSH 禁用 root 登录。
      PermitRootLogin no

    • (可选)考虑将默认 SSH 端口从 22 更改为非标准的高端口(例如,2222)。这并不能增加抵御针对性攻击的安全性,但可以减少来自自动化端口扫描器的干扰。
      #Port 22 Port 2222
      如果您更改了端口,请记住在连接时使用 -p 标志指定它(例如,ssh -p 2222 user@your_server_ip)。

  4. 保存更改并退出文本编辑器。

  5. 重启 SSH 服务以应用新配置。 该命令因您的操作系统而异(例如,Ubuntu/Debian 与 CentOS/RHEL)。

    • 基于 Systemd 的系统(大多数现代 Linux 发行版):
      bash sudo systemctl restart sshd

    • 较旧的基于 SysVinit 的系统:
      bash sudo service ssh restart

  6. 至关重要的是,打开一个的终端窗口(不要关闭您当前活动的 SSH 会话!)并尝试使用您的密钥登录。 这将在不将自己锁定的情况下测试新配置,以防出现问题。

    bash ssh user@your_server_ip
    如果您更改了端口:
    bash ssh -p 2222 user@your_server_ip

    如果连接成功,您现在可以安全地关闭原始 SSH 会话。

    如果新登录失败,请立即在您原始的、仍然活动的 SSH 会话中撤销 sshd_config 中的更改并再次重启 SSH 服务,然后重新评估。

最佳实践和提示

  • 始终为您的私钥使用强密码短语。 这是您的私钥被泄露时的最后一道防线。
  • 保护您的私钥。 切勿共享它,并确保它以严格的文件权限 (chmod 600 ~/.ssh/id_ed25519) 安全存储。考虑使用硬件安全模块(HSM)或 YubiKey 进行终极保护。
  • 使用 ssh-agent 以提高便利性。 ssh-agent 允许您将私钥加载到内存中,每个会话只需输入一次密码短语,即使跨多个 SSH 连接也是如此。使用 ssh-add ~/.ssh/id_ed25519 将您的密钥添加到代理。
  • 定期轮换您的 SSH 密钥。 定期生成新的密钥对,并从服务器中删除旧的公钥,特别是当团队成员离职或密钥安全性被怀疑遭到泄露时。
  • PermitRootLogin 限制为 noprohibit-password 通常最好以普通用户身份登录,并使用 sudo 执行管理任务。
  • 配置防火墙。 确保只有必要的端口(如您的 SSH 端口)对互联网开放。ufwfirewalld 等工具可以提供帮助。

总结

通过遵循本分步指南,您已成功为您的远程服务器设置并保护了基于 SSH 密钥的身份验证。您生成了一个强大的加密密钥对,分发了您的公钥,最重要的是,禁用了不安全的基于密码的登录。这显著增强了服务器的安全性,使其更能抵抗常见的黑客攻击。请始终牢记谨慎保护您的私钥及其密码短语,因为它现在是访问服务器的主要凭据。遵循这些最佳实践,为您的所有远程访问需求保持强大的安全态势。