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