分步指南:安全设置基于 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 不可用,您可以手动复制公钥。
-
从您的本地机器复制公钥内容:
bash cat ~/.ssh/id_ed25519.pub
将整个输出复制到剪贴板(它以ssh-ed25519 ...开头)。 -
使用密码登录到远程服务器:
bash ssh user@your_server_ip -
如果
~/.ssh目录不存在,则创建并设置权限:
bash mkdir -p ~/.ssh chmod 700 ~/.ssh -
将您的公钥附加到
authorized_keys:
bash echo "PASTE_YOUR_PUBLIC_KEY_HERE" >> ~/.ssh/authorized_keys
请务必将PASTE_YOUR_PUBLIC_KEY_HERE替换为您复制的实际内容。 使用>>(追加)很重要,可以避免覆盖任何现有的密钥。 -
为
authorized_keys设置正确的权限:
bash chmod 600 ~/.ssh/authorized_keys- 警告:
~/.ssh或~/.ssh/authorized_keys上的权限不正确将导致基于密钥的身份验证无法工作。
- 警告:
步骤 3:测试您的 SSH 密钥身份验证
在禁用密码身份验证之前,验证基于密钥的身份验证是否正常工作至关重要。如果您仍通过手动复制步骤连接到远程服务器,请先注销。
从您的本地机器,尝试连接到服务器,不指定密码:
ssh user@your_server_ip
- 如果您为私钥设置了密码短语,系统将提示您输入它。
- 如果连接成功,且没有密码提示(如果适用,在输入密码短语后),则您的基于密钥的身份验证正在工作。您应该会看到远程服务器的提示符。
如果您无法使用 SSH 密钥登录,请勿继续进行步骤 4。 在禁用密码身份验证之前解决所有问题,否则您将面临将自己锁定在服务器之外的风险。
步骤 4:增强安全性 - 禁用密码身份验证
确认 SSH 密钥身份验证正常工作后,您可以在服务器上禁用基于密码的登录,以显著提高安全性。这可以防止针对您密码的暴力破解攻击,并确保只有拥有有效 SSH 密钥的人才能访问服务器。
-
使用您的 SSH 密钥登录到远程服务器。
bash ssh user@your_server_ip -
编辑 SSH 守护进程配置文件。 该文件通常位于
/etc/ssh/sshd_config。
bash sudo nano /etc/ssh/sshd_config
(您可以使用vi或您喜欢的文本编辑器而不是nano。) -
找到并修改以下指令:
-
找到
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)。
-
-
保存更改并退出文本编辑器。
-
重启 SSH 服务以应用新配置。 该命令因您的操作系统而异(例如,Ubuntu/Debian 与 CentOS/RHEL)。
-
基于 Systemd 的系统(大多数现代 Linux 发行版):
bash sudo systemctl restart sshd -
较旧的基于 SysVinit 的系统:
bash sudo service ssh restart
-
-
至关重要的是,打开一个新的终端窗口(不要关闭您当前活动的 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限制为no或prohibit-password。 通常最好以普通用户身份登录,并使用sudo执行管理任务。 - 配置防火墙。 确保只有必要的端口(如您的 SSH 端口)对互联网开放。
ufw或firewalld等工具可以提供帮助。
总结
通过遵循本分步指南,您已成功为您的远程服务器设置并保护了基于 SSH 密钥的身份验证。您生成了一个强大的加密密钥对,分发了您的公钥,最重要的是,禁用了不安全的基于密码的登录。这显著增强了服务器的安全性,使其更能抵抗常见的黑客攻击。请始终牢记谨慎保护您的私钥及其密码短语,因为它现在是访问服务器的主要凭据。遵循这些最佳实践,为您的所有远程访问需求保持强大的安全态势。