VPS安全基础设置:新服务器到手后要做的8件事

蜗牛大人VPS教程

本文含推广链接:通过此链接购买,本站可获得佣金,不影响你的价格。

一台新开的VPS,接上公网之后几分钟内就会开始被扫描:有人在不停地尝试用各种密码登录root账号,探测有没有开放的面板和数据库端口。这不是针对你,而是互联网上自动化程序的日常,每一台服务器都会遇到。

用虚拟主机时,这些由主机商挡着。用VPS,要自己来。好消息是,做完下面8项基础设置,就能挡住绝大多数自动化的攻击。

序号设置作用优先级
1更新系统,开启自动安全更新修补已知漏洞必须
2修改SSH端口减少被扫描和暴力破解建议
3改用SSH密钥登录杜绝密码被猜中强烈建议
4配置防火墙只开放需要的端口必须
5安装Fail2ban自动封禁反复尝试登录的IP建议
6加固宝塔面板防止面板被入侵必须
7加固WordPress网站层面的防护必须
8设置备份最后一道保险必须

下面的命令以Debian和Ubuntu系统为例。

开始之前:别把自己锁在外面

修改SSH和防火墙设置时,操作不当会导致自己也登录不了服务器。记住三条:

  1. 修改SSH配置后,不要关闭当前的连接。另开一个新的终端窗口测试能否登录,确认可以之后再关闭旧窗口;
  2. 先放行新端口,再启用新端口;
  3. 万一真的被锁在外面,可以用VPS厂商后台的网页控制台登录:Hostinger VPS有浏览器终端,Vultr有View Console,它们不经过SSH。

做大的改动之前,可以先在厂商后台做一个快照。

1. 更新系统,开启自动安全更新

登录服务器后先更新:

apt update && apt upgrade -y

然后开启自动安全更新,让系统自己安装安全补丁:

apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades

在弹出的界面里选择Yes。之后系统每天会自动检查并安装安全更新,不需要再手动操作。

内核更新之后需要重启服务器才能生效。可以每一两个月找一个访问量低的时间,在面板里重启一次。

2. 修改SSH端口

SSH默认使用22端口,所有的扫描程序都会先试这个端口。换成一个不常见的端口,并不能挡住有针对性的攻击,但可以让日志里的暴力破解尝试减少九成以上。

用宝塔面板:在左侧菜单进入安全,找到SSH管理(有的版本在面板设置里),把SSH端口改成一个1024到65535之间的数字,比如 22622,保存。宝塔会自动在系统防火墙里放行新端口。

用命令行:先在防火墙里放行新端口(见第4项),然后编辑配置文件:

nano /etc/ssh/sshd_config

找到 #Port 22 这一行,改成 Port 22622,保存后重启SSH服务:

systemctl restart ssh

如果VPS厂商的后台也配置了防火墙规则,记得在那里同样放行新端口。之后登录时需要指定端口:

ssh -p 22622 root@你的服务器IP

3. 改用SSH密钥登录

密码可以被猜,密钥几乎不可能。密钥登录是一对文件:私钥留在你的电脑上,公钥放到服务器上,登录时由两者匹配验证。

第一步:在自己的电脑上生成密钥(Windows、macOS的终端里都可以执行):

ssh-keygen -t ed25519

一路回车即可,也可以给私钥设置一个密码。完成后在用户目录的 .ssh 文件夹里会有两个文件:id_ed25519 是私钥,不要给任何人;id_ed25519.pub 是公钥。

第二步:把公钥放到服务器上。macOS和Linux可以用一条命令完成:

ssh-copy-id -p 22622 root@你的服务器IP

Windows没有这个命令,可以用记事本打开 id_ed25519.pub,复制里面的整行内容,然后登录服务器,把它粘贴到 /root/.ssh/authorized_keys 文件里(用宝塔的文件管理器编辑也可以,文件不存在就新建一个)。

宝塔的SSH管理里也有“SSH密钥登录”的开关,开启后会生成一对密钥并让你下载私钥,效果是一样的。

第三步:测试。新开一个终端窗口登录服务器,如果不需要输入root密码就登录成功,说明密钥已经生效。

