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

11 KiB
Raw Blame History

威胁告警功能设计方案

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 数据模型

// 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.gohandleDNSRequest函数中集成威胁检测:

// 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服务器的安全运行提供有力保障。