如何生成和保护用于远程访问的 SSH 密钥
掌握安全远程访问:学习使用 `ssh-keygen` 生成健壮的 SSH 密钥对。本指南涵盖了选择密钥类型 (Ed25519)、使用密码短语保护私钥、使用 `ssh-copy-id` 高效部署公钥,以及利用 `ssh-agent` 实现无缝认证的最佳实践。通过实施基于密钥的访问控制,确保您的基础设施免受暴力破解攻击。
如何生成并保护用于远程访问的SSH密钥
安全外壳(SSH)是连接远程服务器的标准方式。如果您仍在使用密码进行日常访问,SSH密钥能提供更强的身份验证,并消除针对该账户的密码猜测风险。
本指南将向您展示如何生成SSH密钥、使用密码保护私钥、在服务器上安装公钥,以及使用 ssh-agent 避免每次连接都输入密码。
理解SSH密钥对
SSH密钥对由两个不同的部分组成:
- 私钥: 此密钥绝不能共享。它安全地保存在您的本地机器上,用于向远程服务器证明您的身份。
- 公钥: 此密钥可以自由共享,并上传到您希望访问的远程服务器的
~/.ssh/authorized_keys文件中。服务器使用此密钥来验证由您的私钥生成的签名。
选择合适的算法
生成密钥时,请选择现代算法。Ed25519 是当前OpenSSH客户端的一个良好默认选择,因为它速度快、体积小且被广泛支持。RSA仍然有效,并且在您需要连接到不支持Ed25519的旧系统时非常有用。
第一步:生成SSH密钥对
ssh-keygen 工具是在Linux、macOS和Windows(通过Git Bash或WSL)上创建SSH密钥对的标准工具。
生成Ed25519密钥(推荐)
要创建现代的Ed25519密钥,请使用以下命令。我们指定密钥类型(-t ed25519)并提供注释(-C)以帮助识别密钥的用途或所有者:
ssh-keygen -t ed25519 -C "[email protected]_or_host_name"
当提示时:
- 输入保存密钥的文件: 按Enter接受默认位置(
/home/user/.ssh/id_ed25519)。 - 输入密码(推荐): 为用于非一次性实验室系统的密钥设置一个强密码。这将加密您的私钥,因此即使密钥文件被盗也无法立即使用。
生成RSA密钥(备选)
如果需要与非常旧的系统兼容,您可以生成RSA密钥,确保指定足够的密钥长度(至少4096位):
ssh-keygen -t rsa -b 4096 -C "your_rsa_key_comment"
密钥输出文件
生成后,您的 ~/.ssh/ 目录中会创建两个文件(假设使用默认设置):
id_ed25519(或id_rsa):您的私钥id_ed25519.pub(或id_rsa.pub):您的公钥
安全最佳实践: 切勿共享不带
.pub扩展名的文件。使用chmod 600 ~/.ssh/id_ed25519为您的私钥设置严格的权限。
第二步:将公钥复制到服务器
远程服务器必须将您的公钥放入其 ~/.ssh/authorized_keys 文件中才能授予访问权限。
使用 ssh-copy-id(最简单的方法)
ssh-copy-id 工具可以自动化此过程,处理远程服务器上的目录创建和权限设置。您需要最后一次使用密码进行身份验证以完成初始设置。
ssh-copy-id user@remote_host_ip
如果成功,该命令将通知您密钥已添加。您现在可以尝试登录。
手动复制(如果 ssh-copy-id 不可用)
如果您无法使用 ssh-copy-id,可以手动追加公钥内容。首先,显示公钥:
cat ~/.ssh/id_ed25519.pub
然后,使用密码登录到远程服务器,并将输出追加到 authorized_keys 文件中:
# 在远程服务器上
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 将 <PASTE_YOUR_PUBLIC_KEY_HERE> 替换为实际的密钥内容
echo "<PASTE_YOUR_PUBLIC_KEY_HERE>" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
第三步:使用 ssh-agent 保护访问
每次连接到服务器时都输入密码会变得很繁琐。ssh-agent 是一个后台程序,可以安全地将您解密的私钥保存在内存中,使您无需重复输入密码即可使用它们。
启动并使用 ssh-agent
确保代理正在运行: 在大多数现代Linux/macOS系统上,代理会在您登录时自动启动。您可以通过查找环境变量来检查其状态:
echo $SSH_AUTH_SOCK将密钥添加到代理: 使用
ssh-add命令加载您的私钥。系统会提示您输入密码仅一次。ssh-add ~/.ssh/id_ed25519 # Enter passphrase for /home/user/.ssh/id_ed25519: ********** # Identity added: /home/user/.ssh/id_ed25519 (comment)验证已加载的密钥:
ssh-add -l
现在,当您运行 ssh user@remote_host_ip 时,连接将使用代理持有的密钥进行身份验证,而无需再次询问密码(直到代理会话结束)。
重要的 ssh-agent 说明
- 会话依赖: 加载到代理中的密钥通常仅对当前终端会话或桌面登录会话可用。注销并重新登录后,您需要重新运行
ssh-add。 - 密钥有效期: 您可以使用
-t标志为代理中持有的密钥设置最大有效期(例如,ssh-add -t 1h ~/.ssh/id_ed25519将密钥加载一小时)。
高级安全:禁用密码认证
一旦确认基于密钥的身份验证在所有必需的服务器上完美运行,最强大的安全措施就是完全禁用基于密码的登录。这可以防止针对密码的暴力破解攻击。
使用您的密钥通过SSH连接到服务器。
编辑SSH守护进程配置文件,通常位于
/etc/ssh/sshd_config:sudo nano /etc/ssh/sshd_config找到并设置以下指令:
# 确保此项设置为yes(通常为默认值) PubkeyAuthentication yes # 禁用密码登录 PasswordAuthentication no在重启前检查配置:
sudo sshd -t重启SSH服务以应用更改。服务名称在RHEL系列系统上通常为
sshd,在Debian/Ubuntu上为ssh:sudo systemctl restart sshd # 或 sudo systemctl restart ssh
警告: 在禁用密码认证之前,请保持一个有效的SSH会话打开,并确认使用新密钥的第二次登录正常工作。如果重启失败或密钥错误,您将需要控制台或带外访问。
后续步骤
在第一次基于密钥的登录成功后,请像对待生产凭证一样对待SSH密钥:
- 为您访问的每个主要系统或服务生成唯一的密钥对。
- 定期审计关键服务器上的
authorized_keys文件。 - 当人员更换角色或机器退役时,移除旧密钥。
- 在共享工作站上使用
ssh-add -t进行短期的代理会话。