访问日志:记录所有对持卡人数据的访问

这一章咱们聊聊访问日志。说白了,就是要把谁、在什么时候、从哪、对持卡人数据干了什么、结果怎么样,统统记下来。PCI DSS 把这事放在第 10 条里反复强调——我刚开始审计时觉得这不过是“记个日志”而已,直到有次调查数据泄露事件,才发现日志是唯一能拼出作案时间线的证据。你想想看,没日志,你连谁动了数据都不知道。

3.1 核心要求:记录哪些内容?

PCI DSS 要求对持卡人数据的所有访问进行审计。这里的“访问”不限于读,还包括写、修改、删除,甚至查询。我个人习惯把需要记录的内容归纳成六个要素:

要素 说明 示例
用户 ID 唯一标识执行操作的人或系统 app_srv01 / li_zhang
事件类型 读、写、修改、删除、导出等 READ / UPDATE / DELETE
时间戳 精确到秒,含时区 2025-03-21 14:30:05 UTC
来源 源 IP、主机名、会话 ID 192.168.1.100:443
目标数据 被访问的表、文件、记录标识 DB:payments / table:cc_data / row_id:1234
结果 成功或失败,失败原因 SUCCESS / FAILURE (invalid )
实用提示:PCI DSS 要求 “记录所有对持卡人数据的访问”,但没说你要跟踪每个字段的每个比特变化。先覆盖「谁、何时、做什么、结果」这四块,再逐步细化。

3.2 典型实施场景

我参与过一个电商平台的整改。他们的支付数据库里存着明文卡号,每个后台运维都直接连 MySQL。我们当时做了三件事:

  1. 应用层拦截:所有对持卡人表的 SQL 操作必须经过中间件,日志落地到独立 syslog 服务器。
  2. 数据库审计:开启 MySQL 审计插件,记录 SELECT 和 UPDATE 语句——但只针对包含 pan 字段的查询。
  3. 文件访问日志:支付网关服务器上所有读取 /var/payments/ 的操作都用 auditd 捕获。
# 使用 auditd 监控持卡人数据目录
auditctl -w /var/payments/ -p rwxa -k card_access
# 查看日志
ausearch -k card_access --format txt
我在项目中遇到过不少团队只在生产环境配日志,忘了预发和测试环境。PCI DSS 覆盖所有持卡人数据所在的环境,测试库也得出日志。

3.3 日志内容示例与格式

嗯,这里要注意:日志格式尽量统一,不然事后查起来想骂人。我建议每行日志至少包含以下字段,用竖线或 JSON 分隔:

2025-03-21 14:30:05|USER:li_zhang|EVENT:SELECT|SRC:10.0.0.55|TGT:payments.cc_data|ROW:4510|RESULT:SUCCESS

如果用 JSON,解析和索引都方便:

{
  "timestamp": "2025-03-21T14:30:05Z",
  "user_id": "li_zhang",
  "event_type": "SELECT",
  "source_ip": "10.0.0.55",
  "target": "payments.cc_data",
  "target_id": "4510",
  "result": "SUCCESS"
}

3.4 访问日志记录的整体流程

下面这张图帮你理清整个日志链路的环节:从用户操作到最终落盘。我把它画成了流程图,你一眼就能看明白。

访问日志记录流程 用户 / 应用系统 访问持卡人数据 审计插件 / 中间件 错误拦截 + 记录 Syslog / JSON 队列 错误日志队列 安全日志存储

3.5 避坑指南

做了多个合规项目,我踩过不少坑。分享几个常见的:

  • 忘了记录失败事件:很多团队只记成功的访问。我曾经遇到一个客户,日志里全是 SUCCESS,直到安全扫描才发现有大量暴力尝试——原来失败日志根本没开。PCI DSS 要求记录所有结果。
  • 日志时间不同步:多台服务器的系统时间差了几分钟,取证时根本对不上。记住用 NTP 同步,且日志里写 UTC 时间。
  • 日志权限太小:审计人员无法读取日志,或者运维人员能随便删日志。PCI DSS 要求只有少数特权账号才能修改日志文件。
  • 日志格式不统一:数据库日志一种格式,中间件另一种,分析工具根本喂不进去。统一成 JSON 或标准 Syslog 格式能省大量后期工作。
重要警告:千万不要让应用开发人员直接写文件日志到持卡人数据服务器本地。我见过某公司把访问日志跟生产数据混在一起,结果日志爆满导致数据库崩溃——日志必须集中存储,并确保不影响生产服务的可用性。

3.6 实施检查清单

最后给个实用清单,你对着检查:

  1. 是否所有持卡人数据的访问入口都接入了日志?包括 API、管理后台、数据库直连、文件共享。
  2. 每条日志是否包含用户 ID、事件类型、时间戳(含时区)、来源 IP、目标数据标识、结果?
  3. 日志服务器是否独立于生产环境?磁盘空间是否足够保留至少 12 个月?
  4. 日志文件是否设置了写保护?只有审计管理员才能删除或修改。
  5. 是否定期测试日志生成和收录?不要等着出事了才发现日志没记上。