77 lines
5.0 KiB
Markdown
77 lines
5.0 KiB
Markdown
# 邮件接收服务安全策略文档
|
||
|
||
本文档详细说明了为保护邮件接收服务而实施的各项安全与反滥用策略。这些策略旨在构建一个多层次的纵深防御体系,有效过滤垃圾邮件和恶意连接,同时保障服务的稳定性和安全性。
|
||
|
||
## 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 分钟) |
|