前言:一次凌晨两点的惊魂
说起安全问题,我永远忘不了那个凌晨两点。
手机突然震动,睁开眼一看,是 HestiaCP 发来的邮件:"Warning: Multiple failed login attempts detected"(警告:检测到多次登录失败)。我一个激灵坐起来,赶紧打开电脑登录服务器。
后台日志显示,有人在短短 5 分钟内尝试了 237 次登录!好在我提前设置了 Fail2Ban 和 双因素认证,攻击者最终没能进来。但那一刻,我真切地感受到了"裸奔在互联网上"的恐惧。
从那以后,我对服务器安全变得格外重视。今天这篇文章,我会把自己踩过的坑、学到的经验,毫无保留地分享给你。
一、用户管理:别把鸡蛋都放在一个篮子里
管理员账户 vs 普通用户:你真的需要区分吗?
刚装完 HestiaCP 时,我图方便,所有网站、邮箱、数据库都用 admin 管理员账户创建。看起来挺好,一个账户管理所有东西,简单明了。
但问题来了:
有一次,我帮朋友在我的服务器上建了个网站。我把 admin 密码告诉了他,方便他自己上传文件、配置网站。结果呢?他一不小心点错了按钮,把我的另一个网站的数据库给删了!😭
那一刻我才明白,权限分离有多重要。
正确的做法:为每个项目创建独立用户
HestiaCP 支持两种账户类型:
| 账户类型 | 权限范围 | 适用场景 |
|---|---|---|
| 管理员(admin) | 服务器完全控制权,能管理所有用户 | 只给自己用 |
| 普通用户 | 只能管理自己的资源(网站、邮箱、数据库) | 给客户、朋友、不同项目用 |
我的实战经验:
- admin:只管理面板设置、系统更新、防火墙,不建站
- blog:专门管理我的个人博客
- m2u:专门管理临时邮箱网站
- friend01:给朋友用的独立账户
这样,即使某个账户被入侵,也不会影响其他网站。而且朋友操作失误,也只会影响他自己的资源。
如何创建普通用户
操作步骤:
- 用
admin登录面板 - 点击左侧 USER → Add User
填写信息:
- Username:比如
project01 - Password:用密码生成器生成强密码
- Email:填你的邮箱(用来接收通知)
- Package:选择一个套餐(后面会讲)
- Username:比如
- 点 Save 完成
创建后,这个用户可以用 https://你的IP:8083 登录,但只能看到和管理自己的资源。
套餐(Package):限制用户能用多少资源
这是 HestiaCP 的一个很贴心的功能。你可以为每个用户设置"套餐",限制他能创建多少个网站、邮箱、数据库等。
默认套餐(default)的限制:
- 网站:无限
- 邮箱域名:无限
- 数据库:无限
- FTP 账户:无限
- Cron 任务:无限
这显然不合理!如果给客户用,他一不小心创建几百个邮箱,服务器直接被拖垮。
我的套餐配置案例:
小型网站套餐(适合个人博客):
- 网站:3 个
- 邮箱域名:1 个
- 邮箱账户:5 个
- 数据库:5 个
- 磁盘配额:5GB
中型项目套餐(适合小公司):
- 网站:10 个
- 邮箱域名:3 个
- 邮箱账户:20 个
- 数据库:10 个
- 磁盘配额:20GB
如何创建套餐:
- 点击 Packages → Add Package
- 填写套餐名和各项限制
- 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 账户密码
方法一:通过面板修改(推荐)
- 登录面板后,点击右上角头像
- 点击 Edit User
- 在 Password 栏输入新密码
- 点 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
步骤一:启用功能
- 登录面板,点击右上角头像 → Edit User
- 勾选 Enable two-factor authentication
- 点击右上角 Save
步骤二:配置认证器
- 保存后会显示一个二维码
- 打开手机上的认证器 APP(推荐下面几个)
- 扫描二维码
- 输入 APP 生成的 6 位数字验证码
- 一定要保存恢复代码!(屏幕上会显示一组代码)
步骤三:测试
- 退出登录
- 重新登录,这次除了密码,还需要输入认证器的 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 白名单
- 登录面板,点击右上角头像 → Edit User
- 找到 Access restrictions 部分
在 Allowed IP addresses for login 填入你的 IP(多个用逗号分隔)
- 比如:
123.45.67.89, 203.0.113.10
- 比如:
- 点 Save
如何查看自己的 IP:
- 访问 https://ipinfo.io/ip
- 或者在命令行输入
curl ifconfig.me
⚠️ 重要提醒:设置前,先确认你的 IP 是静态的!不然自己把自己锁外面了。
五、防暴力破解:Fail2Ban 的威力
什么是 Fail2Ban?
Fail2Ban 是 HestiaCP 自带的安全组件,它会监控登录日志,如果发现某个 IP 短时间内多次登录失败,就会自动把这个 IP 加入黑名单,禁止访问。
默认规则:
- 10 分钟内登录失败 5 次,封禁该 IP 10 分钟
- 如果继续尝试,封禁时间会越来越长(最长永久封禁)
我是怎么发现 Fail2Ban 救了我一命的
文章开头说的那次凌晨攻击,就是 Fail2Ban 挡下来的。
我后来查看 Fail2Ban 的日志,发现那个 IP 尝试了 237 次登录后,被永久封禁了。如果没有 Fail2Ban,攻击者可能会一直尝试下去,总有一天会碰对密码(虽然我的密码很强,但万一呢)。
如何查看 Fail2Ban 状态
方法一:通过面板查看(简单)
- 点击 SERVER → Firewall
- 看 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(比如不小心把自己封了)
方法一:通过面板解封
- 点击 SERVER → Firewall
- 找到被封禁的 IP,点击后面的 × 删除
方法二:通过命令行解封
# 解封某个 IP
sudo /usr/local/hestia/bin/v-delete-firewall-ban 被封禁的IP
# 或者用 Fail2Ban 命令
sudo fail2ban-client set sshd unbanip 被封禁的IP调整 Fail2Ban 的封禁规则
如果你觉得默认规则太严格(比如自己不小心输错密码几次就被封),可以调整:
- SSH 连上服务器
编辑配置文件:
sudo nano /etc/fail2ban/jail.local找到
[hestia]部分,修改:[hestia] enabled = true port = 8083 filter = hestia logpath = /var/log/hestia/auth.log maxretry = 10 # 失败次数改为 10 次(原来是 5 次) bantime = 600 # 封禁时间改为 10 分钟(原来可能更长) findtime = 600 # 在 10 分钟内计算失败次数重启 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 自带备份功能,但默认是关闭的!很多人不知道,直到数据丢了才想起来备份。
如何开启自动备份
- 点击 SERVER → Settings
- 找到 Backup 部分
设置:
- Backup directory:备份存放位置(默认
/backup) - Backup retention:保留几天的备份(我设置 7 天)
- Backup schedule:备份时间(建议凌晨 3 点,网站访问量少)
- Backup directory:备份存放位置(默认
- 点 Save
我的备份策略
本地备份(HestiaCP 自动):
- 每天凌晨 3 点自动备份
- 保留最近 7 天的备份
异地备份(手动):
- 每周日把备份下载到本地电脑
- 上传一份到 OneDrive
重要数据额外备份:
- 数据库每天导出,存到 GitHub 私有仓库(用脚本自动化)
为什么要异地备份?
万一服务器硬盘坏了,或者机房火灾(虽然概率极低),本地备份也一起没了。异地备份才是真正的保险。
八、安全检查清单:每月必做的事
我在手机日历里设置了提醒,每月 1 号做这些安全检查:
- [ ] 检查系统更新(SERVER → UPDATES)
- [ ] 查看 Fail2Ban 封禁记录,有没有异常 IP
- [ ] 查看登录日志(SERVER → Logs),有没有陌生 IP 登录成功
- [ ] 测试备份是否正常(下载一个备份文件试试能不能解压)
- [ ] 检查磁盘空间是否充足(
df -h) - [ ] 更新一次重要账户的密码
- [ ] 测试 2FA 恢复代码是否有效
每次检查只需要 10 分钟,但能避免 99% 的安全问题。
九、我的安全配置总结
经过一年多的实战,我的 HestiaCP 安全配置如下:
✅ 账户管理:
- admin 只管理系统,不建站
- 每个项目用独立用户
- 所有账户密码 16 位以上,存在 Bitwarden
✅ 认证安全:
- admin 账户开启 2FA
- 重要用户账户也开启 2FA
- 恢复代码打印出来,存在保险柜
✅ 访问控制:
- SSH 端口改成 2222
- 禁止 root 直接登录
- Fail2Ban 保持默认规则
✅ 监控告警:
- 开启邮件通知(登录、Fail2Ban 封禁等)
- 每周查看一次日志
✅ 备份策略:
- 每天自动本地备份
- 每周手动异地备份
- 重要数据库单独备份到 GitHub
一年多来,零安全事故。
十、总结:安全是一种习惯
安全不是一次性的事情,而是一种习惯。
你可以有最强的密码、最严格的防火墙,但如果不定期检查、不及时更新,迟早会出问题。
我的建议:
- 刚装完 HestiaCP 的第一天,就按照本文配置好安全设置
- 每个月 1 号,做一次安全检查
- 遇到安全新闻(比如某个软件爆出漏洞),第一时间检查自己有没有用
- 别怕麻烦,开启 2FA、设置强密码,这些"麻烦"能救你的命
最后,记住一句话:亡羊补牢,为时已晚。未雨绸缪,才是王道。
📚 HestiaCP 完整系列教程
本文是 HestiaCP 实战系列 的第 2 篇,完整系列包括:
- 折腾 HestiaCP:从零到拥有自己的服务器面板
- 👉 HestiaCP 安全血泪史:保护服务器的实战经验(本文)
- HestiaCP 建站实战:从买域名到网站上线
- HestiaCP 自建邮局:从 M2U 临时邮箱的诞生说起
有问题? 欢迎在评论区留言。如果这篇文章帮到了你,欢迎分享给更多人!