Skip to content

安全与审计实战 ​

本示例展示如何配置 DD 的安全过滤、审计日志和完整性签名,构建生产级安全日志方案。

敏感数据过滤 ​

基本过滤 ​

go
package main

import (
	"github.com/cybergodev/dd"
)

func main() {
	cfg := dd.DefaultConfig()
	cfg.Security = dd.DefaultSecurityConfig()
	cfg.Targets = []dd.OutputTarget{dd.ConsoleOutput()}
	logger, _ := dd.New(cfg)
	defer logger.Close()

	// 密码自动脱敏
	logger.InfoWith("用户登录",
		dd.String("username", "alice"),
		dd.String("password", "s3cr3t123"), // → password=[REDACTED]
	)

	// API Key 自动脱敏(注意:endpoint 同属敏感键名,也会被脱敏)
	logger.InfoWith("API 调用",
		dd.String("endpoint", "/api/data"),   // → endpoint=[REDACTED]("endpoint" 同属敏感键名)
		dd.String("api_key", "sk-abc123xyz"), // → api_key=[REDACTED]
	)
}

行业合规配置 ​

go
// HIPAA 医疗合规
cfg := dd.DefaultConfig()
cfg.Format = dd.FormatJSON
cfg.Security = dd.HealthcareConfig()
cfg.Targets = []dd.OutputTarget{dd.FileOutput("logs/medical.json")}
medicalLogger, _ := dd.New(cfg)

medicalLogger.InfoWith("患者就诊",
    dd.String("password", "s3cr3t123"),        // → [REDACTED](键名敏感)
    dd.String("diagnosis", "常规检查"),         // 正常输出
)

// PCI-DSS 金融合规
cfg = dd.DefaultConfig()
cfg.Format = dd.FormatJSON
cfg.Security = dd.FinancialConfig()
cfg.Targets = []dd.OutputTarget{dd.FileOutput("logs/payment.json")}
paymentLogger, _ := dd.New(cfg)

paymentLogger.InfoWith("支付处理",
    dd.String("card_number", "4111111111111111"),  // → [REDACTED]
    dd.String("amount", "99.99"),                  // 正常输出
)

审计日志 ​

完整审计系统 ​

go
package main

import (
	"os"

	"github.com/cybergodev/dd"
)

func main() {
	// 审计日志文件
	auditFile, _ := os.Create("logs/audit.json")
	defer auditFile.Close()

	// HMAC 签名器(防篡改)
	integrityCfg, _ := dd.DefaultIntegrityConfigSafe()
	signer, _ := dd.NewIntegritySigner(integrityCfg)

	// 审计 Logger
	auditLogger, _ := dd.NewAuditLogger(dd.AuditConfig{
		Enabled:         true,
		Output:          auditFile,
		JSONFormat:      true,
		BufferSize:      1000,
		MinimumSeverity: dd.AuditSeverityInfo,
		IntegritySigner: signer,
	})
	defer auditLogger.Close()

	// 业务 Logger
	cfg := dd.DefaultConfig()
	cfg.Format = dd.FormatJSON
	cfg.Security = dd.SecurityConfigForLevel(dd.SecurityLevelStandard)
	cfg.Targets = []dd.OutputTarget{dd.ConsoleOutput()}
	// 注意:此处未配置 Audit,业务 logger 的脱敏/安全事件不会自动进入上面的 auditLogger。
	// 若要让安全事件自动入审计,需在此配置 Audit 字段——dd.New 会根据该 AuditConfig 构建
	// logger 自己的内部 AuditLogger(事件不会流入上方单独构造的 auditLogger 实例,避免
	// 双写;两者若输出同一文件需自行协调),或通过显式调用 auditLogger.LogX(...) 记录事件。
	logger, _ := dd.New(cfg)
	defer logger.Close()

	// 正常业务操作(脱敏由 Security 处理,但不会自动写入审计日志)
	logger.InfoWith("交易处理",
		dd.String("transaction_id", "TXN-001"),
		dd.String("amount", "1500.00"),
		dd.String("card_number", "4111111111111111"), // → [REDACTED]
	)
}

完整性验证 ​

签名与验证流程 ​

go
package main

import (
	"fmt"

	"github.com/cybergodev/dd"
)

func main() {
	// 创建签名器
	signer, err := dd.NewIntegritySigner(dd.IntegrityConfig{
		SecretKey:        []byte("your-32-byte-secret-key-here-1234"),
		IncludeTimestamp: true,
		IncludeSequence:  true,
	})
	if err != nil {
		panic(err)
	}

	// 签名日志条目
	logEntry := `{"level":"info","message":"重要操作","user":"admin"}`
	signature := signer.Sign(logEntry)
	signedEntry := logEntry + signature

	// 验证日志完整性
	result, err := signer.Verify(signedEntry)
	if err != nil {
		fmt.Printf("验证错误: %v\n", err)
	} else if result.Valid {
		fmt.Printf("验证通过 - 时间戳: %s, 序列号: %d\n",
			result.Timestamp, result.Sequence)
	} else {
		fmt.Printf("验证失败:日志可能被篡改\n")
	}
}

批量验证审计日志 ​

go
func VerifyAuditLog(path string, signer *dd.IntegritySigner) error {
    file, err := os.Open(path)
    if err != nil {
        return err
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    lineNum := 0
    for scanner.Scan() {
        lineNum++
        result := dd.VerifyAuditEvent(scanner.Text(), signer)
        if result == nil || !result.Valid {
            errMsg := "unknown error"
            if result != nil && result.Error != nil {
                errMsg = result.Error.Error()
            }
            return fmt.Errorf("line %d: integrity check failed - %s",
                lineNum, errMsg)
        }
    }
    return nil
}

生产环境安全配置 ​

go
func NewSecureLogger() (*dd.Logger, *dd.AuditLogger, error) {
    // 审计签名器
    integrityCfg, _ := dd.DefaultIntegrityConfigSafe()
    signer, _ := dd.NewIntegritySigner(integrityCfg)

    // 审计 Logger
    auditFile, _ := os.OpenFile("logs/audit.json", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
    auditLogger, _ := dd.NewAuditLogger(dd.AuditConfig{
        Enabled:          true,
        Output:           auditFile,
        JSONFormat:       true,
        BufferSize:       2000,
        MinimumSeverity:  dd.AuditSeverityWarning,
        IntegritySigner:  signer,
    })

    // 业务 Logger
    fwCfg := dd.DefaultFileWriterConfig()
    fwCfg.MaxSizeMB = 50
    fwCfg.Compress = true
    fw, _ := dd.NewFileWriter("logs/app.json", fwCfg)

    cfg := dd.DefaultConfig()
    cfg.Level = dd.LevelInfo
    cfg.Format = dd.FormatJSON
    cfg.Security = dd.SecurityConfigForLevel(dd.SecurityLevelStandard)
    cfg.Targets = []dd.OutputTarget{dd.CustomOutput(fw)}
    logger, _ := dd.New(cfg)

    return logger, auditLogger, nil
}

下一步 ​