第四步:禁用密码登录。确认密钥可以登录之后,在宝塔的SSH管理里关闭“SSH密码登录”;或者编辑 /etc/ssh/sshd_config,设置:

PasswordAuthentication no

保存后执行 systemctl restart ssh。

禁用密码登录后,私钥是你登录服务器的唯一凭证,务必在别的地方备份一份。

4. 配置防火墙

防火墙的原则是:默认拒绝,只放行需要的端口。一台放网站的服务器,需要对外开放的端口只有这几个:

端口用途说明
80HTTP必须开放
443HTTPS必须开放
SSH端口远程登录你修改后的端口
面板端口宝塔面板最好只允许自己的IP访问

不应该对外开放的端口:3306(MySQL)、6379(Redis)、11211(Memcached)、888(phpMyAdmin)。数据库只需要被本机的网站访问,不需要暴露到公网。Redis暴露在公网又没有设置密码,是服务器被入侵的常见原因之一。

防火墙有两层,可以只用一层,也可以两层都用:

服务器上的防火墙。在宝塔的安全菜单里,系统防火墙页面列出了所有放行的端口。检查一遍,把不需要的规则删除,尤其是3306和888。需要远程管理数据库时,用宝塔自带的phpMyAdmin(通过面板访问),或者临时放行、用完删除。

不用宝塔的话,可以用ufw:

apt install ufw -y
ufw default deny incoming
ufw default allow outgoing
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 22622/tcp
ufw enable

VPS厂商后台的防火墙。Hostinger VPS和Vultr的后台都可以创建防火墙规则组并绑定到服务器。它在流量到达服务器之前就进行过滤,即使服务器内部的设置出了问题,这一层仍然有效。规则和上面一样:放行80、443、SSH端口和面板端口。

如果你的宽带有固定的公网IP,可以把SSH端口和面板端口设置成只允许这个IP访问,安全性会高很多。多数家庭宽带的IP是变化的,这种情况就不要限制IP,靠密钥登录和下面的Fail2ban来保护。

5. 安装Fail2ban

Fail2ban会监控登录日志,发现某个IP在短时间内多次登录失败,就自动把它封禁一段时间。

用宝塔面板:在软件商店里搜索“Fail2ban防爆破”,安装后打开,添加SSH防护:填写SSH端口,设置最大重试次数(比如5次)、周期(比如600秒)和禁止时间(比如86400秒,即一天)。

用命令行:

apt install fail2ban -y
systemctl enable --now fail2ban

默认配置已经启用了对SSH的保护。如果改过SSH端口,需要在 /etc/fail2ban/jail.local 里指定:

[sshd]
enabled = true
port = 22622
maxretry = 5
bantime = 1d

保存后执行 systemctl restart fail2ban。用 fail2ban-client status sshd 可以查看当前被封禁的IP。

6. 加固宝塔面板

宝塔面板拥有服务器的最高权限,面板被人登录,等于整台服务器被人控制。在面板的设置页面里检查这几项:

  • 面板端口:不要用默认的8888。新版本安装时已经是随机端口,旧版本需要手动修改,修改后记得在防火墙里放行新端口;
  • 安全入口:面板地址后面那一串随机字符,比如 /a8f3c2d1。不要关闭它,也不要改成 /admin 这种容易猜到的;
  • 面板用户名和密码:改掉安装时生成的默认值,使用强密码;
  • 面板SSL:开启,让登录过程加密;
  • 动态口令认证:开启后登录面板除了密码,还需要输入手机验证器App(Google Authenticator等)上的6位数字。强烈建议开启;
  • 授权IP:有固定IP的话,填入之后只有这个IP可以访问面板;
  • BasicAuth认证:在面板登录页面之前再加一层用户名和密码验证,可选。

另外:

  • 面板有更新时及时升级,面板本身也出过安全漏洞;
  • 只从面板的软件商店安装插件,不要使用来历不明的“破解版”“开心版”面板,它们往往带有后门;
  • 不要在公共电脑或者别人的设备上登录面板。

7. 加固WordPress

