创见博客
配置服务器仅使用SSH密钥登陆(禁止密码登陆)
七崽爱吃小饼干2025/12/30阅读 10

以下是 Ubuntu 服务器仅启用 SSH 密钥登录(禁用密码登录) 的完整、可落地流程,包含「本地生成密钥→上传公钥→服务器配置→验证登录」全步骤,适配非默认 SSH 端口场景,兼顾安全性和可操作性:

前置准备

  1. 本地设备:Windows/Linux/macOS(需有终端/SSH 工具,Windows 推荐 PowerShell/Git Bash);
  2. 服务器:Ubuntu 系统,已获取普通用户权限(如 nefu),且能通过密码登录;
  3. 核心原则:操作过程中不要关闭当前 SSH 连接,配置完成后先新开终端测试,避免断连。

步骤 1:本地生成 SSH 密钥对(推荐 ed25519 算法)

ed25519 算法比 RSA 更安全、高效,是目前的最优选择。

1.1 Linux/macOS 本地操作

打开终端,执行以下命令:

bash
# 生成 ed25519 密钥对,-C 为备注(可填邮箱/服务器标识,用来区分不同用户的密钥)
ssh-keygen -t ed25519 -C "nefu_ubuntu_server"

执行后按提示操作:

  • 第一步:密钥保存路径(默认 ~/.ssh/id_ed25519)→ 直接回车(无需修改);
  • 第二步:密钥密码(可选)→ 若想给私钥加保护(防止私钥泄露后被滥用),输入密码并确认;不想加则连续回车;
  • 生成成功后,~/.ssh/ 目录会出现:
    • id_ed25519:私钥(核心保密,切勿泄露/删除);
    • id_ed25519.pub:公钥(需上传到服务器)。

1.2 Windows 本地操作

打开 PowerShell/Git Bash(安装 Git 后自带),执行相同命令:

powershell
ssh-keygen -t ed25519 -C "nefu_ubuntu_server"
  • 密钥默认保存路径:C:\Users\你的用户名\.ssh\id_ed25519;
  • 后续步骤同 Linux/macOS,连续回车即可生成。

步骤 2:上传公钥到 Ubuntu 服务器(适配非默认端口)

2.1 方式 1:ssh-copy-id 快速上传(推荐,Linux/macOS/Windows Git Bash 可用)

若 SSH 端口为默认 22:

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub nefu@服务器IP

若 SSH 端口非默认(如 2222),加 -p 指定端口:

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 nefu@服务器IP

执行后输入服务器普通用户(如 nefu)的密码,工具会自动:

  • 在服务器 ~/.ssh/ 目录创建 authorized_keys 文件;
  • 将本地公钥写入该文件;
  • 自动设置正确的权限(700 目录/600 文件,SSH 对权限要求严格)。

2.2 方式 2:手动上传(无 ssh-copy-id 时用,如纯 Windows PowerShell)

步骤 1:本地复制公钥内容

powershell
# Windows PowerShell
type C:\Users\你的用户名\.ssh\id_ed25519.pub

# Linux/macOS
cat ~/.ssh/id_ed25519.pub

复制输出的完整公钥字符串(以 ssh-ed25519 开头,结尾是备注)。

步骤 2:登录服务器并写入公钥

bash
# 若端口非 22,加 -p 2222
ssh -p 2222 nefu@服务器IP

登录后执行以下命令(逐行复制):

bash
# 创建 .ssh 目录(若不存在),设置权限 700(必须)
mkdir -p ~/.ssh && chmod 700 ~/.ssh

# 编辑 authorized_keys 文件,粘贴公钥
nano ~/.ssh/authorized_keys
  • 按 Ctrl+V 粘贴本地复制的公钥(确保整行无换行);
  • 按 Ctrl+O 保存 → 按回车确认 → 按 Ctrl+X 退出;

步骤 3:强制设置文件权限(关键,避免权限错误导致登录失败)

bash
chmod 600 ~/.ssh/authorized_keys  # 文件权限 600
chown -R nefu:nefu ~/.ssh/        # 确保所有者是 nefu 用户

步骤 3:服务器配置仅允许密钥登录(禁用密码/root 登录)

3.1 编辑 SSH 配置文件

登录服务器后,执行:

bash
sudo nano /etc/ssh/sshd_config

