11 KiB
11 KiB
威胁告警功能设计方案
1. 功能概述
威胁告警功能旨在监控DNS查询中的可疑行为,检测潜在的安全威胁,并及时向管理员发出告警。该功能独立于屏蔽管理系统,专注于威胁检测和告警,不直接执行屏蔽操作。只有在威胁告警展示后,管理员才能选择屏蔽或放行操作。
2. 设计原则
- 低侵入性:尽可能利用现有的代码结构和数据,最小化对现有功能的修改
- 可扩展性:设计模块化的威胁检测引擎,便于添加新的检测规则
- 实时性:实时监控和分析DNS查询,及时发现和告警
- 准确性:减少误报,提高告警的准确性和可靠性
- 可配置性:提供灵活的配置选项,允许管理员根据需要调整告警规则和阈值
3. 系统架构
3.1 核心组件
- 威胁检测引擎:负责分析DNS查询数据,检测可疑行为
- 告警管理器:管理告警的生成、存储和通知
- 配置管理:管理威胁检测规则和告警阈值
- API接口:提供告警相关的API接口
- 前端界面:展示告警信息和威胁分析结果
- 威胁域名数据库:存储已知的威胁域名信息
3.2 数据流
DNS查询 → 威胁检测引擎 → 告警分析 → 告警存储 → API接口 → 前端展示 → 管理员操作(屏蔽/放行)
4. 功能设计
4.1 威胁检测规则
| 规则类型 | 检测内容 | 触发条件 | 严重程度 |
|---|---|---|---|
| 异常查询频率 | 单个客户端短时间内的查询频率 | 每分钟查询次数超过阈值(0表示不限制) | 中 |
| 可疑域名模式 | 包含恶意域名特征的查询 | 匹配预定义的恶意域名模式或威胁域名数据库 | 高 |
| DNS隧道检测 | 异常长的域名或包含特殊字符的域名 | 域名长度超过阈值(0表示不限制)或包含可疑字符 | 高 |
| 大量NXDOMAIN响应 | 短时间内大量域名不存在的响应 | 每分钟NXDOMAIN响应超过阈值(0表示不限制) | 中 |
| 异常查询类型 | 不常见的DNS查询类型 | 检测到不常见的查询类型 | 低 |
| 地理位置异常 | 来自异常地理位置的查询 | 查询来源IP的地理位置异常 | 中 |
4.2 告警级别
- 低:可能的异常行为,需要关注但不紧急
- 中:可疑的威胁行为,需要进一步调查
- 高:严重的安全威胁,需要立即处理
4.3 告警通知方式
- Web界面通知:在管理界面显示告警信息
- 日志记录:将告警信息记录到日志文件
- WebSocket推送:实时推送告警信息到前端
4.4 告警处理流程
- 威胁检测:威胁检测引擎分析DNS查询,检测潜在威胁
- 告警生成:生成告警信息并存储
- 告警展示:在前端界面展示告警信息
- 管理员操作:
- 屏蔽:将威胁域名添加到屏蔽列表,自动匹配威胁域名数据库
- 放行:将域名添加到放行列表,不再屏蔽该域名
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 数据模型
// 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 威胁检测引擎
// 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 告警管理器
// 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 威胁域名数据库管理
// 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函数中集成威胁检测:
// 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接口:
// 威胁告警相关接口
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文件中添加威胁检测相关的配置:
[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服务器的安全运行提供有力保障。