服务器再安全,WordPress层面有漏洞,网站一样会被入侵。实际上多数网站被黑,是因为WordPress的插件漏洞或者弱密码,而不是服务器被攻破。

  • 及时更新:WordPress核心、主题和插件都保持最新。可以在后台开启插件的自动更新;
  • 只用正规来源的主题和插件:从WordPress官方目录或者开发者官网下载。所谓的破解版付费主题和插件,是网站被植入恶意代码的头号来源;
  • 删除不用的主题和插件:停用还不够,没有用到的直接删除;
  • 管理员账号:用户名不要用admin,密码用随机生成的强密码,并开启两步验证;
  • 限制登录尝试次数:安装Limit Login Attempts Reloaded这类插件,或者用安全插件自带的功能;
  • 在后台禁止编辑文件:在 wp-config.php 里添加一行:
define('DISALLOW_FILE_EDIT', true);
  • 禁止上传目录执行PHP:攻击者常用的手法是把PHP木马伪装成图片上传。在宝塔的站点设置、配置文件里,在 server 段里加入:
location ~* ^/wp-content/uploads/.*\.php$ {
    deny all;
}
  • 使用Cloudflare:把域名接入Cloudflare并开启代理,可以隐藏服务器的真实IP,并获得基础的防火墙和DDoS防护。CDN的介绍见《什么是CDN?》。

宝塔还提供Nginx防火墙(WAF)插件,可以拦截常见的攻击请求,属于付费功能,按需选择。

8. 设置备份

所有的安全措施都只能降低风险,不能消除风险。备份是最后一道保险:即使服务器真的被入侵,也可以重装系统,再用备份把网站恢复回来。

设置方法见《宝塔面板备份与迁移网站》。要点是自动、异地、多份。

日常检查

设置完成之后,每个月花几分钟看一下:

  • 宝塔面板首页的安全风险提示,按建议处理;
  • 面板的操作日志和登录日志,有没有陌生IP登录;
  • CPU、内存、流量有没有异常升高。服务器被用来挖矿或者发垃圾邮件时,资源占用会突然变高;
  • 备份任务是否正常执行;
  • WordPress和插件有没有待安装的更新。

如果服务器已经被入侵

常见的迹象:网站被跳转到陌生网站,网站目录里出现不认识的PHP文件,CPU长期满载,VPS厂商发来滥用(Abuse)投诉邮件。

处理思路:

  1. 先把现有的网站文件和数据库备份下来,留作排查;
  2. 不要试图在原系统上“清理干净”,很难确认后门是否已经清除。稳妥的做法是重装系统;
  3. 重新安装环境,从确认干净的备份里恢复网站。如果没有干净的备份,只恢复数据库和 wp-content/uploads 里的图片,WordPress核心、主题和插件全部重新下载安装;
  4. 修改所有密码:root、宝塔、数据库、WordPress管理员;
  5. 找出入侵的原因(多数是过期的插件、破解主题或者弱密码),补上漏洞,再把本文的设置做一遍。

常见问题

改了SSH端口就安全了吗?

不是。改端口只是减少了被自动扫描到的机会,真正起作用的是密钥登录和防火墙。几项要配合起来。

需要安装杀毒软件吗?

一般不需要。Linux服务器上更重要的是及时更新、最小化开放端口和权限。Hostinger VPS自带的恶意软件扫描可以开着,宝塔的安全检测功能也可以定期跑一下。

这些设置太复杂了,有没有省事的办法?

有,用托管云主机。Cloudways这类服务把系统更新、防火墙、SSH安全、备份都包了,你只需要管好WordPress本身,代价是价格更高,见《Cloudways和自己管VPS哪个好?》。

总结

VPS的基础安全可以归纳为四句话:系统和软件保持更新,登录用密钥并限制尝试次数,防火墙只开放必要的端口,备份自动存到异地。再加上管好宝塔面板和WordPress本身,就能避开绝大多数自动化的攻击。

更多VPS教程见《VPS教程汇总》。

文章版权归作者所有,转载请注明出处:https://woniune.com/posts/vps-security-basics/

相关推荐