新
| | |
SSH 密钥安全登录设置指南
第一步:在您的本地电脑上生成密钥对
这一步是在您的个人电脑(客户端)上操作,用于创建一对“钥匙”(私钥)和“锁”(公钥)。
- 打开您本地电脑的终端(Terminal)。
- 执行以下命令生成密钥。推荐使用
ed25519算法,它更现代、更安全。# 将 your_email@example.com 替换为您的邮箱或任何标识符 ssh-keygen -t ed25519 -C "your_email@example.com" - 在随后的提示中:
- 保存位置: 直接按回车键 (Enter) 接受默认路径 (
~/.ssh/id_ed25519)。 - 设置密码短语 (Passphrase): 强烈建议设置一个密码。这相当于给您的“钥匙”上了一个保险,即使私钥文件泄露,没有这个密码也无法使用。
操作完成后,您的~/.ssh/目录下会生成两个文件:id_ed25519: 私钥,必须妥善保管,绝不能泄露。id_ed25519.pub: 公钥,可以安全地分享和部署到服务器上。
- 保存位置: 直接按回车键 (Enter) 接受默认路径 (
第二步:将公钥部署到服务器
这一步是将您的“锁”安装到您想登录的服务器上。
推荐方法:使用 ssh-copy-id 命令
这是最简单、最不容易出错的方法。在您的本地电脑终端中执行:
# 需要创建账号
adduser user
passwd user
# 将 user 替换为服务器用户名,your_server_ip 替换为服务器IP
ssh-copy-id user@your_server_ip
根据提示输入一次服务器密码,该命令会自动完成以下所有操作:
- 在服务器上创建
~/.ssh目录和authorized_keys文件。 - 将您的公钥内容追加到
authorized_keys文件末尾。 - 设置正确的目录和文件权限。
备用方法:手动复制
如果您的电脑没有 ssh-copy-id,可以手动操作:
- 在本地电脑上,复制公钥内容到剪贴板:
# macOS pbcopy < ~/.ssh/id_ed25519.pub # Linux (需要 xclip) # xclip -selection clipboard < ~/.ssh/id_ed25519.pub - 通过密码登录到您的服务器。
- 在服务器上执行以下命令,将公钥粘贴进去:
# 确保目录存在并设置权限 mkdir -p ~/.ssh && chmod 700 ~/.ssh # 将公钥追加到文件,并设置权限 echo "在此处粘贴您复制的公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
第三步:测试密钥登录
在本地电脑上再次尝试登录服务器:
ssh user@your_server_ip
如果一切正常,系统会提示您输入密钥的密码短语(如果您设置了),或者直接登录成功,而不再需要服务器密码。
第四步:安全加固(禁用密码登录)
在确认密钥登录完全可用后,执行此步以关闭密码登录通道,实现最高安全性。
- 登录到您的服务器。
- 编辑 SSH 服务的配置文件:
sudo nano /etc/ssh/sshd_config # 或者使用 vim: sudo vim /etc/ssh/sshd_config - 找到并修改以下配置项(如果行首有
#,请删除):# 禁用密码登录 PasswordAuthentication no # 推荐:禁止 root 用户直接登录 PermitRootLogin no # 确保公钥认证是开启的 PubkeyAuthentication yes - 保存文件并重启 SSH 服务使配置生效:
sudo systemctl restart sshd
至此,您的服务器已配置为仅接受 SSH 密钥登录,安全性得到了极大提升。
附录:自动化安全加固脚本
以下脚本可以自动完成“第四步:安全加固”中的所有操作。
警告:在运行此脚本之前,请务必、务必、务必确认您已经可以通过 SSH 密钥成功登录服务器!否则您将被锁在服务器之外!
您可以将以下内容保存为一个 shell 脚本文件(例如 secure_ssh.sh),赋予执行权限 (chmod +x secure_ssh.sh),然后以 root 权限运行 (sudo ./secure_ssh.sh)。
#!/bin/bash
#
# SSH 安全加固自动化脚本
#
# 功能:
# 1. 禁用密码登录 (PasswordAuthentication no)
# 2. 禁止 root 用户远程登录 (PermitRootLogin no)
# 3. 确保公钥登录是开启的 (PubkeyAuthentication yes)
# 4. 重启 SSH 服务使配置生效
#
# 检查是否以 root 权限运行
if [ "$EUID" -ne 0 ]; then
echo "❌ 错误:请以 root 权限运行此脚本。"
exit 1
fi
# 最终警告和倒计时
echo "================================================================="
echo "⚠️ 警告:此脚本将禁用 SSH 密码登录并禁止 root 远程登录!"
echo "请再次确认您已配置好 SSH 密钥,并且可以通过密钥成功登录。"
echo "================================================================="
echo "操作将在 5 秒后开始,按 Ctrl+C 可立即取消..."
sleep 5
echo "开始执行安全加固..."
SSHD_CONFIG="/etc/ssh/sshd_config"
# 创建配置文件的备份,以防万一
cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak_$(date +%F)"
echo "✅ 配置文件已备份至 ${SSHD_CONFIG}.bak_$(date +%F)"
# 使用 sed 命令修改配置
# 不论原始配置是 yes, no 还是被注释,都统一修改
sed -i -r 's/^#?PasswordAuthentication\s+.*/PasswordAuthentication no/' "$SSHD_CONFIG"
sed -i -r 's/^#?PermitRootLogin\s+.*/PermitRootLogin no/' "$SSHD_CONFIG" # 这里我用的密钥主要用 root 登录
sed -i -r 's/^#?PubkeyAuthentication\s+.*/PubkeyAuthentication yes/' "$SSHD_CONFIG"
echo "✅ sshd_config 文件已更新。"
echo " - PasswordAuthentication 设置为 no"
echo " - PermitRootLogin 设置为 no"
echo " - PubkeyAuthentication 设置为 yes"
# 重启 SSH 服务以应用新配置
echo "正在重启 SSH 服务..."
systemctl restart sshd
# 检查服务状态
if systemctl is-active --quiet sshd; then
echo "✅ SSH 服务已成功重启,新配置已生效!"
else
echo "❌ 错误:SSH 服务重启失败!请使用 'systemctl status sshd' 命令检查问题。"
echo "您可以通过备份文件 ${SSHD_CONFIG}.bak_$(date +%F) 进行恢复。"
fi