云服务器安全加固与密钥对登录 Xshell 与 VS Code 登录配置

前言:我之前的云服务器由于配置不算高,一直也没有认真关注服务器的安全问题,直到这个学期我弄了一个新服务器,期末经常被境外IP攻击,又是期末周,又是服务器短信乱蹦,虽说服务器里面没什么重要的东西,但是也非常闹心,于是我把服务器安全问题重视起来,下文是我对我自己的服务器的安全配置,供大家参考。

文章目录

  • 一、为什么要做安全加固?
  • 二、服务器端安全配置
    • [1. 创建普通用户并设置 sudo 权限](#1. 创建普通用户并设置 sudo 权限)
    • [2. 配置 SSH 服务(/etc/ssh/sshd_config)](#2. 配置 SSH 服务(/etc/ssh/sshd_config))
    • [3. 生成并部署 SSH 密钥对](#3. 生成并部署 SSH 密钥对)
  • [三、Xshell 密钥对登录配置](#三、Xshell 密钥对登录配置)
  • [四、VS Code Remote-SSH 密钥对连接配置](#四、VS Code Remote-SSH 密钥对连接配置)
    • [1. 编辑本地 SSH 配置文件](#1. 编辑本地 SSH 配置文件)
    • [2. VS Code 内部设置(settings.json)](#2. VS Code 内部设置(settings.json))
    • [3. 连接测试](#3. 连接测试)
  • [五、 什么是 SSH 密钥对?🔑](#五、 什么是 SSH 密钥对?🔑)
    • [🛡️ 为什么它比密码更安全?](#🛡️ 为什么它比密码更安全?)
  • 六、常见问题与解决方法(本人踩的坑)
    • 问题1:`MitmPortForwardingDisabled`(端口转发被禁用)
    • [问题2:`WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED`](#问题2:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED)
    • [问题3:`Bad permissions`(私钥权限过宽)](#问题3:Bad permissions(私钥权限过宽))
    • [问题4:连接超时(`Connecting with SSH timed out`)](#问题4:连接超时(Connecting with SSH timed out))
    • [问题5:`Permission denied (publickey)` 但密钥已添加](#问题5:Permission denied (publickey) 但密钥已添加)
  • 七、总结

一、为什么要做安全加固?

云服务器暴露在公网,默认的 22 端口、密码登录、root 账户是暴力破解的重灾区。常见的攻击手段包括:

  • 字典爆破 root 密码
  • SSH 弱口令扫描
  • 中间人攻击(如果主机密钥被篡改)

因此,我们要在自己的服务器上部署重要的项目(比方说:中转站等),生产环境更不用说要必须做到:

  1. 禁用 root 直接登录
  2. 禁用密码认证,仅允许密钥对登录(对密钥对概念不是很了解的朋友可以用过目录跳转到第五部分了解,为了不打乱节奏我将概念放到后面)
  3. 使用普通用户 + sudo 提权
  4. 定期更新主机密钥(遇到警告时及时处理)

二、服务器端安全配置

⚠️ **致命操作顺序(千万不能错!)**⚠️

  1. 把密钥复制到普通用户(qisiyu)
  2. 修改 sshd_config 禁用 root 和密码
  3. 最后 重启 SSH 服务
    再次重申千万不要反过来 ------如果先禁用 root 和密码,却发现密钥还没配置到我们创建的普通用户下,那我们就会彻底把自己锁在服务器外面(因为 root 登录被禁、密码登录被禁、普通用户又没有密钥),只能通过云控制台的 VNC 来救急。

1. 创建普通用户并设置 sudo 权限

首先我们创建一个普通用户 这个用户就是我们日后登录服务器的唯一用户了哦!

bash 复制代码
# 以 root 登录服务器(或通过控制台 VNC)
adduser qisiyu
# 按提示设置密码(后期会禁用密码登录,但是要设置,提权要用哦)
usermod -aG sudo qisiyu

2. 配置 SSH 服务(/etc/ssh/sshd_config)

vimnano 编辑:

bash 复制代码
sudo vim /etc/ssh/sshd_config

确保以下配置项正确(注意区分大小写):

ini 复制代码
# 禁止 root 登录
PermitRootLogin no

# 禁用密码认证(关键!)
PasswordAuthentication no
ChallengeResponseAuthentication no

# 允许密钥认证
PubkeyAuthentication yes

# 允许 TCP 转发(VS Code 需要)
AllowTcpForwarding yes

# 推荐:允许代理转发(如果后续需要)
AllowAgentForwarding yes

# 禁用 PAM 密码(如果使用密钥,PAM 最好也关掉)
# UsePAM yes 保持默认即可,但确保 PasswordAuthentication no

保存后重启服务:

bash 复制代码
sudo systemctl restart sshd

3. 生成并部署 SSH 密钥对

现在云服务器平台都支持SSH密钥对的生成和自动配置公钥,我就拿腾讯云举例子:

⚠️ 重要提醒

私钥管理 :是平台生成,私钥文件只下载一次,云平台不会保存。请务必妥善保管,一旦丢失,只能创建新的密钥对重新绑定,事先提醒,后续步骤中也会强调。

腾讯云生成密钥

  1. 进入密钥管理 :登录云服务器控制台,在左侧导航栏点击"SSH密钥"。
  2. 创建或导入密钥
    • 创建新密钥:点击"创建密钥",输入名称,系统生成后会自动下载私钥文件。
    • 导入已有公钥 :创建时选择"导入已有公钥",将你的公钥内容粘贴进去。
  3. 下载私钥 :网页会有下载弹窗,那就是我们的私钥,只会弹出一次,一定要下载,并记住下载路径,后续会用到
  4. 绑定实例 :在密钥列表中找到目标密钥,点击右侧的"绑定实例"。勾选需要绑定的云服务器,点击"绑定"即可。

确认密钥配置在正确用户

1️⃣确认密钥被写到了哪个用户下

  • 阿里云 :默认绑定到 root 用户。
  • 腾讯云 :默认绑定到 ubuntu 用户(而不是 root)。
  • 其他平台 :部分允许在绑定密钥时选择用户名,如果不选,通常就是 root

我们可以先用 Xshell 尝试用密钥登录不同的用户名来确认:

bash 复制代码
# 测试 root
ssh -i 你的私钥 root@你的IP

# 测试 ubuntu
ssh -i 你的私钥 ubuntu@你的IP

# 测试你自己的用户名
ssh -i 你的私钥 qisiyu@你的IP

哪个能直接登录(不需要密码),说明密钥就配置在哪个用户下。

2️⃣ 将密钥复制到我们刚才创建的普通用户(如 qisiyu)

假设你确认密钥目前生效在 root 用户下,现在要把它迁移到 qisiyu

方式一:直接复制 authorized_keys 文件(推荐)
bash 复制代码
# 用 root 登录服务器(此时密钥已生效)
# 创建 qisiyu 的 .ssh 目录(如果还没有)
mkdir -p /home/qisiyu/.ssh

# 复制 root 的 authorized_keys 到 qisiyu 下
cp /root/.ssh/authorized_keys /home/qisiyu/.ssh/

# 修改所有权和权限
chown -R qisiyu:qisiyu /home/qisiyu/.ssh
chmod 700 /home/qisiyu/.ssh
chmod 600 /home/qisiyu/.ssh/authorized_keys
方式二:手动追加公钥

如果不想复制整个文件,也可以只追加内容:

bash 复制代码
# 以 root 登录
cat /root/.ssh/authorized_keys >> /home/qisiyu/.ssh/authorized_keys
chown qisiyu:qisiyu /home/qisiyu/.ssh/authorized_keys
chmod 600 /home/qisiyu/.ssh/authorized_keys

3️⃣ 验证迁移是否成功

退出当前会话,然后用 qisiyu 用户重新测试密钥登录:

bash 复制代码
ssh -i 你的私钥 qisiyu@你的IP

如果直接进入(不需要密码),迁移成功 ✅

4️⃣ 可选:清理默认用户下的密钥(安全加固)

迁移完成后,为了防止通过 rootubuntu 用户继续使用密钥登录(如果已经禁用了 root 登录,其实也无所谓),可以删除原用户下的密钥文件:

bash 复制代码
# 如果密钥原本在 root 下
rm -f /root/.ssh/authorized_keys

# 如果密钥原本在 ubuntu 下
rm -f /home/ubuntu/.ssh/authorized_keys

三、Xshell 密钥对登录配置

  1. 打开 Xshell → 新建会话(或修改现有会话)
  2. 连接 → 主机填写 云服务器的公网IP,端口 22
  3. 用户身份验证 → 方法选择 Public Key
    • 用户名:qisiyu
    • 用户密钥:点击"浏览" → "导入" → 选择本地的私钥文件(.pemid_rsa
  4. 点击"连接",此时应该无需密码直接登录。

四、VS Code Remote-SSH 密钥对连接配置

VS Code 的 Remote-SSH 插件本质是调用系统 SSH 客户端,因此配置主要依赖于 ~/.ssh/config 文件。

1. 编辑本地 SSH 配置文件

路径:C:\Users\你的用户名\.ssh\config(不存在则新建)。

为每个主机添加一个 Host 段,例如:

ssh-config 复制代码
Host 124.xxx.xxx.128
    HostName 124.xxx.xxx.128
    User qisiyu
    IdentityFile D:/Server_Key/XXXXX.pem
    IdentitiesOnly yes
    StrictHostKeyChecking no          # 可选,跳过首次提示(慎用)
    UserKnownHostsFile NUL             # Windows 下废弃已知主机记录
    ControlMaster auto                # 以下为优化连接速度
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600
    Compression yes
    ServerAliveInterval 60

注意

  • IdentityFile 路径中的反斜杠 \ 建议换成 / 或双反斜杠 \\,避免被转义。
  • 如果私钥权限过宽(Windows 上常见),需要单独调整文件权限(右键→属性→安全→只保留当前用户完全控制)。

2. VS Code 内部设置(settings.json)

Ctrl+Shift+PPreferences: Open User Settings (JSON),添加:

json 复制代码
{
    "remote.SSH.connectTimeout": 60,
    "remote.SSH.useLocalServer": true,
    "remote.SSH.enableDynamicForwarding": false,
    "remote.SSH.remoteServerListenOnSocket": true
}

这些设置能提升连接稳定性,特别是当网络存在延迟或服务器配置有特殊限制时。

3. 连接测试

在 VS Code 中按 F1Remote-SSH: Connect to Host...,输入配置文件中定义的 Host 名称(如 124.221.128.128)或直接输入 qisiyu@124.221.128.128

首次连接时,如果之前没有记录主机密钥,会提示确认指纹,选择"继续"即可。

五、 什么是 SSH 密钥对?🔑

密钥对 它由两个文件组成:

  1. 私钥(Private Key) :相当于我们的私人钥匙 ,存放在我们自己的电脑上,绝对不能泄露给任何人。
  2. 公钥(Public Key) :相当于一把特制的锁 ,我们可以把它放心地安装在服务器上(存放在 ~/.ssh/authorized_keys 文件里)。

这就像给服务器配置一个指纹保险箱

  • 公钥 是保险箱上录入的指纹识别器(服务器用这个"识别器"来验证你是谁)。
  • 私钥 是你的手指(本地电脑上的凭证)。

当我们想要打开服务器这把"锁"时,我们用"手指"(私钥)去触碰"识别器"(公钥)。系统内部会通过非对称加密算法进行数学校验,如果匹配,门就打开;如果不匹配,连接就被拒绝。

🛡️ 为什么它比密码更安全?

对比维度 传统密码 密钥对 (公钥/私钥)
传输风险 密码需要通过网络传输给服务器,存在被中间人截获的风险(即使加密也怕泄露)。 私钥永远不离开本地电脑,只在本地进行签名运算,网络传输的只是验证签名,私钥本身不落网。
爆破难度 密码(无论多复杂)理论上都可能被穷举(暴力破解)。 私钥通常是 2048/4096 位,远超暴力破解能力,几乎不可能被猜出来
管理成本 设置复杂密码难记,且一旦泄露必须改密码。 只要保护好本地的私钥文件(设置好文件权限),无需频繁修改,且可为不同服务器分发同一个公钥。
中间人攻击 容易被伪装的服务端骗取密码。 因私钥不传输,且基于签名校验,能有效对抗中间人欺诈。

密钥对登录就是"刷卡开门",既能彻底杜绝了网络爆破,又免去了记忆复杂密码的烦恼,是目前云服务器远程管理的绝对主流方案。

务必记住只需要牢牢记住一点:谁拿到了你的私钥文件,谁就能登录你的服务器。 所以,要么放在自己的电脑上,要么确保本地私钥文件的权限是 600(仅本人可读写)。

六、常见问题与解决方法(本人踩的坑)

问题1:MitmPortForwardingDisabled(端口转发被禁用)

  • 表现:VS Code 报错,但 Xshell 能连。
  • 原因 :服务器 sshd_configAllowTcpForwarding 未开启,或者主机密钥变更导致客户端主动禁用转发
  • 解决
    1. 确认服务器 AllowTcpForwarding yes 并重启 sshd。
    2. 检查本地 known_hosts 是否与服务器实际密钥不符(如重装系统后)。执行 ssh-keygen -R 目标IP 删除旧记录,重新连接接受新密钥。

问题2:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED

  • 原因:服务器重装或 SSH 服务重新生成密钥。
  • 解决 :在本地 Windows 上执行 ssh-keygen -R 39.105.16.254(清理 known_hosts),然后重新连接。

问题3:Bad permissions(私钥权限过宽)

  • 表现Permissions for 'D:\\Server_Key\\...pem' are too open.
  • 解决
    • 右键私钥文件 → 属性 → 安全 → 高级 → 禁用继承,只保留当前用户(完全控制),删除其他用户/组。

    • 或使用 PowerShell 命令:

      powershell 复制代码
      icacls "D:\Server_Key\Linux_4C_8G_For_AI_Deploy.pem" /reset
      icacls "D:\Server_Key\Linux_4C_8G_For_AI_Deploy.pem" /inheritance:r
      icacls "D:\Server_Key\Linux_4C_8G_For_AI_Deploy.pem" /grant:r "%USERNAME%:F"

问题4:连接超时(Connecting with SSH timed out

  • 原因:网络延迟或握手过程过长,VS Code 默认超时 17 秒。
  • 解决
    • 增加 remote.SSH.connectTimeout 到 60 秒。
    • 启用 SSH 连接复用(ControlMaster auto),后续连接瞬间完成。
    • 检查服务器资源(top)是否过载。

问题5:Permission denied (publickey) 但密钥已添加

  • 排查
    1. 确认服务器 ~/.ssh/authorized_keys 包含正确公钥。
    2. 确认 ~/.ssh 权限为 700,authorized_keys 为 600。
    3. 检查 sshd_configPubkeyAuthentication yes
    4. 确认客户端使用的私钥路径正确(检查 SSH config 或命令行 -i 参数)。
    5. 查看服务器日志 /var/log/auth.log 获取更多信息。

七、总结

安全项 建议
root 登录 禁用,使用普通用户 + sudo
密码认证 禁用,仅使用密钥
密钥管理 定期轮换,私钥严格权限(仅本人可读)
主机密钥 遇到变更提示时,先确认服务器状态再清理 known_hosts
SSH 配置 开启 AllowTcpForwarding 以满足 VS Code 需求
连接优化 使用 ControlMaster 复用连接,大幅提升二次连接速度
日志监控 定期查看 /var/log/auth.log 检测异常登录尝试

通过今天的实战,我从一个"报错不断"的初始状态,逐步修复了主机密钥、私钥权限、SSH 配置、VS Code 设置等多个问题,最终实现了安全、稳定、高效的云服务器远程开发环境。

安全与便捷并非对立。密钥对登录 + 普通用户提权 + 连接复用配置,既能有效防御外部攻击,又能让日常开发流畅无阻。希望这篇总结能帮你节省时间,少走弯路。

如果大家在实践中遇到其他问题,欢迎在评论区留言交流。

附:相关命令速查

  • sudo systemctl restart sshd
  • ssh-keygen -R 目标IP
  • ssh -i 私钥路径 用户名@IP(测试连接)
  • top 查看服务器资源
  • sudo tail -f /var/log/auth.log 实时查看认证日志

如果觉得这篇文章有用的话,点个赞、收个藏,下次配新服务器时直接抄作业,遇到新坑也欢迎回来留言,我们一起填平它。🚀