你是不是一直有这样的问题:

  • 买了台 VPS,但是默认的镜像用的是 root 感觉一点也不安全
  • 天天有人扫 22 端口,不小心设置了弱密码,机器被爆破之后被利用,惨遭删机
  • 新买的 VPS 不知道做什么安全措施好

如果是,那么这篇文章就是为你准备的,我们将一步一步配置,提升你的 VPS 安全性。

今天我重装了一台吃灰的 VPS,把整个提升安全性的措施记录在这里,建议收藏一下,以后每次买了新机都可以回来抄作业~

让我们开始吧!

连接到 VPS

这个不多说,检查面板或者邮件,里面有 root 密码。如果没说端口号就是 22。实在连不上开个工单问问商家也行。

确保你能连上,比如这是我的,一台 Debian 服务器:

连接 SSH

dd 脚本

如果你要用脚本重装系统,请现在执行,因为这会清理所有配置和数据

系统更新

因为你刚部署机器,如果硬盘充足,你可以更新一次系统,这样可以显著减少安全隐患,而且万一不小心被更新搞坏了,还能重新点重装,成本不高:

1
2
apt update  
apt upgrade

注意这是 debian 的 apt 包管理。你可能需要根据系统调整命令。

然后重启,看看机器能不能启动,ssh 能否连上。如果很不幸系统死了,请重装,然后跳过系统更新这一步。

探针、测评

如果需要探针和测评,请现在执行。如果是关键的建站机器,不建议打开远程 ssh,防止面板被黑一锅端。

此处较为简单,不再提供参考。探针一般有自己的一键安装脚本和配置,仅仅列出 NQ 标准测试的脚本:

