Pydantic/Logfire 敏感数据脱敏处理指南
引言
在现代应用开发中,日志记录是系统监控和调试的重要工具。然而,日志中可能包含敏感信息,如密码、API密钥、信用卡号等。Pydantic/Logfire 提供了强大的敏感数据脱敏功能,帮助开发者在记录日志时自动识别并隐藏这些敏感信息。
基础脱敏功能
Logfire SDK 默认会扫描并脱敏日志和跨度(span)中的敏感数据,然后再导出。这一功能开箱即用,无需额外配置。
禁用脱敏功能
在某些特殊情况下,如果需要完全禁用脱敏功能,可以通过配置实现:
import logfire
logfire.configure(scrubbing=False)
自定义脱敏规则
扩展脱敏模式
默认情况下,Logfire 已经内置了一些常见的敏感数据模式识别。开发者可以添加自己的正则表达式模式来扩展脱敏范围:
import logfire
logfire.configure(scrubbing=logfire.ScrubbingOptions(extra_patterns=['my_pattern']))
当配置了额外模式后:
- 键名匹配模式的字段值会被脱敏
- 值内容匹配模式的字符串也会被脱敏(不区分大小写)
- 自定义模式会与默认模式合并生效
默认脱敏模式
以下是 Logfire 内置的默认脱敏模式,涵盖了常见的敏感数据类型:
[
'password', 'passwd', 'mysql_pwd', 'secret', 'auth(?!ors?\\b)',
'credential', 'private[._ -]?key', 'api[._ -]?key', 'session',
'cookie', 'social[._ -]?security', 'credit[._ -]?card',
'(?:\\b|_)csrf(?:\\b|_)', '(?:\\b|_)xsrf(?:\\b|_)',
'(?:\\b|_)jwt(?:\\b|_)', '(?:\\b|_)ssn(?:\\b|_)'
]
精细化控制脱敏行为
使用回调函数控制脱敏
当默认脱敏行为过于激进时,可以通过回调函数精确控制哪些数据应该被脱敏:
import logfire
def scrubbing_callback(match: logfire.ScrubMatch):
# 特定路径下的特定值不脱敏
if match.path == ('attributes', 'my_safe_value') and match.pattern_match.group(0) == 'password':
return match.value
logfire.configure(scrubbing=logfire.ScrubbingOptions(callback=scrubbing_callback))
回调函数接收一个 ScrubMatch
对象,包含以下有用信息:
path
: 匹配项的路径value
: 匹配项的值pattern_match
: 正则匹配对象
返回 None
表示执行脱敏,返回其他值则用该值替换原值。
安全最佳实践
使用消息模板
Logfire 只脱敏字段内容,不脱敏整个消息。因此推荐使用消息模板而非字符串拼接:
✅ 推荐做法:
logfire.info('User details: {user}', user=User(id=123, password='secret'))
输出类似:User details: [Scrubbed due to 'password']
❌ 不推荐做法:
user = User(id=123, password='secret')
logfire.info('User details: ' + str(user))
输出:User details: User(id=123, password='secret')
敏感数据与URL处理
HTTP URL 被视为安全内容不会被脱敏。因此:
- 避免在URL路径或查询参数中包含敏感数据
- 敏感数据应放在请求体或头部
数据库查询处理
SQL 查询语句不会被脱敏。因此:
- 始终使用参数化查询
- 避免在SQL语句中直接拼接敏感数据
总结
Pydantic/Logfire 提供了灵活的敏感数据脱敏机制,开发者可以:
- 使用默认脱敏规则快速获得基本保护
- 通过自定义模式扩展脱敏范围
- 使用回调函数实现精细化控制
- 遵循安全最佳实践确保敏感数据安全
合理配置脱敏功能可以在保证日志可用性的同时,有效保护敏感信息不被泄露。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考