前言:一次凌晨两点的惊魂

说起安全问题,我永远忘不了那个凌晨两点。

手机突然震动,睁开眼一看,是 HestiaCP 发来的邮件:"Warning: Multiple failed login attempts detected"(警告:检测到多次登录失败)。我一个激灵坐起来,赶紧打开电脑登录服务器。

后台日志显示,有人在短短 5 分钟内尝试了 237 次登录!好在我提前设置了 Fail2Ban双因素认证,攻击者最终没能进来。但那一刻,我真切地感受到了"裸奔在互联网上"的恐惧。

从那以后,我对服务器安全变得格外重视。今天这篇文章,我会把自己踩过的坑、学到的经验,毫无保留地分享给你。

一、用户管理:别把鸡蛋都放在一个篮子里

管理员账户 vs 普通用户:你真的需要区分吗?

刚装完 HestiaCP 时,我图方便,所有网站、邮箱、数据库都用 admin 管理员账户创建。看起来挺好,一个账户管理所有东西,简单明了。

但问题来了

有一次,我帮朋友在我的服务器上建了个网站。我把 admin 密码告诉了他,方便他自己上传文件、配置网站。结果呢?他一不小心点错了按钮,把我的另一个网站的数据库给删了!😭

那一刻我才明白,权限分离有多重要

正确的做法:为每个项目创建独立用户

HestiaCP 支持两种账户类型:

账户类型权限范围适用场景
管理员(admin)服务器完全控制权,能管理所有用户只给自己用
普通用户只能管理自己的资源(网站、邮箱、数据库)给客户、朋友、不同项目用

我的实战经验

  • admin:只管理面板设置、系统更新、防火墙,不建站
  • blog:专门管理我的个人博客
  • m2u:专门管理临时邮箱网站
  • friend01:给朋友用的独立账户

这样,即使某个账户被入侵,也不会影响其他网站。而且朋友操作失误,也只会影响他自己的资源。

如何创建普通用户

操作步骤

  1. admin 登录面板
  2. 点击左侧 USERAdd User
  3. 填写信息:

    • Username:比如 project01
    • Password:用密码生成器生成强密码
    • Email:填你的邮箱(用来接收通知)
    • Package:选择一个套餐(后面会讲)
  4. Save 完成

创建后,这个用户可以用 https://你的IP:8083 登录,但只能看到和管理自己的资源。

套餐(Package):限制用户能用多少资源

这是 HestiaCP 的一个很贴心的功能。你可以为每个用户设置"套餐",限制他能创建多少个网站、邮箱、数据库等。

默认套餐(default)的限制

  • 网站:无限
  • 邮箱域名:无限
  • 数据库:无限
  • FTP 账户:无限
  • Cron 任务:无限

这显然不合理!如果给客户用,他一不小心创建几百个邮箱,服务器直接被拖垮。

我的套餐配置案例

小型网站套餐(适合个人博客):

  • 网站:3 个
  • 邮箱域名:1 个
  • 邮箱账户:5 个
  • 数据库:5 个
  • 磁盘配额:5GB

中型项目套餐(适合小公司):

  • 网站:10 个
  • 邮箱域名:3 个
  • 邮箱账户:20 个
  • 数据库:10 个
  • 磁盘配额:20GB

如何创建套餐

  1. 点击 PackagesAdd Package
  2. 填写套餐名和各项限制
  3. Save 后,创建用户时就可以选择这个套餐

二、密码安全:90% 的攻击都是因为弱密码

我曾经用过的"弱智密码"

坦白说,刚开始玩 VPS 时,我的密码习惯很差:

  • 博客后台:admin123(现在看起来简直是送人头)
  • 数据库密码:123456(经典弱密码榜首)
  • FTP 密码:password(我都不好意思承认)

直到有一天,我的一个测试网站被黑了。攻击者通过暴力破解 FTP 密码登录,上传了一个挖矿脚本,把我的服务器 CPU 跑满,网站直接打不开。

那次教训让我彻底改变了密码习惯。

什么样的密码才算强密码?

HestiaCP 的密码要求其实很宽松:

  • 最少 8 个字符
  • 至少 1 个数字
  • 至少 1 个大写字母和 1 个小写字母

但这远远不够!现在的暴力破解工具,每秒能尝试几万个密码组合。

我的密码标准

  • 至少 16 位(越长越安全)
  • 包含大小写字母、数字、特殊符号
  • 每个账户用不同的密码(用密码管理器记录)
  • 定期更换(至少半年一次)

