> ## Content Index
> Fetch the complete content index at: https://tbbbk.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# HestiaCP 安全血泪史：那些年我踩过的坑和保护服务器的经验
- URL: https://tbbbk.com/hestiacp-security-best-practices/
- Published: 2025-12-10T14:16:41.000Z
- Updated: 2025-12-10T14:16:41.000Z
- Author: TuBaiBai
- Tags: 建站与自托管, 折腾日记, #Import 2026-07-20 07:13

## 前言：一次凌晨两点的惊魂

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

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

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

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

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

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

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

**但问题来了**：

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

那一刻我才明白，**权限分离有多重要**。

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

HestiaCP 支持两种账户类型：

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

**我的实战经验**：

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

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

### 如何创建普通用户

**操作步骤**：

1. 用 `admin` 登录面板
2. 点击左侧 **USER** → **Add 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. 点击 **Packages** → **Add 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 命令行修改**（忘记密码时用）

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

```

## 三、双因素认证（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**：

- 访问 <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 状态

**方法一：通过面板查看（简单）**

1. 点击 **SERVER** → **Firewall**
2. 看 **Banned IP addresses** 列表

**方法二：通过命令行查看（详细）**

```bash
# 查看被封禁的 IP
sudo /usr/local/hestia/bin/v-list-firewall-ban
查看 Fail2Ban 状态
sudo systemctl status fail2ban
查看某个服务的封禁记录（比如 SSH）

```

### 如何解封 IP（比如不小心把自己封了）

**方法一：通过面板解封**

1. 点击 **SERVER** → **Firewall**
2. 找到被封禁的 IP，点击后面的 **×** 删除

**方法二：通过命令行解封**

```bash
# 解封某个 IP
sudo /usr/local/hestia/bin/v-delete-firewall-ban 被封禁的IP
或者用 Fail2Ban 命令

```

### 调整 Fail2Ban 的封禁规则

如果你觉得默认规则太严格（比如自己不小心输错密码几次就被封），可以调整：

1. SSH 连上服务器

编辑配置文件：

```bash
sudo nano /etc/fail2ban/jail.local
```

找到 `[hestia]` 部分，修改：

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

重启 Fail2Ban：

```bash
sudo systemctl restart fail2ban
```

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

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

### 为什么要改 SSH 端口？

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

**改掉 SSH 端口后**：

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

### 如何修改 SSH 端口

**步骤一：修改 SSH 配置**

```bash
sudo nano /etc/ssh/sshd_config
```

找到这一行（可能被注释掉了）：

```
#Port 22
```

改成：

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

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

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

**步骤三：重启 SSH 服务**

```bash
sudo systemctl restart sshd
```

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

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

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

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

**步骤五：关闭 22 端口**

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

### 我的 SSH 安全配置

除了改端口，我还做了这些：

**1\. 禁止 root 直接登录**

```bash
sudo nano /etc/ssh/sshd_config
```

找到：

```
PermitRootLogin yes
```

改成：

```
PermitRootLogin no
```

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

**2\. 禁用密码登录，只用 SSH 密钥**

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

- 在你的电脑上生成一对密钥（公钥和私钥）
- 把公钥放到服务器上
- 以后登录不用密码，用私钥认证

**3\. 安装 SSH 连接通知**

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

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

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

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

### 如何开启自动备份

1. 点击 **SERVER** → **Settings**
2. 找到 **Backup** 部分
3. 设置：

  - **Backup directory**：备份存放位置（默认 `/backup`）
  - **Backup retention**：保留几天的备份（我设置 7 天)
  - **Backup schedule**：备份时间（建议凌晨 3 点，网站访问量少）
4. 点 **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

**一年多来，零安全事故。**

## 十、总结：安全是一种习惯

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

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

**我的建议**：

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

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

---

## 📚 HestiaCP 完整系列教程

本文是 **HestiaCP 实战系列** 的第 2 篇，完整系列包括：

1. [折腾 HestiaCP：从零到拥有自己的服务器面板](https://tbbbk.com/archives/hestiacp-getting-started-guide)
2. 👉 **HestiaCP 安全血泪史：保护服务器的实战经验**（本文）
3. [HestiaCP 建站实战：从买域名到网站上线](https://tbbbk.com/archives/hestiacp-website-deployment-guide)
4. [HestiaCP 自建邮局：从 M2U 临时邮箱的诞生说起](https://tbbbk.com/archives/hestiacp-mail-server-setup-guide)

---

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