Skip to content

审计日志

DD 提供异步审计日志功能,记录安全相关事件,支持完整性签名和条目序列号追踪。

AuditLogger

异步安全审计事件记录器。

创建

go
func NewAuditLogger(cfg AuditConfig) (*AuditLogger, error)

使用传入的 AuditConfig 创建异步审计记录器。可用 DefaultAuditConfig() 获取带合理默认值的配置。

返回错误的情况:配置校验失败(如 BufferSize 为负数)。

go
// 使用默认配置
auditLogger, _ := dd.NewAuditLogger(dd.DefaultAuditConfig())

// 自定义配置
cfg := dd.DefaultAuditConfig()
cfg.JSONFormat = true
cfg.MinimumSeverity = dd.AuditSeverityWarning
auditLogger, _ := dd.NewAuditLogger(cfg)

方法

方法签名说明
Log(event AuditEvent)记录审计事件(异步)
LogSensitiveDataRedaction(pattern, field, message string)敏感数据脱敏事件
LogRateLimitExceeded(message string, metadata map[string]any)速率限制事件
LogSecurityViolation(violationType, message string, metadata map[string]any)安全违规事件
LogReDoSAttempt(pattern, message string)ReDoS 攻击事件
LogIntegrityViolation(message string, metadata map[string]any)完整性违规事件
LogPathTraversalAttempt(path, message string)路径遍历事件
Stats() AuditStats审计统计
Close() error关闭并刷新剩余事件

使用示例

go
audit, _ := dd.NewAuditLogger(dd.DefaultAuditConfig())
defer audit.Close()

// 记录敏感数据脱敏
audit.LogSensitiveDataRedaction("password", "login_form", "检测到密码字段明文")

// 记录速率限制
audit.LogRateLimitExceeded("API 请求超过限制", map[string]any{
    "client_ip": "192.168.1.100",
    "limit":     100,
    "current":   150,
})

// 记录安全违规
audit.LogSecurityViolation("sql_injection", "SQL 注入尝试", map[string]any{
    "input": "' OR 1=1 --",
})

AuditConfig

审计日志配置。

go
type AuditConfig struct {
    Enabled          bool             // 是否启用审计(默认 true)
    Output           *os.File         // 输出文件(默认 os.Stderr);为 nil 时不产生输出,事件仅计入统计
    BufferSize       int              // 异步事件缓冲区大小(默认 1000;为负数将校验失败)
    IncludeTimestamp bool             // 是否包含时间戳(默认 true)
    JSONFormat       bool             // JSON 格式输出(默认 true)
    MinimumSeverity  AuditSeverity    // 最低记录严重级别(默认 AuditSeverityInfo)
    IntegritySigner  *IntegritySigner // 完整性签名器(可选;配置后每条审计事件被签名)
}

默认配置

go
func DefaultAuditConfig() AuditConfig

返回默认审计配置,审计日志默认启用。

方法

方法签名说明
Validate() error验证配置合法性(BufferSize 为负数则返回错误)
Clone() AuditConfig复制配置(IntegritySigner 为共享引用,不深拷贝)

AuditEvent

审计事件结构体。

go
type AuditEvent struct {
    Type      AuditEventType `json:"type"`
    Timestamp time.Time      `json:"timestamp"`
    Message   string         `json:"message"`
    Pattern   string         `json:"pattern,omitempty"`
    Field     string         `json:"field,omitempty"`
    Metadata  map[string]any `json:"metadata,omitempty"`
    Severity  AuditSeverity  `json:"severity"`
}

AuditStats

审计统计数据结构。

go
type AuditStats struct {
    TotalEvents int64                    // 总事件数
    Dropped     int64                    // 丢弃事件数(缓冲区满时累加)
    ByType      map[AuditEventType]int64 // 按类型统计
    BufferSize  int                      // 缓冲区大小
    BufferUsage int                      // 当前缓冲区使用量
}

AuditVerificationResult

审计验证结果。

go
type AuditVerificationResult struct {
    Valid    bool         // 验证是否通过
    Event    *AuditEvent  // 解析出的事件
    RawEvent string       // 原始事件字符串
    Error    error        // 验证错误
}

审计事件类型

常量String()说明
AuditEventSensitiveDataRedacted"SENSITIVE_DATA_REDACTED"敏感数据已脱敏
AuditEventRateLimitExceeded"RATE_LIMIT_EXCEEDED"速率限制超出
AuditEventReDoSAttempt"REDOS_ATTEMPT"ReDoS 攻击尝试
AuditEventSecurityViolation"SECURITY_VIOLATION"安全违规
AuditEventIntegrityViolation"INTEGRITY_VIOLATION"完整性违规
AuditEventInputSanitized"INPUT_SANITIZED"输入已清洗
AuditEventPathTraversalAttempt"PATH_TRAVERSAL_ATTEMPT"路径遍历尝试
AuditEventLog4ShellAttempt"LOG4SHELL_ATTEMPT"Log4Shell 攻击尝试
AuditEventNullByteInjection"NULL_BYTE_INJECTION"Null 字节注入
AuditEventOverlongEncoding"OVERLONG_ENCODING"超长编码攻击
AuditEventHomographAttack"HOMOGRAPH_ATTACK"同形字攻击

审计严重级别

常量String()说明
AuditSeverityInfo"INFO"信息
AuditSeverityWarning"WARNING"警告
AuditSeverityError"ERROR"错误
AuditSeverityCritical"CRITICAL"严重

MarshalJSON

go
func (s AuditSeverity) MarshalJSON() ([]byte, error)

AuditSeverity 实现了 json.Marshaler 接口,JSON 序列化时输出字符串而非整数:

go
event := dd.AuditEvent{
    Type:     dd.AuditEventSecurityViolation,
    Severity: dd.AuditSeverityCritical,
}
data, _ := json.Marshal(event)
// Severity 序列化为 "CRITICAL",而非 3

验证审计条目

go
func VerifyAuditEvent(entry string, signer *IntegritySigner) *AuditVerificationResult

验证审计日志条目的完整性。

go
cfg, _ := dd.DefaultIntegrityConfigSafe()
signer, _ := dd.NewIntegritySigner(cfg)
result := dd.VerifyAuditEvent(logEntry, signer)
if result != nil && result.Valid {
    fmt.Println("审计条目验证通过")
}

下一步