GO在线工具集
首页
搜索
插件
致Boss

ssh免密登录
3  |   |   |  0

SSH 密钥安全登录设置指南

第一步:在您的本地电脑上生成密钥对

这一步是在您的个人电脑(客户端)上操作,用于创建一对“钥匙”(私钥)和“锁”(公钥)。

  1. 打开您本地电脑的终端(Terminal)。
  2. 执行以下命令生成密钥。推荐使用 ed25519 算法,它更现代、更安全。
    # 将 your_email@example.com 替换为您的邮箱或任何标识符
    ssh-keygen -t ed25519 -C "your_email@example.com"
    
  3. 在随后的提示中:
    • 保存位置: 直接按回车键 (Enter) 接受默认路径 (~/.ssh/id_ed25519)。
    • 设置密码短语 (Passphrase): 强烈建议设置一个密码。这相当于给您的“钥匙”上了一个保险,即使私钥文件泄露,没有这个密码也无法使用。

    操作完成后,您的 ~/.ssh/ 目录下会生成两个文件:
    • id_ed25519: 私钥,必须妥善保管,绝不能泄露。
    • id_ed25519.pub: 公钥,可以安全地分享和部署到服务器上。

第二步:将公钥部署到服务器

这一步是将您的“锁”安装到您想登录的服务器上。

推荐方法:使用 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,可以手动操作:

  1. 本地电脑上,复制公钥内容到剪贴板:
    # macOS
    pbcopy < ~/.ssh/id_ed25519.pub
    # Linux (需要 xclip)
    # xclip -selection clipboard < ~/.ssh/id_ed25519.pub
    
  2. 通过密码登录到您的服务器
  3. 服务器上执行以下命令,将公钥粘贴进去:
    # 确保目录存在并设置权限
    mkdir -p ~/.ssh && chmod 700 ~/.ssh
    # 将公钥追加到文件,并设置权限
    echo "在此处粘贴您复制的公钥内容" >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    

第三步:测试密钥登录

本地电脑上再次尝试登录服务器:

ssh user@your_server_ip

如果一切正常,系统会提示您输入密钥的密码短语(如果您设置了),或者直接登录成功,而不再需要服务器密码。


第四步:安全加固(禁用密码登录)

在确认密钥登录完全可用后,执行此步以关闭密码登录通道,实现最高安全性。

  1. 登录到您的服务器
  2. 编辑 SSH 服务的配置文件:
    sudo nano /etc/ssh/sshd_config
    # 或者使用 vim: sudo vim /etc/ssh/sshd_config
    
  3. 找到并修改以下配置项(如果行首有 #,请删除):
    # 禁用密码登录
    PasswordAuthentication no
    
    # 推荐:禁止 root 用户直接登录
    PermitRootLogin no
    
    # 确保公钥认证是开启的
    PubkeyAuthentication yes
    
  4. 保存文件并重启 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