feat(backend): 实施连接与数据层速率限制
为了增强服务的稳定性和安全性,防止滥用行为,本次提交引入了两个核心的速率限制和验证机制: 1. **连接层验证 (`onConnect`)** - **IP 速率限制**:在 `connectionValidator.js` 中实现。限制单个 IP 地址每分钟最多 20 次连接,超过限制将临时封禁 5 分钟,以防御暴力连接攻击。 - **反向 DNS (PTR) 检查**:要求所有公共网络连接必须具有有效的 PTR 记录,用于区分合法邮件服务器和僵尸网络。 2. **数据层验证 (`onData`)** - **发件人域速率限制**:在 `rateLimiter.js` 中实现。在邮件数据传输阶段,限制单个发件人域名每分钟最多发送 10 封邮件,超过限制的域名将被临时封禁 5 分钟,以防止单一来源的邮件泛滥。 **主要变更:** - 新增 `backend/connectionValidator.js`:处理连接时的 IP 速率限制和 PTR 验证。 - 新增 `backend/rateLimiter.js`:在 `onData` 阶段对发件人域名进行速率限制。 - 在 `backend/app.js` 的 `SMTPServer` 配置中集成了 `onConnect` 验证钩子。 - 在 `backend/saveEmail.js` 中调用速率限制器,并在超限时拒绝邮件。 - 更新日志模块 (`logger.js`, `db.js`),输出更清晰,并记录安全相关事件。 - 新增 `backend/SECURITY_POLICIES.md` 文档,详细说明所有安全策略和可配置参数。
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
# 邮件接收服务安全策略文档
|
||||
|
||||
本文档详细说明了为保护邮件接收服务而实施的各项安全与反滥用策略。这些策略旨在构建一个多层次的纵深防御体系,有效过滤垃圾邮件和恶意连接,同时保障服务的稳定性和安全性。
|
||||
|
||||
## 1. 连接层防御策略 (Connection-Level Policies)
|
||||
|
||||
这些策略在SMTP连接建立的最初阶段 (`onConnect`) 生效,以便在消耗最少资源的情况下,快速拒绝掉可疑的连接。
|
||||
|
||||
### 1.1 IP 地址频率限制 (IP-based Rate Limiting)
|
||||
|
||||
- **作用**: 防止单个IP地址在短时间内发起大量连接,有效遏制暴力攻击和自动化脚本滥用。
|
||||
- **策略**:
|
||||
- **限制**: 每个IP地址每分钟最多允许 **20** 次连接。
|
||||
- **惩罚**: 超过限制的IP地址将被封禁 **5** 分钟。
|
||||
- **日志**:
|
||||
- 当IP被封禁时,会记录一条警告日志。
|
||||
- 当连接因为IP被封禁或超速而被拒绝时,会记录一条警告日志。
|
||||
- **SMTP响应码**: `421` (服务不可用,请稍后重试)
|
||||
- **配置文件**: `backend/connectionValidator.js`
|
||||
|
||||
### 1.2 反向DNS检查 (PTR Record Check)
|
||||
|
||||
- **作用**: 验证连接来源IP是否拥有一个有效的反向DNS(PTR)记录。这是区分正规邮件服务器和僵尸网络/垃圾邮件程序的有效手段。
|
||||
- **策略**:
|
||||
- 所有连接到本服务的公网IP地址,都必须拥有一个可解析的PTR记录。
|
||||
- 对于没有PTR记录的连接,将直接拒绝。
|
||||
- 本地和私有网络地址 (`127.0.0.1`, `10.x.x.x`, `192.168.x.x`, `::1`) 会被自动豁免。
|
||||
- **日志**:
|
||||
- 成功或失败的PTR查询都会被记录。
|
||||
- **SMTP响应码**: `550` (请求的操作未执行,连接源不可信)
|
||||
- **配置文件**: `backend/connectionValidator.js`
|
||||
|
||||
---
|
||||
|
||||
## 2. 数据层防御策略 (Data-Level Policies)
|
||||
|
||||
这些策略在SMTP连接建立后,客户端开始发送邮件数据时 (`onData`) 生效,提供更精细的控制。
|
||||
|
||||
### 2.1 发件人域名频率限制 (Sender Domain Rate Limiting)
|
||||
|
||||
- **作用**: 在IP层验证通过后,进一步限制来自**同一个发件人域名**的邮件接收频率。这可以防止某个合法来源(例如一个大型邮件服务提供商)下的单一账户被滥用。
|
||||
- **策略**:
|
||||
- **限制**: 每个发件人域名每分钟最多允许接收 **10** 封邮件。
|
||||
- **惩罚**: 超过限制的域名将被封禁 **5** 分钟。
|
||||
- **日志**:
|
||||
- 当域名被封禁时,会记录一条警告日志。
|
||||
- 当邮件因为域名被封禁或超速而被拒绝时,会记录一条警告日志。
|
||||
- **SMTP响应码**: `421` (服务不可用,因策略限制请稍后重试)
|
||||
- **配置文件**: `backend/rateLimiter.js`
|
||||
|
||||
---
|
||||
|
||||
## 3. 传输层安全 (Transport-Layer Security)
|
||||
|
||||
### 3.1 启用 STARTTLS
|
||||
|
||||
- **作用**: 允许客户端将一个普通的SMTP连接升级为安全的TLS加密连接。这可以保护邮件内容在传输过程中不被窃听或篡改。
|
||||
- **策略**:
|
||||
- 服务器在25端口上宣告支持 `STARTTLS`。
|
||||
- 优先使用加密连接。
|
||||
- **配置文件**: `backend/app.js` (在 `SMTPServer` 的配置中)
|
||||
|
||||
---
|
||||
|
||||
## 4. 可配置参数详解
|
||||
|
||||
下表详细解释了各项策略中的可配置参数,您可以根据实际需求在对应的文件中进行调整。
|
||||
|
||||
| 参数 (Parameter) | 所在文件 (File Location) | 作用描述 | 默认值 | 单位 (Unit) |
|
||||
| --------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------- | ------------------ | -------------------- |
|
||||
| `IP_RATE_LIMIT` | `backend/connectionValidator.js` | 在指定时间窗口内,单个IP允许的最大**连接次数**。 | `20` | 次 (Connections) |
|
||||
| `IP_TIME_WINDOW` | `backend/connectionValidator.js` | IP频率限制的时间窗口。 | `60 * 1000` | 毫秒 (1 分钟) |
|
||||
| `IP_BAN_DURATION` | `backend/connectionValidator.js` | IP因超速被封禁的持续时间。 | `5 * 60 * 1000` | 毫秒 (5 分钟) |
|
||||
| `RATE_LIMIT` | `backend/rateLimiter.js` | 在指定时间窗口内,单个**发件人域名**允许的最大**邮件数量**。 | `10` | 封 (Emails) |
|
||||
| `TIME_WINDOW` | `backend/rateLimiter.js` | 域名频率限制的时间窗口。 | `60 * 1000` | 毫秒 (1 分钟) |
|
||||
| `BAN_DURATION` | `backend/rateLimiter.js` | 域名因超速被封禁的持续时间。 | `5 * 60 * 1000` | 毫秒 (5 分钟) |
|
||||
Reference in New Issue
Block a user