安全与审计实战
本示例展示如何配置 DD 的安全过滤、审计日志和完整性签名,构建生产级安全日志方案。
敏感数据过滤
基本过滤
go
package main
import (
"github.com/cybergodev/dd"
)
func main() {
logger, _ := dd.New(dd.Config{
Security: dd.DefaultSecurityConfig(),
Targets: []dd.OutputTarget{dd.ConsoleOutput()},
})
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 医疗合规
medicalLogger, _ := dd.New(dd.Config{
Format: dd.FormatJSON,
Security: dd.HealthcareConfig(),
Targets: []dd.OutputTarget{dd.FileOutput("logs/medical.json")},
})
medicalLogger.InfoWith("患者就诊",
dd.String("password", "s3cr3t123"), // → [REDACTED](键名敏感)
dd.String("diagnosis", "常规检查"), // 正常输出
)
// PCI-DSS 金融合规
paymentLogger, _ := dd.New(dd.Config{
Format: dd.FormatJSON,
Security: dd.FinancialConfig(),
Targets: []dd.OutputTarget{dd.FileOutput("logs/payment.json")},
})
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
logger, _ := dd.New(dd.Config{
Format: dd.FormatJSON,
Security: dd.DefaultSecureConfig(),
Targets: []dd.OutputTarget{dd.ConsoleOutput()},
// 注意:此处未配置 Audit,业务 logger 的脱敏/安全事件不会自动进入上面的 auditLogger。
// 若要让安全事件自动入审计,需在此配置 Audit 字段(例如把上方 auditLogger 对应的
// AuditConfig 经 Audit: &auditCfg 传入),或通过显式调用 auditLogger.LogX(...) 记录事件。
})
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)
logger, _ := dd.New(dd.Config{
Level: dd.LevelInfo,
Format: dd.FormatJSON,
Security: dd.DefaultSecureConfig(),
Targets: []dd.OutputTarget{dd.CustomOutput(fw)},
})
return logger, auditLogger, nil
}下一步
- API 参考 - Security -- 安全过滤完整 API
- API 参考 - Audit -- 审计日志完整 API
- API 参考 - Integrity -- 完整性签名 API
- 生产检查清单 -- 上线安全检查