敏感数据过滤
DD 内置敏感数据自动过滤,在日志写入前将密码、API Key、信用卡号等敏感信息替换为 [REDACTED],防止敏感数据泄露到日志中。
快速启用
go
logger, err := dd.New(dd.Config{
Security: dd.DefaultSecurityConfig(),
})
if err != nil {
log.Fatal(err)
}
defer logger.Close()
// password 字段自动脱敏
logger.InfoWith("用户登录",
dd.String("username", "alice"),
dd.String("password", "s3cr3t123"), // 输出:password=[REDACTED]
)内置过滤模式
DefaultSecurityConfig() 启用基础过滤,覆盖以下敏感信息:
| 类别 | 匹配目标 |
|---|---|
| 密码 | password、passwd、pwd 等字段 |
| API Key | api_key、apikey、access_token 等 |
| 信用卡 | Visa、MasterCard 等卡号格式 |
| SSN | 美国社会安全号码格式 |
| 电话号码 | 全球电话号码格式(含国际格式) |
DefaultSecureConfig() 使用全量模式集(含基础全部,再加以下常见类别):
| 类别 | 匹配目标 |
|---|---|
| 邮箱 | email 地址格式 |
| IP 地址 | IPv4/IPv6 地址 |
| JWT Token | eyJ 开头的 JWT 格式 |
| 连接字符串 | 数据库连接字符串中的密码 |
模式覆盖范围
上表仅列出常见类别示例。DefaultSecurityConfig() 实际内置约 36 条模式,行业预设(如 HealthcareConfig())可达 71 条,还涵盖 AWS 密钥、Stripe/GitHub/Slack 令牌、IBAN、多国税务号、Log4Shell 等。完整模式集见源码 internal/patterns.go。
自定义过滤模式
添加自定义模式
go
filter := dd.NewEmptySensitiveDataFilter()
// 添加自定义正则模式(内置 ReDoS 防护)
_ = filter.AddPattern(`(?i)credit_card\s*[:=]\s*\d+`)
_ = filter.AddPattern(`(?i)phone\s*[:=]\s*\d{11}`)
logger, err := dd.New(dd.Config{
Security: &dd.SecurityConfig{
SensitiveFilter: filter,
},
})
if err != nil {
log.Fatal(err)
}
defer logger.Close()从零创建自定义过滤器
go
filter, err := dd.NewCustomSensitiveDataFilter(
`(?i)secret_key\s*[:=]\s*\S+`,
`(?i)private_token\s*[:=]\s*\S+`,
)
if err != nil {
log.Fatal(err) // 正则表达式安全性验证失败
}ReDoS 防护
NewCustomSensitiveDataFilter 内置 ReDoS 验证。如果正则表达式存在灾难性回溯风险,会返回错误。请使用非贪婪匹配和锚定模式来避免此问题。
安全等级
DD 提供五个安全等级,每个等级有对应的预置配置:
go
// 按等级获取配置
cfg := dd.SecurityConfigForLevel(dd.SecurityLevelStandard)| 等级 | 说明 | 适用场景 |
|---|---|---|
SecurityLevelDevelopment | 最宽松 | 本地开发 |
SecurityLevelBasic | 基础过滤 | 测试环境 |
SecurityLevelStandard | 标准过滤 | 一般生产环境 |
SecurityLevelStrict | 严格过滤 | 高安全要求 |
SecurityLevelParanoid | 最严格 | 金融/医疗等敏感行业 |
行业合规预设
DD 提供三种行业合规配置:
HIPAA(医疗行业)
go
cfg := dd.HealthcareConfig()额外过滤:ICD-10 编码、病历号 (MRN)、健康保险索赔号 (HICN)、患者标识号。
PCI-DSS(金融支付)
go
cfg := dd.FinancialConfig()额外过滤:SWIFT 代码、IBAN 账号、CVV/CVC、银行路由号。
政府标准
go
cfg := dd.GovernmentConfig()额外过滤:护照号、驾照号、税务 ID、SSN 变体。
完整示例
go
// 医疗系统:使用 HIPAA 合规配置
logger, err := dd.New(dd.Config{
Format: dd.FormatJSON,
Security: dd.HealthcareConfig(),
Targets: []dd.OutputTarget{
dd.FileOutput("logs/hipaa-audit.json"),
},
})
if err != nil {
log.Fatal(err)
}
defer logger.Close()
// 含敏感信息的日志消息自动脱敏
logger.Info("患者记录 mrn=MRN123456 diagnosis=J18.9 已更新")
// 消息中的 MRN 和 ICD-10 编码匹配模式会被脱敏
// 结构化字段根据键名敏感度过滤
logger.InfoWith("用户登录",
dd.String("password", "s3cr3t123"), // → [REDACTED](键名敏感)
dd.String("department", "内科"), // 正常输出
)过滤统计
监控过滤器的运行状态:
go
filter := dd.NewSensitiveDataFilter()
stats := filter.GetFilterStats()
fmt.Printf("活跃 goroutines: %d\n", stats.ActiveGoroutines)
fmt.Printf("过滤模式数:%d\n", stats.PatternCount)
fmt.Printf("总脱敏次数:%d\n", stats.TotalRedactions)
fmt.Printf("超时次数:%d\n", stats.TotalTimeouts)禁用过滤
go
// 使用 Development 安全等级(无敏感数据过滤)
logger, err := dd.New(dd.Config{
Security: dd.SecurityConfigForLevel(dd.SecurityLevelDevelopment),
})
if err != nil {
log.Fatal(err)
}
// 或手动设置空的 SensitiveFilter
logger, err = dd.New(dd.Config{
Security: &dd.SecurityConfig{
SensitiveFilter: nil,
},
})
if err != nil {
log.Fatal(err)
}
defer logger.Close()默认启用过滤
DefaultConfig() 默认启用基础敏感数据过滤(DefaultSecurityConfig())。不设置 Security 字段时,也会使用默认安全配置。如需禁用过滤,必须显式设置 SensitiveFilter 为 nil。
下一步
- 审计日志 -- 安全事件审计
- 行业合规配置 -- HIPAA/PCI-DSS 详解
- API 参考 - Security -- 安全 API 完整文档
- 生产检查清单 -- 上线前检查