安全SSH密钥认证设置分步指南

使用ED25519密钥、authorized_keys、ssh-agent和更安全的sshd设置来配置安全的SSH密钥认证。

安全SSH密钥认证设置分步指南

SSH密钥认证可以保护您的服务器免受许多基于密码的攻击,但前提是您必须仔细生成密钥、正确安装公钥,并在更改服务器设置之前测试访问权限。

本指南将引导您完成ED25519密钥生成、公钥安装、登录测试以及更安全的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. 从本地机器复制公钥内容:

    cat ~/.ssh/id_ed25519.pub
    

    将整个输出复制到剪贴板(它以ssh-ed25519 ...开头)。

  2. 使用密码登录远程服务器:

    ssh user@your_server_ip
    
  3. 创建~/.ssh目录(如果不存在)并设置权限:

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
  4. 将您的公钥附加到authorized_keys

    echo "PASTE_YOUR_PUBLIC_KEY_HERE" >> ~/.ssh/authorized_keys
    

    确保将PASTE_YOUR_PUBLIC_KEY_HERE替换为您复制的实际内容。 使用>>(追加)很重要,以避免覆盖现有密钥(如果有)。

  5. authorized_keys设置正确的权限:

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

步骤3:测试您的SSH密钥认证

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

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

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

如果您无法使用SSH密钥登录,请不要继续执行步骤4。 在禁用密码认证之前解决问题,否则您可能会将自己锁在服务器之外。

步骤4:增强安全性 - 禁用密码认证

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

  1. 使用您的SSH密钥登录远程服务器。

    ssh user@your_server_ip
    
  2. 编辑SSH守护进程配置文件。 该文件通常位于/etc/ssh/sshd_config

    sudo nano /etc/ssh/sshd_config
    

    (您可以使用vi或您喜欢的文本编辑器代替nano。)

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

    • 找到PasswordAuthentication并将其值更改为no

      #PasswordAuthentication yes
      PasswordAuthentication no
      

      (如果该行被#注释掉,请取消注释)

    • 找到KbdInteractiveAuthentication并将其值更改为no。在较旧的OpenSSH版本中,等效指令可能是ChallengeResponseAuthentication

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

      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发行版):

      sudo sshd -t
      sudo systemctl restart sshd
      
    • 较旧的SysVinit系统:

      sudo service ssh restart
      
  6. 关键是,打开一个的终端窗口(不要关闭您当前活动的SSH会话!)并尝试使用您的密钥登录。 这测试新配置,而不会在出现问题时将自己锁在外面。

    ssh user@your_server_ip
    

    如果您更改了端口:

    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等工具可以提供帮助。

最终要点

您的私钥现在是您的主要登录凭据,因此请使用密码短语和严格的文件权限保护它。在更改sshd_config时保持一个经过测试的SSH会话打开,使用sshd -t验证配置,并且只有在新的基于密钥的登录正常工作后才关闭旧会话。