前言:我之前的云服务器由于配置不算高,一直也没有认真关注服务器的安全问题,直到这个学期我弄了一个新服务器,期末经常被境外IP攻击,又是期末周,又是服务器短信乱蹦,虽说服务器里面没什么重要的东西,但是也非常闹心,于是我把服务器安全问题重视起来,下文是我对我自己的服务器的安全配置,供大家参考。
文章目录
- 一、为什么要做安全加固?
- 二、服务器端安全配置
-
- [1. 创建普通用户并设置 sudo 权限](#1. 创建普通用户并设置 sudo 权限)
- [2. 配置 SSH 服务(/etc/ssh/sshd_config)](#2. 配置 SSH 服务(/etc/ssh/sshd_config))
- [3. 生成并部署 SSH 密钥对](#3. 生成并部署 SSH 密钥对)
-
- 腾讯云生成密钥
- 确认密钥配置在正确用户
- 1️⃣确认密钥被写到了哪个用户下
- [2️⃣ 将密钥复制到我们刚才创建的普通用户(如 qisiyu)](#2️⃣ 将密钥复制到我们刚才创建的普通用户(如 qisiyu))
-
- [方式一:直接复制 authorized_keys 文件(推荐)](#方式一:直接复制 authorized_keys 文件(推荐))
- 方式二:手动追加公钥
- [3️⃣ 验证迁移是否成功](#3️⃣ 验证迁移是否成功)
- [4️⃣ 可选:清理默认用户下的密钥(安全加固)](#4️⃣ 可选:清理默认用户下的密钥(安全加固))
- [三、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 弱口令扫描
- 中间人攻击(如果主机密钥被篡改)
因此,我们要在自己的服务器上部署重要的项目(比方说:中转站等),生产环境更不用说要必须做到:
- 禁用 root 直接登录
- 禁用密码认证,仅允许密钥对登录(对密钥对概念不是很了解的朋友可以用过目录跳转到第五部分了解,为了不打乱节奏我将概念放到后面)
- 使用普通用户 + sudo 提权
- 定期更新主机密钥(遇到警告时及时处理)
二、服务器端安全配置
⚠️ **致命操作顺序(千万不能错!)**⚠️
- 先 把密钥复制到普通用户(qisiyu)
- 再 修改
sshd_config禁用 root 和密码- 最后 重启 SSH 服务
再次重申千万不要反过来 ------如果先禁用 root 和密码,却发现密钥还没配置到我们创建的普通用户下,那我们就会彻底把自己锁在服务器外面(因为 root 登录被禁、密码登录被禁、普通用户又没有密钥),只能通过云控制台的 VNC 来救急。
1. 创建普通用户并设置 sudo 权限
首先我们创建一个普通用户 这个用户就是我们日后登录服务器的唯一用户了哦!
bash
# 以 root 登录服务器(或通过控制台 VNC)
adduser qisiyu
# 按提示设置密码(后期会禁用密码登录,但是要设置,提权要用哦)
usermod -aG sudo qisiyu
2. 配置 SSH 服务(/etc/ssh/sshd_config)
用 vim 或 nano 编辑:
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密钥对的生成和自动配置公钥,我就拿腾讯云举例子:
⚠️ 重要提醒
私钥管理 :是平台生成,私钥文件只下载一次,云平台不会保存。请务必妥善保管,一旦丢失,只能创建新的密钥对重新绑定,事先提醒,后续步骤中也会强调。
腾讯云生成密钥
- 进入密钥管理 :登录云服务器控制台,在左侧导航栏点击"SSH密钥"。
- 创建或导入密钥 :
- 创建新密钥:点击"创建密钥",输入名称,系统生成后会自动下载私钥文件。
- 导入已有公钥 :创建时选择"导入已有公钥",将你的公钥内容粘贴进去。
- 下载私钥 :网页会有下载弹窗,那就是我们的私钥,只会弹出一次,一定要下载,并记住下载路径,后续会用到。
- 绑定实例 :在密钥列表中找到目标密钥,点击右侧的"绑定实例"。勾选需要绑定的云服务器,点击"绑定"即可。

确认密钥配置在正确用户
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️⃣ 可选:清理默认用户下的密钥(安全加固)
迁移完成后,为了防止通过 root 或 ubuntu 用户继续使用密钥登录(如果已经禁用了 root 登录,其实也无所谓),可以删除原用户下的密钥文件:
bash
# 如果密钥原本在 root 下
rm -f /root/.ssh/authorized_keys
# 如果密钥原本在 ubuntu 下
rm -f /home/ubuntu/.ssh/authorized_keys
三、Xshell 密钥对登录配置
- 打开 Xshell → 新建会话(或修改现有会话)
- 连接 → 主机填写 云服务器的公网IP,端口 22
- 用户身份验证 → 方法选择 Public Key
- 用户名:
qisiyu - 用户密钥:点击"浏览" → "导入" → 选择本地的私钥文件(
.pem或id_rsa)
- 用户名:
- 点击"连接",此时应该无需密码直接登录。



四、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+P → Preferences: Open User Settings (JSON),添加:
json
{
"remote.SSH.connectTimeout": 60,
"remote.SSH.useLocalServer": true,
"remote.SSH.enableDynamicForwarding": false,
"remote.SSH.remoteServerListenOnSocket": true
}
这些设置能提升连接稳定性,特别是当网络存在延迟或服务器配置有特殊限制时。
3. 连接测试
在 VS Code 中按 F1 → Remote-SSH: Connect to Host...,输入配置文件中定义的 Host 名称(如 124.221.128.128)或直接输入 qisiyu@124.221.128.128。
首次连接时,如果之前没有记录主机密钥,会提示确认指纹,选择"继续"即可。
五、 什么是 SSH 密钥对?🔑
密钥对 它由两个文件组成:
- 私钥(Private Key) :相当于我们的私人钥匙 ,存放在我们自己的电脑上,绝对不能泄露给任何人。
- 公钥(Public Key) :相当于一把特制的锁 ,我们可以把它放心地安装在服务器上(存放在
~/.ssh/authorized_keys文件里)。
这就像给服务器配置一个指纹保险箱:
- 公钥 是保险箱上录入的指纹识别器(服务器用这个"识别器"来验证你是谁)。
- 私钥 是你的手指(本地电脑上的凭证)。
当我们想要打开服务器这把"锁"时,我们用"手指"(私钥)去触碰"识别器"(公钥)。系统内部会通过非对称加密算法进行数学校验,如果匹配,门就打开;如果不匹配,连接就被拒绝。
🛡️ 为什么它比密码更安全?
| 对比维度 | 传统密码 | 密钥对 (公钥/私钥) |
|---|---|---|
| 传输风险 | 密码需要通过网络传输给服务器,存在被中间人截获的风险(即使加密也怕泄露)。 | 私钥永远不离开本地电脑,只在本地进行签名运算,网络传输的只是验证签名,私钥本身不落网。 |
| 爆破难度 | 密码(无论多复杂)理论上都可能被穷举(暴力破解)。 | 私钥通常是 2048/4096 位,远超暴力破解能力,几乎不可能被猜出来。 |
| 管理成本 | 设置复杂密码难记,且一旦泄露必须改密码。 | 只要保护好本地的私钥文件(设置好文件权限),无需频繁修改,且可为不同服务器分发同一个公钥。 |
| 中间人攻击 | 容易被伪装的服务端骗取密码。 | 因私钥不传输,且基于签名校验,能有效对抗中间人欺诈。 |
密钥对登录就是"刷卡开门",既能彻底杜绝了网络爆破,又免去了记忆复杂密码的烦恼,是目前云服务器远程管理的绝对主流方案。
务必记住只需要牢牢记住一点:谁拿到了你的私钥文件,谁就能登录你的服务器。 所以,要么放在自己的电脑上,要么确保本地私钥文件的权限是 600(仅本人可读写)。
六、常见问题与解决方法(本人踩的坑)
问题1:MitmPortForwardingDisabled(端口转发被禁用)
- 表现:VS Code 报错,但 Xshell 能连。
- 原因 :服务器
sshd_config中AllowTcpForwarding未开启,或者主机密钥变更导致客户端主动禁用转发。 - 解决 :
- 确认服务器
AllowTcpForwarding yes并重启 sshd。 - 检查本地
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 命令:
powershellicacls "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) 但密钥已添加
- 排查 :
- 确认服务器
~/.ssh/authorized_keys包含正确公钥。 - 确认
~/.ssh权限为 700,authorized_keys为 600。 - 检查
sshd_config中PubkeyAuthentication yes。 - 确认客户端使用的私钥路径正确(检查 SSH config 或命令行
-i参数)。 - 查看服务器日志
/var/log/auth.log获取更多信息。
- 确认服务器
七、总结
| 安全项 | 建议 |
|---|---|
| root 登录 | 禁用,使用普通用户 + sudo |
| 密码认证 | 禁用,仅使用密钥 |
| 密钥管理 | 定期轮换,私钥严格权限(仅本人可读) |
| 主机密钥 | 遇到变更提示时,先确认服务器状态再清理 known_hosts |
| SSH 配置 | 开启 AllowTcpForwarding 以满足 VS Code 需求 |
| 连接优化 | 使用 ControlMaster 复用连接,大幅提升二次连接速度 |
| 日志监控 | 定期查看 /var/log/auth.log 检测异常登录尝试 |
通过今天的实战,我从一个"报错不断"的初始状态,逐步修复了主机密钥、私钥权限、SSH 配置、VS Code 设置等多个问题,最终实现了安全、稳定、高效的云服务器远程开发环境。
安全与便捷并非对立。密钥对登录 + 普通用户提权 + 连接复用配置,既能有效防御外部攻击,又能让日常开发流畅无阻。希望这篇总结能帮你节省时间,少走弯路。
如果大家在实践中遇到其他问题,欢迎在评论区留言交流。
附:相关命令速查
sudo systemctl restart sshdssh-keygen -R 目标IPssh -i 私钥路径 用户名@IP(测试连接)top查看服务器资源sudo tail -f /var/log/auth.log实时查看认证日志
如果觉得这篇文章有用的话,点个赞、收个藏,下次配新服务器时直接抄作业,遇到新坑也欢迎回来留言,我们一起填平它。🚀