1
bash <(curl -sL https://run.NodeQuality.com)

修改机器名称

买来的机器一般是商家生成的随机名称。改一下,改成更加有意义的名称,比如我这台机器在香港,用来跑 copilot cli 做 vibe 的,就起名 hk-copilot-dev-vps

1
hostnamectl set-hostname hk-copilot-dev-vps

Systemd

上面的命令仅仅适用于基于 systemd 的系统。如果你的系统执行该命令发生了错误,你需要以传统方式修改:
nano /etc/hostname 打开文件写入新的名称,然后 nano /etc/hosts 修改 127.0.1.1 后面的内容!

改名后重启让它生效:

1
reboot

重启再连上 ssh,可以看到 bash 已经显示出了新的名字,这样就完成了!

新的 VPS 主机名

改密、添加用户

先把 root 密码改成自己的。记得设定一个安全的密码!你可以用各种密码管理器来生成一些。

输入 passwd 改密。手滑了也没关系,比如下面的图片不小心按了 enter 创建了空密码,系统会自动提示密码为空,再次输入就行了。

改 root 密码

接下来我们创建一个用户

其实如果只有你一个人用,root 也不是不行。但是如果你经常手滑希望加上 sudo 确认一下,或者要用 Homebrew,创建一个新的用户仍然是必要的。

用 adduser 增加一个用户:

1
adduser samhou

输入用户密码。可以不用提供那堆信息,直接 enter 即可。

创建新的用户

sudo 和免密码

现在我的用户没有管理权限,因此我们需要赋予 sudo 的权限,允许用户暂时以 root 执行操作。

为了防止商家给的镜像太过于精简,首先你得装好 sudo:

1
apt install sudo

注意上面的命令适用于使用 apt 的系统。

我的机器看起来已经有了。

在常见的 debian 系统中,sudo 是一个用户组,你只要把用户加入这个用户组,即可赋予 sudo 权限:

1
usermod -aG sudo samhou

现在切换到新创建的用户:

1
su samhou

你应该仍然处于 root 文件夹里面,这个文件夹只有默认管理员才能碰。尝试下面的命令:

1
2
ls
sudo ls

如果第一个 ls 显示 Permission denied,第二个要求你输入密码然后输出了文件夹内容,说明你配置正确了!

(我这里文件夹没有任何内容,所以什么输出也没有)

sudo 权限测试

由于我们的 VPS 一般都是远程连接的,在 ssh 时已经证明身份了,所以可以关掉 sudo 的密码验证(对,这样的话龙虾、cli 这些东西也能随便玩管理员权限了,不用你再给密码),这需要编辑 sudoers。

先回退 root 用户防止锁死自己,然后用 visudo 编辑:

1
2
exit
visudo

如果你只想要自己免密,可以在最后加上一行:

1
samhou ALL=(ALL) NOPASSWD:ALL

记得改成自己创建的用户名。

如果你想让所有 sudo 都免密,比如你有多个用户,请找到这一行:

1
%sudo ALL=(ALL:ALL) ALL

把它改成:

1
%sudo ALL=(ALL:ALL) NOPASSWD:ALL

sudo 配置示例

然后保存退出。再切换成目标用户尝试:

1
2
su samhou
sudo ls

是不是不用密码了呢?如果没有要求输入密码,说明成功了!

SSH

密钥登录

接下来,我们来配置 ssh 登录。首先,在本地创建密钥:

1
ssh-keygen -t ed25519

按照提示设置保存位置和密码。此处不再赘述。如果不提供保存位置,默认在你的用户文件夹下的 .ssh 文件夹中,文件以加密算法(这里是 ed25519)命名。密钥有一对,私钥和公钥,你必须保护好私钥,这是你连接到服务器时证明你身份的东西。而公钥需要安装到服务器上,让服务器知道你这个人。

密钥文件示例

linux 可以直接上传公钥到服务器:

1
ssh-copy-id samhou@IP

记得改成自己用户名和 IP,然后输入刚才创建的用户密码。

如果你是 windows 没法用上面的命令,请跟我来操作,手动安装密钥。

首先用你创建的用户凭据登录(不要用 root!),然后在你的用户目录执行:

1
2
3
mkdir .ssh
cd .ssh
nano authorized_keys

然后把你在上一步创建的公钥粘贴进去(公钥就是后缀带有 .pub 的文件内容)。

保存。然后返回用户目录,改一下文件归属和权限(必须的,否则会被认为不安全而被拒绝):

1
2
3
4
5
cd ~
sudo chown -R samhou:samhou .ssh
sudo chmod 700 .ssh
sudo chmod 600 .ssh/
sudo chmod 600 .ssh/authorized_keys

这些命令应该没有任何输出。如果报错说明你肯定哪里出问题了。

现在在本地用密钥登录试试。如果没有要求输入密码或要求输入密码解锁密钥,说明一切正常!

确保能登录

请确保你能用密钥登录,再继续执行后续操作!否则你会把自己锁在外面……如果你自己搜索解决方案后仍然无法解决问题,请寻求技术大佬的帮助。

端口和登录控制

端口和登录认证控制都是由 /etc/ssh/sshd_config 文件控制的。

先打开这个文件(记得用 sudo 权限)

1
sudo nano /etc/ssh/sshd_config

接下来,我们来改一下端口。

找到这个 Port 这一行,取消注释,然后修改端口,随便改一个 22 除外的,别让别人轻易猜到:

11451 端口

然后禁用 root 登录,找到 PermitRootLogin 改成 no:

拒绝 root 登录

最后关闭密码登录(这样仅仅允许密钥登录),把 PasswordAuthentication 改成 no,然后去除 PermitEmptyPasswords no 的注释:

关闭密码登录

保存文件。然后重启 ssh 服务:

1
sudo systemctl restart ssh

如果不行,试试另外一种:

1
sudo systemctl restart sshd

现在用新的端口登录,尝试一下。如果你的主机提供商有非常高级的面板式防火墙,记得去打开你要的端口,防止连不上~

1
ssh samhou@IP -p 11451

-p 表示端口,不要在 IP 后面直接写冒号,这是不对的!

节省篇幅,此处不再展示相同的登录成功页面。

防火墙

如果你的主机商家比较菜,一般不会提供面板防火墙。这时候,你可以用 ufw 管理你的 iptables,快速配置防火墙。

先装上:

1
sudo apt install ufw

然后,允许你想要的端口,比如你建站想要的 web 服务端口,以及刚才我们改好的 11451 ssh 端口:

1
2
3
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 11451

确定你的 ssh 端口包含了之后(别把自己锁外面了),你就可以激活防火墙了:

1
sudo ufw enable

然后就是再次连接 ssh,看看能不能连上。如果你很不幸把自己拦截在外面了,可以用商家提供的 vnc 登录(不算 ssh 所以直接输入密码登入即可),关掉防火墙再连接。

fail2ban

虽然改完端口仅仅允许密钥登录,理论上已经非常安全了,但是我还是建议你加上 fail2ban 来提升安全性,它会自动封禁扫描你机器的 IP。

先装好:

1
sudo apt install fail2ban

然后把模板配置复制一份给自定义配置,打开新建的自定义配置文件:

1
2
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

忽略开头的注释,向下滚动,你首先会看到 [DEFAULT] 这个标签,然后是一堆提示。继续向下滚动,根据注释,你可以配置你想要的 ban 策略,比如 10 分钟里面认证失败 5 次直接封禁 24 小时:

1
2
3
bantime = 24h
findtime = 10m
maxretry = 5

配置策略

继续向下滚动,找到 [sshd],添加 enabled = true,然后改一下端口 port,改成目标端口:

1
2
3
[sshd]
enabled = true
port = 11451

如果你的系统是基于 systemd 的(systemctl 命令可用),那么把 backend 改成下面这样:

1
backend = systemd

如果你的系统不用 systemd,还是传统的行为,会把访问日志放在文件里,那么把 logpath 改成这样:

1
logpath = /var/log/auth.log

请注意,不同系统上面的路径可能不一样。请自行查询你的系统使用的认证日志的路径,切忌直接复制。

下面是我的系统使用的配置,debian 12 是基于 systemd 的系统:

示例配置

保存,重启 fail2ban,并检查状态:

1
2
sudo systemctl restart fail2ban
sudo systemctl status fail2ban

如果显示绿的 active (running),说明你的配置完全正确!如果出错了,不妨问问 AI 或者寻求技术大佬的帮助。

正在运行的 fail2ban

过一段时间再来看,如果你的 VPS 被扫到了,下面的命令应该会显示被封禁的 IP:

1
sudo fail2ban-client status

至此,你的 VPS 已经相当安全了,本文也就到此为止,你可以继续部署你想要的服务,然后睡个好觉了!

别忘了防火墙!

你在刚才操作的过程中可能用上了 ufw。如果需要开放端口,请执行 ufw allow 命令,别把自己和正常用户拦在外面了……