配置服务器仅使用SSH密钥登陆(禁止密码登陆)
七崽爱吃小饼干2025/12/30阅读 10
以下是 Ubuntu 服务器仅启用 SSH 密钥登录(禁用密码登录) 的完整、可落地流程,包含「本地生成密钥→上传公钥→服务器配置→验证登录」全步骤,适配非默认 SSH 端口场景,兼顾安全性和可操作性:
前置准备
- 本地设备:Windows/Linux/macOS(需有终端/SSH 工具,Windows 推荐 PowerShell/Git Bash);
- 服务器:Ubuntu 系统,已获取普通用户权限(如
nefu),且能通过密码登录; - 核心原则:操作过程中不要关闭当前 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
关键注意事项
- 私钥安全:本地私钥(
id_ed25519)切勿泄露/上传到公共平台,若丢失/泄露,需立即:- 在服务器
~/.ssh/authorized_keys中删除对应公钥; - 重新生成密钥对并上传。
- 在服务器
- 不要关闭旧窗口:配置完成前,保留最初的密码登录窗口,若新登录失败,可通过旧窗口回滚配置(比如临时开启密码登录)。
- 权限错误排查:若密钥登录失败,90% 是权限问题,服务器端执行:
bash
ls -la ~/.ssh/ # 确保目录权限 700,文件权限 600,所有者是 nefu - 回滚配置(紧急情况):若密钥登录失败,通过旧窗口修改
sshd_config:bashsudo nano /etc/ssh/sshd_config # 临时开启密码登录:PasswordAuthentication yes sudo systemctl restart ssh
至此,服务器已完全禁用密码登录,仅允许密钥登录,彻底杜绝 SSH 暴力破解风险。