示例

  • ❌ 弱密码:Admin123
  • ❌ 一般密码:Admin123!
  • ✅ 强密码:K9$mP#2v@Qx7Ln4%

密码管理工具推荐

不要试图用脑子记这些复杂密码,用密码管理器!

工具优点缺点我的评价
Bitwarden开源免费,多平台同步界面略简陋⭐⭐⭐⭐⭐ 我在用
1Password功能强大,颜值高需要付费⭐⭐⭐⭐ 值得投资
LastPass老牌工具,免费版够用曾经被黑过⭐⭐⭐ 凑合
KeePass完全本地,最安全不支持云同步(除非自己搞)⭐⭐⭐⭐ 极客之选

我自己用的是 Bitwarden,开源、免费、跨平台,还能自动填充密码,香得很。

如何修改 HestiaCP 账户密码

方法一:通过面板修改(推荐)

  1. 登录面板后,点击右上角头像
  2. 点击 Edit User
  3. Password 栏输入新密码
  4. Save

方法二:通过 SSH 命令行修改(忘记密码时用)

# 修改 admin 用户的密码
sudo /usr/local/hestia/bin/v-change-user-password admin '新密码'

# 修改其他用户的密码
sudo /usr/local/hestia/bin/v-change-user-password 用户名 '新密码'

三、双因素认证(2FA):保命的最后一道防线

为什么 2FA 这么重要?

即使你的密码再强,也可能通过这些方式泄露:

  • 钓鱼网站骗取
  • 数据库泄露(某些网站被黑,你的邮箱和密码一起泄露)
  • 键盘记录木马
  • 中间人攻击

但有了 2FA(双因素认证),即使密码泄露,攻击者也登不进去。因为他还需要你手机上的动态验证码

我的 2FA 血泪史

第一次被暴力攻击后,我立刻开启了 2FA。没想到一个月后,我自己把自己坑了……

那天我换了新手机,忘记提前备份认证器数据。结果,我自己登不进面板了!😭

幸好我保存了恢复代码(Recovery Codes),用恢复代码登录后重新配置了 2FA。

教训:开启 2FA 后,一定要保存恢复代码!最好打印出来,或者存在密码管理器里。

如何启用 2FA

步骤一:启用功能

  1. 登录面板,点击右上角头像 → Edit User
  2. 勾选 Enable two-factor authentication
  3. 点击右上角 Save

步骤二:配置认证器

  1. 保存后会显示一个二维码
  2. 打开手机上的认证器 APP(推荐下面几个)
  3. 扫描二维码
  4. 输入 APP 生成的 6 位数字验证码
  5. 一定要保存恢复代码!(屏幕上会显示一组代码)

步骤三:测试

  1. 退出登录
  2. 重新登录,这次除了密码,还需要输入认证器的 6 位验证码

认证器 APP 推荐

APP优点缺点我的选择
Google Authenticator简单好用不支持云备份(iOS 版支持)⭐⭐⭐⭐
Microsoft Authenticator支持云备份,可以用生物识别需要微软账号⭐⭐⭐⭐⭐ 我在用
Authy多设备同步,有桌面版界面有点乱⭐⭐⭐⭐
Bitwarden Authenticator和密码管理器集成相对小众⭐⭐⭐⭐

我现在用 Microsoft Authenticator,因为它支持云备份,换手机时不用担心丢失。

2FA 的最佳实践

同时在两个设备上配置:手机和平板都扫码,万一手机丢了还有备份
保存恢复代码:打印出来,或存在密码管理器里
定期测试:每个月试一次用恢复代码登录,确保它们还有效
不要只依赖一个设备:手机丢了就哭了
不要把恢复代码存在服务器上:服务器被黑就完了

四、IP 白名单:只允许自己登录

什么是 IP 白名单?

简单说,就是只允许特定 IP 地址登录面板,其他 IP 直接拒绝。

适用场景

  • 你只在家里或公司固定网络登录
  • 想防止暴力破解攻击
  • 服务器管理员不会经常出差

不适用场景

  • 你经常换地方(咖啡厅、机场)
  • 用的是动态 IP(家庭宽带 IP 经常变)
  • 有多个管理员,分布在不同地方

我的 IP 白名单翻车记

曾经,我给 admin 账户设置了 IP 白名单,只允许我家里的宽带 IP 登录。

结果有一天,我在外地出差,博客网站突然打不开了!我想登录面板看看,结果被提示"IP 地址不在白名单"……

