315 lines
11 KiB
Markdown
315 lines
11 KiB
Markdown
# 威胁告警功能设计方案
|
||
|
||
## 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服务器的安全运行提供有力保障。 |