以下是一份详细的清单,列出了严禁打印在日志中的敏感信息和个人隐私信息内容,并附带了处理建议。
一、核心原则
绝对禁止原则:任何可以唯一识别个人身份或授予资源访问权限的凭证类信息,都不应出现在日志中。
二、具体分类清单
1. 身份认证与凭证类
这是最敏感的一类,一旦泄露,攻击者可以直接冒充用户。
-
全部密码:用户密码、管理员密码、系统密码。
-
完整的认证令牌/密钥:如 JWT、OAuth Token、API Keys、Access Key / Secret Key(如AWS AK/SK)。
-
会话ID:特别是如果会话机制不够安全,会话ID可被用于"会话劫持"。
-
生物特征数据:指纹、面部识别模板等(这些本身就不应以明文存储在任何地方,包括日志)。
2. 个人身份信息
这些信息可以直接或间接识别到特定个人。
-
身份证号码、护照号码、驾驶证号码、社保号码等政府颁发的唯一标识。
-
完整姓名 (在某些严格场景下,可能需要避免。如必须记录,可考虑仅使用姓或名的首字母,如"张*"或"Z*")。
-
联系信息:完整的住址、个人电话号码、个人邮箱地址。
-
生物标识信息:出生日期、出生地、性别(组合起来可精准定位个人)。
3. 金融与支付信息
这是犯罪分子最直接的目标。
-
银行卡信息:完整的卡号、有效期、CVV2/CVC2码。
-
银行账户信息:银行账号、开户行详细信息。
-
个人财产信息:收入、信用分数、交易记录、加密货币私钥。
4. 医疗健康信息
属于高度敏感的个人隐私,受到法律法规(如HIPAA)的严格保护。
- 病历资料、疾病诊断记录、用药记录、体检结果、基因数据。
5. 技术与网络信息
虽然不直接指向个人,但可能被用于发起进一步攻击。
-
完整的网络路径信息:在某些内部系统中,避免记录完整的服务器IP、端口、内网拓扑信息。
-
详细的系统错误信息 :对用户展示的错误信息应友好,但日志中可以记录详细的技术错误。关键在于,日志中的技术错误不应包含上述任何敏感数据。例如,数据库错误不应将带有用户参数的SQL语句完整打印。
6. 其他敏感数据
-
种族、政治观点、宗教信仰、性取向等法律特别保护的个人信息。
-
企业敏感信息:未公开的商业计划、源代码、内部通信、商业秘密。
-
法律相关数据:涉及调查、案号等司法信息。
三、安全的日志记录实践建议
仅仅知道"不能记什么"还不够,更需要知道"应该怎么记"。
-
脱敏/掩码处理
这是最常用的技术。对于调试需要但又敏感的数据,只显示部分字符,用星号(
*)或其他符号代替大部分内容。-
示例:
-
身份证号:
11010519******1234-> 只显示前6位和后4位。 -
银行卡号:
622588******1234 -
手机号:
138****1234 -
邮箱:
z***n@example.com
-
-
-
使用占位符或引用ID
当需要关联信息时,不要记录数据本身,而是记录一个无法反推原文的唯一ID。
-
错误示例 :
用户 张三(身份证:110101199001011234) 登录成功。 -
正确示例 :
用户 (ID: 12345) 登录成功。或会话 (SID: abcde-fghij) 已创建。 -
真正的用户信息"张三"和身份证号存储在安全的数据库中,通过ID
12345可以关联查询。
-
-
使用集中式的秘密管理工具
对于API密钥、数据库密码等配置信息,绝对不要写在项目的配置文件或代码里然后被日志记录。应使用如 HashiCorp Vault、AWS Secrets Manager、Azure Key Vault 等工具动态获取。
-
在代码层面进行约束
-
代码审查:将日志安全作为代码审查的强制性步骤。
-
静态代码分析工具(SAST):使用工具(如 SonarQube, Checkmarx)扫描代码,建立规则来检测日志中可能存在的敏感信息模式(如身份证、邮箱的正则表达式)。
-
预定义日志工具 :编写安全的日志包装函数,自动对特定字段(如
password,token)进行脱敏。
-
-
日志级别控制
确保在生产环境中使用
INFO或WARN级别,避免使用DEBUG或TRACE级别,因为后者通常会打印出非常多的细节信息,极易泄露敏感数据。 -
访问控制和加密
-
访问权限:严格限制对生产环境日志文件的访问权限,遵循最小权限原则。
-
日志加密:对存储的日志文件进行加密,特别是在传输和静态存储时。
-
总结清单(速查表)
| 严禁记录 | **安全记录方式(示例)** |
|---|---|
| 密码、API密钥、Token | 绝不记录。使用[REDACTED]或直接跳过。 |
| 身份证、银行卡号 | 脱敏,如 110105******1234 |
| 完整姓名、地址、电话 | 脱敏,如 张*, 138****1234,或使用用户ID |
| 会话ID、数据库连接字符串 | 记录引用ID或哈希值,而非完整值 |
| 详细的错误堆栈(含用户输入) | 记录错误类型和位置,但过滤掉用户输入的具体参数 |
**最后,请将"隐私设计"和"安全第一"的理念融入开发和运维的每个环节。** 在记录任何信息到日志前,多问一句:"这有必要吗?这安全吗?"