找到以下配置项,修改为如下值(若行首有 #,删除注释):

bash
# 核心配置(必改)
# 启用公钥认证(核心:密钥登录的基础)
PubkeyAuthentication yes
# 禁用密码登录(关键:杜绝密码暴力破解,提升服务器安全性)
PasswordAuthentication no
# 禁用 root 用户 SSH 登录(核心安全:防止 root 账户被攻击)
PermitRootLogin no
# 指定用户授权公钥存储文件(默认路径,无需修改,权限需为600)
AuthorizedKeysFile .ssh/authorized_keys

# 可选配置(推荐)
# 若想改非默认端口,此处填写(需和上传时一致)
Port 2222                       
# 最大登录尝试次数,减少暴力破解空间
MaxAuthTries 3                  
# 登录超时时间,缩短攻击窗口
LoginGraceTime 30s              

3.2 重启 SSH 服务使配置生效

bash
# Ubuntu 系统重启 SSH 服务(通用命令)
sudo systemctl restart ssh

# 验证服务状态(确保无报错)
sudo systemctl status ssh
  • 若提示 active (running),说明配置生效;
  • 若报错,检查 sshd_config 格式(比如是否有语法错误)。

3.3 防火墙放行 SSH 端口(若启用 ufw)

若服务器开启了 ufw 防火墙,需放行 SSH 端口(默认 22 或自定义 2222):

bash
# 若端口为 2222
sudo ufw allow 2222/tcp
sudo ufw reload

# 查看防火墙规则
sudo ufw status

步骤 4:验证密钥登录(核心,确保配置成功)

4.1 本地测试密钥登录

打开新的终端/窗口(不要关闭旧登录窗口),执行:

bash
# 端口为 22 时
ssh nefu@服务器IP

# 端口为 2222 时
ssh -p 2222 nefu@服务器IP
  • 若未设置私钥密码:直接登录(无需输入任何密码);
  • 若设置了私钥密码:输入私钥密码后登录;
  • 登录成功 → 密钥配置生效。

4.2 验证密码登录已禁用(关键)

执行以下命令,强制尝试密码登录,正常应提示 Permission denied:

bash
# 端口为 2222 时,加 -p 2222
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no nefu@服务器IP

若输出类似 Permission denied (publickey).,说明密码登录已彻底禁用。


步骤 5:(可选)简化登录(配置本地 SSH 别名)

为避免每次登录都输 IP/端口,可在本地配置 SSH 别名:

5.1 编辑本地 SSH 配置文件

bash
# Linux/macOS
nano ~/.ssh/config

# Windows Git Bash
nano ~/.ssh/config

# Windows PowerShell(需先创建文件)
New-Item -Path C:\Users\你的用户名\.ssh\config -Type File
notepad C:\Users\你的用户名\.ssh\config

5.2 添加别名配置

bash
Host ubuntu-server  # 自定义别名(如 ubuntu-server)
    HostName 服务器IP  # 你的服务器公网/内网 IP
    User nefu         # 登录用户名
    Port 2222         # SSH 端口(默认 22 则省略)
    IdentityFile ~/.ssh/id_ed25519  # 本地私钥路径(Windows 填 C:\Users\你的用户名\.ssh\id_ed25519)

5.3 保存后,直接用别名登录

bash
ssh ubuntu-server

关键注意事项

  1. 私钥安全:本地私钥(id_ed25519)切勿泄露/上传到公共平台,若丢失/泄露,需立即:
    • 在服务器 ~/.ssh/authorized_keys 中删除对应公钥;
    • 重新生成密钥对并上传。
  2. 不要关闭旧窗口:配置完成前,保留最初的密码登录窗口,若新登录失败,可通过旧窗口回滚配置(比如临时开启密码登录)。
  3. 权限错误排查:若密钥登录失败,90% 是权限问题,服务器端执行:
    bash
    ls -la ~/.ssh/  # 确保目录权限 700,文件权限 600,所有者是 nefu
    
  4. 回滚配置(紧急情况):若密钥登录失败,通过旧窗口修改 sshd_config:
    bash
    sudo nano /etc/ssh/sshd_config
    # 临时开启密码登录:PasswordAuthentication yes
    sudo systemctl restart ssh
    

至此,服务器已完全禁用密码登录,仅允许密钥登录,彻底杜绝 SSH 暴力破解风险。

评论
0/100