最后只能给客服打电话,让他们帮我重置白名单。从此我学乖了:

  • admin 账户不设白名单(开 2FA 就够了)
  • 普通用户可以设白名单(比如给客户用的账户)

如何设置 IP 白名单

  1. 登录面板,点击右上角头像 → Edit User
  2. 找到 Access restrictions 部分
  3. Allowed IP addresses for login 填入你的 IP(多个用逗号分隔)

    • 比如:123.45.67.89, 203.0.113.10
  4. Save

如何查看自己的 IP

⚠️ 重要提醒:设置前,先确认你的 IP 是静态的!不然自己把自己锁外面了。

五、防暴力破解:Fail2Ban 的威力

什么是 Fail2Ban?

Fail2Ban 是 HestiaCP 自带的安全组件,它会监控登录日志,如果发现某个 IP 短时间内多次登录失败,就会自动把这个 IP 加入黑名单,禁止访问。

默认规则

  • 10 分钟内登录失败 5 次,封禁该 IP 10 分钟
  • 如果继续尝试,封禁时间会越来越长(最长永久封禁)

我是怎么发现 Fail2Ban 救了我一命的

文章开头说的那次凌晨攻击,就是 Fail2Ban 挡下来的。

我后来查看 Fail2Ban 的日志,发现那个 IP 尝试了 237 次登录后,被永久封禁了。如果没有 Fail2Ban,攻击者可能会一直尝试下去,总有一天会碰对密码(虽然我的密码很强,但万一呢)。

如何查看 Fail2Ban 状态

方法一:通过面板查看(简单)

  1. 点击 SERVERFirewall
  2. Banned IP addresses 列表

方法二:通过命令行查看(详细)

# 查看被封禁的 IP
sudo /usr/local/hestia/bin/v-list-firewall-ban

# 查看 Fail2Ban 状态
sudo systemctl status fail2ban

# 查看某个服务的封禁记录(比如 SSH)
sudo fail2ban-client status sshd

如何解封 IP(比如不小心把自己封了)

方法一:通过面板解封

  1. 点击 SERVERFirewall
  2. 找到被封禁的 IP,点击后面的 × 删除

方法二:通过命令行解封

# 解封某个 IP
sudo /usr/local/hestia/bin/v-delete-firewall-ban 被封禁的IP

# 或者用 Fail2Ban 命令
sudo fail2ban-client set sshd unbanip 被封禁的IP

调整 Fail2Ban 的封禁规则

如果你觉得默认规则太严格(比如自己不小心输错密码几次就被封),可以调整:

  1. SSH 连上服务器
  2. 编辑配置文件:

    sudo nano /etc/fail2ban/jail.local
  3. 找到 [hestia] 部分,修改:

    [hestia]
    enabled = true
    port = 8083
    filter = hestia
    logpath = /var/log/hestia/auth.log
    maxretry = 10          # 失败次数改为 10 次(原来是 5 次)
    bantime = 600          # 封禁时间改为 10 分钟(原来可能更长)
    findtime = 600         # 在 10 分钟内计算失败次数
  4. 重启 Fail2Ban:

    sudo systemctl restart fail2ban

我的建议:如果你经常输错密码(比如记不住密码管理器的主密码😅),可以把 maxretry 改成 10。但不要改太高,不然就失去保护作用了。

六、SSH 安全:别让 22 端口裸奔

为什么要改 SSH 端口?

SSH 默认端口是 22,全世界的攻击者都知道。你的服务器刚上线,就会有无数扫描脚本尝试连接 22 端口,暴力破解 root 密码。

改掉 SSH 端口后

  • 90% 的自动化攻击会跳过你的服务器(因为他们只扫 22 端口)
  • 日志清爽很多,不用看一堆"Failed password for root"

如何修改 SSH 端口

步骤一:修改 SSH 配置

sudo nano /etc/ssh/sshd_config

找到这一行(可能被注释掉了):

#Port 22

改成:

Port 2222   # 或者其他端口,1024-65535 之间随便选

步骤二:在防火墙开放新端口

sudo /usr/local/hestia/bin/v-add-firewall-rule accept 2222 tcp

步骤三:重启 SSH 服务

sudo systemctl restart sshd

步骤四:测试新端口能否连接

⚠️ 重要:不要关闭当前 SSH 连接!新开一个窗口测试:

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

如果能连上,才关闭旧窗口。不然改错了,你就连不上服务器了!

步骤五:关闭 22 端口

sudo /usr/local/hestia/bin/v-delete-firewall-rule 1   # 删除 22 端口的规则

我的 SSH 安全配置

除了改端口,我还做了这些:

1. 禁止 root 直接登录

sudo nano /etc/ssh/sshd_config

找到:

PermitRootLogin yes

改成:

PermitRootLogin no

然后创建一个普通用户,用普通用户登录后再 sudo su 切换到 root。

2. 禁用密码登录,只用 SSH 密钥

这个更安全,但设置稍微复杂一点。简单说就是:

  • 在你的电脑上生成一对密钥(公钥和私钥)
  • 把公钥放到服务器上
  • 以后登录不用密码,用私钥认证

3. 安装 SSH 连接通知

我写了个脚本,每次有人 SSH 登录服务器,就给我发邮件通知。这样如果不是我自己登录,我能第一时间知道。

七、定期备份:别等数据丢了才后悔

安全不仅是防止被攻击,还要防止意外删除、硬盘故障等情况。

HestiaCP 自带备份功能,但默认是关闭的!很多人不知道,直到数据丢了才想起来备份。

如何开启自动备份

  1. 点击 SERVERSettings
  2. 找到 Backup 部分
  3. 设置:

    • Backup directory:备份存放位置(默认 /backup
    • Backup retention:保留几天的备份(我设置 7 天)
    • Backup schedule:备份时间(建议凌晨 3 点,网站访问量少)
  4. Save

我的备份策略

本地备份(HestiaCP 自动):

  • 每天凌晨 3 点自动备份
  • 保留最近 7 天的备份

异地备份(手动):

  • 每周日把备份下载到本地电脑
  • 上传一份到 OneDrive

重要数据额外备份

  • 数据库每天导出,存到 GitHub 私有仓库(用脚本自动化)

为什么要异地备份?
万一服务器硬盘坏了,或者机房火灾(虽然概率极低),本地备份也一起没了。异地备份才是真正的保险。

八、安全检查清单:每月必做的事

我在手机日历里设置了提醒,每月 1 号做这些安全检查:

  • [ ] 检查系统更新(SERVERUPDATES
  • [ ] 查看 Fail2Ban 封禁记录,有没有异常 IP
  • [ ] 查看登录日志(SERVERLogs),有没有陌生 IP 登录成功
  • [ ] 测试备份是否正常(下载一个备份文件试试能不能解压)
  • [ ] 检查磁盘空间是否充足(df -h
  • [ ] 更新一次重要账户的密码
  • [ ] 测试 2FA 恢复代码是否有效

每次检查只需要 10 分钟,但能避免 99% 的安全问题。

九、我的安全配置总结

经过一年多的实战,我的 HestiaCP 安全配置如下:

账户管理

  • admin 只管理系统,不建站
  • 每个项目用独立用户
  • 所有账户密码 16 位以上,存在 Bitwarden

认证安全

  • admin 账户开启 2FA
  • 重要用户账户也开启 2FA
  • 恢复代码打印出来,存在保险柜

访问控制

  • SSH 端口改成 2222
  • 禁止 root 直接登录
  • Fail2Ban 保持默认规则

监控告警

  • 开启邮件通知(登录、Fail2Ban 封禁等)
  • 每周查看一次日志

备份策略

  • 每天自动本地备份
  • 每周手动异地备份
  • 重要数据库单独备份到 GitHub

一年多来,零安全事故。

十、总结:安全是一种习惯

安全不是一次性的事情,而是一种习惯。

你可以有最强的密码、最严格的防火墙,但如果不定期检查、不及时更新,迟早会出问题。

我的建议

  1. 刚装完 HestiaCP 的第一天,就按照本文配置好安全设置
  2. 每个月 1 号,做一次安全检查
  3. 遇到安全新闻(比如某个软件爆出漏洞),第一时间检查自己有没有用
  4. 别怕麻烦,开启 2FA、设置强密码,这些"麻烦"能救你的命

最后,记住一句话:亡羊补牢,为时已晚。未雨绸缪,才是王道。


📚 HestiaCP 完整系列教程

本文是 HestiaCP 实战系列 的第 2 篇,完整系列包括:

  1. 折腾 HestiaCP:从零到拥有自己的服务器面板
  2. 👉 HestiaCP 安全血泪史:保护服务器的实战经验(本文)
  3. HestiaCP 建站实战:从买域名到网站上线
  4. HestiaCP 自建邮局:从 M2U 临时邮箱的诞生说起

有问题? 欢迎在评论区留言。如果这篇文章帮到了你,欢迎分享给更多人!

最后修改:2025 年 12 月 10 日
如果觉得我的文章对你有用,请随意赞赏