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