Files
dns-server/THREAT_ALERT_DESIGN.md
T
Alex Yang efebce3c39 whois
2026-04-01 12:22:55 +08:00

315 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 威胁告警功能设计方案
## 1. 功能概述
威胁告警功能旨在监控DNS查询中的可疑行为,检测潜在的安全威胁,并及时向管理员发出告警。该功能独立于屏蔽管理系统,专注于威胁检测和告警,不直接执行屏蔽操作。只有在威胁告警展示后,管理员才能选择屏蔽或放行操作。
## 2. 设计原则
- **低侵入性**:尽可能利用现有的代码结构和数据,最小化对现有功能的修改
- **可扩展性**:设计模块化的威胁检测引擎,便于添加新的检测规则
- **实时性**:实时监控和分析DNS查询,及时发现和告警
- **准确性**:减少误报,提高告警的准确性和可靠性
- **可配置性**:提供灵活的配置选项,允许管理员根据需要调整告警规则和阈值
## 3. 系统架构
### 3.1 核心组件
1. **威胁检测引擎**:负责分析DNS查询数据,检测可疑行为
2. **告警管理器**:管理告警的生成、存储和通知
3. **配置管理**:管理威胁检测规则和告警阈值
4. **API接口**:提供告警相关的API接口
5. **前端界面**:展示告警信息和威胁分析结果
6. **威胁域名数据库**:存储已知的威胁域名信息
### 3.2 数据流
```
DNS查询 → 威胁检测引擎 → 告警分析 → 告警存储 → API接口 → 前端展示 → 管理员操作(屏蔽/放行)
```
## 4. 功能设计
### 4.1 威胁检测规则
| 规则类型 | 检测内容 | 触发条件 | 严重程度 |
|---------|---------|---------|---------|
| 异常查询频率 | 单个客户端短时间内的查询频率 | 每分钟查询次数超过阈值(0表示不限制) | 中 |
| 可疑域名模式 | 包含恶意域名特征的查询 | 匹配预定义的恶意域名模式或威胁域名数据库 | 高 |
| DNS隧道检测 | 异常长的域名或包含特殊字符的域名 | 域名长度超过阈值(0表示不限制)或包含可疑字符 | 高 |
| 大量NXDOMAIN响应 | 短时间内大量域名不存在的响应 | 每分钟NXDOMAIN响应超过阈值(0表示不限制) | 中 |
| 异常查询类型 | 不常见的DNS查询类型 | 检测到不常见的查询类型 | 低 |
| 地理位置异常 | 来自异常地理位置的查询 | 查询来源IP的地理位置异常 | 中 |
### 4.2 告警级别
- **低**:可能的异常行为,需要关注但不紧急
- **中**:可疑的威胁行为,需要进一步调查
- **高**:严重的安全威胁,需要立即处理
### 4.3 告警通知方式
- **Web界面通知**:在管理界面显示告警信息
- **日志记录**:将告警信息记录到日志文件
- **WebSocket推送**:实时推送告警信息到前端
### 4.4 告警处理流程
1. **威胁检测**:威胁检测引擎分析DNS查询,检测潜在威胁
2. **告警生成**:生成告警信息并存储
3. **告警展示**:在前端界面展示告警信息
4. **管理员操作**
- **屏蔽**:将威胁域名添加到屏蔽列表,自动匹配威胁域名数据库
- **放行**:将域名添加到放行列表,不再屏蔽该域名
## 5. 技术实现
### 5.1 新增文件和修改
#### 5.1.1 新增文件
- `threat/engine.go`:威胁检测引擎的实现
- `threat/alert.go`:告警管理的实现
- `threat/config.go`:威胁检测配置的实现
- `threat/models.go`:威胁和告警数据模型
- `threat/database.go`:威胁域名数据库管理
#### 5.1.2 修改文件
- `config/config.go`:添加威胁检测相关的配置选项
- `http/server.go`:添加威胁告警相关的API接口
- `dns/server.go`:集成威胁检测引擎到DNS查询处理流程
### 5.2 数据模型
```go
// ThreatAlert 威胁告警结构
type ThreatAlert struct {
ID string `json:"id"`
Timestamp time.Time `json:"timestamp"`
Level string `json:"level"` // low, medium, high
Type string `json:"type"` // 告警类型
Description string `json:"description"`
Details string `json:"details"`
SourceIP string `json:"sourceIP"`
Domain string `json:"domain"`
QueryType string `json:"queryType"`
Resolved bool `json:"resolved"` // 是否已解决
ResolvedTime time.Time `json:"resolvedTime,omitempty"`
Action string `json:"action,omitempty"` // 处理动作:blocked, allowed
}
// ThreatConfig 威胁检测配置
type ThreatConfig struct {
Enabled bool `json:"enabled"`
QueryRateThreshold int `json:"queryRateThreshold"` // 每分钟查询阈值,0表示不限制
NXDomainThreshold int `json:"nxDomainThreshold"` // 每分钟NXDOMAIN阈值,0表示不限制
MaxDomainLength int `json:"maxDomainLength"` // 最大域名长度,0表示不限制
SuspiciousPatterns []string `json:"suspiciousPatterns"` // 可疑域名模式
UnusualQueryTypes []string `json:"unusualQueryTypes"` // 不常见的查询类型
AlertRetentionDays int `json:"alertRetentionDays"` // 告警保留天数,0表示一直保存
ThreatDatabasePath string `json:"threatDatabasePath"` // 威胁域名数据库路径
}
```
### 5.3 核心实现
#### 5.3.1 威胁检测引擎
```go
// ThreatEngine 威胁检测引擎
type ThreatEngine struct {
config *config.ThreatConfig
alertMgr *AlertManager
dbManager *ThreatDatabaseManager
clientStats map[string]*ClientQueryStats
mutex sync.RWMutex
}
// ClientQueryStats 客户端查询统计
type ClientQueryStats struct {
QueryCount int // 查询计数
NXDomainCount int // NXDOMAIN响应计数
LastQueryTime time.Time // 最后查询时间
QueryTypes map[string]int // 查询类型统计
}
// CheckQuery 检查DNS查询是否存在威胁
func (e *ThreatEngine) CheckQuery(sourceIP, domain, queryType string) []*ThreatAlert {
// 检查异常查询频率
// 检查可疑域名模式
// 检查DNS隧道特征
// 检查异常查询类型
// 检查地理位置异常
// 检查威胁域名数据库
return alerts
}
```
#### 5.3.2 告警管理器
```go
// AlertManager 告警管理器
type AlertManager struct {
alerts []*ThreatAlert
mutex sync.RWMutex
config *config.ThreatConfig
storagePath string
}
// AddAlert 添加告警
func (m *AlertManager) AddAlert(alert *ThreatAlert) {
// 添加告警到内存
// 持久化存储
// 触发通知
}
// GetAlerts 获取告警列表
func (m *AlertManager) GetAlerts(limit, offset int, level string) []*ThreatAlert {
// 返回告警列表
}
// ResolveAlert 解决告警
func (m *AlertManager) ResolveAlert(alertID, action string) bool {
// 标记告警为已解决
// 记录处理动作
}
```
#### 5.3.3 威胁域名数据库管理
```go
// ThreatDatabaseManager 威胁域名数据库管理器
type ThreatDatabaseManager struct {
databasePath string
threatDomains map[string]bool
mutex sync.RWMutex
}
// NewThreatDatabaseManager 创建威胁域名数据库管理器
func NewThreatDatabaseManager(databasePath string) *ThreatDatabaseManager {
return &ThreatDatabaseManager{
databasePath: databasePath,
threatDomains: make(map[string]bool),
}
}
// LoadDatabase 加载威胁域名数据库
func (m *ThreatDatabaseManager) LoadDatabase() error {
// 从CSV文件加载威胁域名
// 文件路径:/root/dns/static/domain-info/threats/threats-database.csv
return nil
}
// IsThreatDomain 检查域名是否在威胁数据库中
func (m *ThreatDatabaseManager) IsThreatDomain(domain string) bool {
m.mutex.RLock()
defer m.mutex.RUnlock()
return m.threatDomains[domain]
}
```
#### 5.3.4 DNS服务器集成
`dns/server.go``handleDNSRequest`函数中集成威胁检测:
```go
// handleDNSRequest 处理DNS请求
func (s *Server) handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) {
// 现有的代码...
// 集成威胁检测
if s.threatEngine != nil {
sourceIP := reqInfo.sourceIP
domain := reqInfo.domain
queryType := reqInfo.queryType
alerts := s.threatEngine.CheckQuery(sourceIP, domain, queryType)
for _, alert := range alerts {
s.alertManager.AddAlert(alert)
}
}
// 现有的代码...
}
```
#### 5.3.5 HTTP API接口
`http/server.go`中添加威胁告警相关的API接口:
```go
// 威胁告警相关接口
mux.HandleFunc("/api/threat/alerts", s.loginRequired(s.handleThreatAlerts))
mux.HandleFunc("/api/threat/config", s.loginRequired(s.handleThreatConfig))
mux.HandleFunc("/api/threat/resolve", s.loginRequired(s.handleResolveAlert))
mux.HandleFunc("/api/threat/block", s.loginRequired(s.handleBlockThreat))
mux.HandleFunc("/api/threat/allow", s.loginRequired(s.handleAllowThreat))
mux.HandleFunc("/api/threat/database", s.loginRequired(s.handleThreatDatabase))
```
### 5.4 前端界面
在前端界面添加威胁告警页面,包括:
- 告警列表展示
- 告警详情查看
- 告警解决操作(屏蔽/放行)
- 威胁统计图表
- 配置管理界面
- 威胁域名数据库管理
## 6. 配置选项
`config.ini`文件中添加威胁检测相关的配置:
```ini
[threat]
# 是否启用威胁检测
enabled = true
# 每分钟查询阈值,0表示不限制
queryRateThreshold = 0
# 每分钟NXDOMAIN阈值,0表示不限制
nxDomainThreshold = 0
# 最大域名长度,0表示不限制
maxDomainLength = 0
# 告警保留天数,0表示一直保存
alertRetentionDays = 0
# 威胁域名数据库路径
threatDatabasePath = ./static/domain-info/threats/threats-database.csv
```
## 7. 性能考虑
- **内存使用**:威胁检测引擎将维护客户端查询统计数据,需要合理设置内存使用限制
- **处理延迟**:威胁检测不应显著增加DNS查询的处理时间,应使用异步处理方式
- **存储管理**:告警数据应根据配置进行管理,避免存储膨胀
- **数据库加载**:威胁域名数据库应在启动时加载到内存,提高检测速度
## 8. 集成测试
- **单元测试**:测试威胁检测规则的准确性
- **性能测试**:测试威胁检测对DNS服务器性能的影响
- **集成测试**:测试与现有系统的集成情况
- **数据库测试**:测试威胁域名数据库的加载和匹配性能
## 9. 部署和维护
- **部署**:作为DNS服务器的一部分部署,无需额外的服务
- **维护**:定期更新威胁检测规则和威胁域名数据库
- **监控**:监控威胁检测引擎的运行状态和性能
- **数据库更新**:定期更新`/root/dns/static/domain-info/threats/threats-database.csv`文件
## 10. 未来扩展
- **机器学习**:使用机器学习算法提高威胁检测的准确性
- **威胁情报**:集成外部威胁情报源,增强检测能力
- **自动响应**:根据告警级别自动执行响应措施
- **多语言支持**:支持多语言的告警描述和界面
- **告警聚合**:对相似告警进行聚合,减少告警数量
## 11. 结论
威胁告警功能将为DNS服务器添加一层安全防护,帮助管理员及时发现和应对潜在的安全威胁。该功能独立于屏蔽管理系统,专注于威胁检测和告警,并提供灵活的处理选项。设计充分考虑了现有代码结构和性能要求,能够与现有系统无缝集成,为DNS服务器的安全运行提供有力保障。