题目与范围
设计多租户审计日志服务,记录登录、权限变更、数据访问和配置更新等安全与合规动作。调查人员需要可检索历史和可验证导出,同时日志故障不能让普通业务悄悄丢失关键证据。
先定义完整性承诺。AWS CloudTrail 描述了可检索的不可变事件历史,OpenTelemetry 提供结构化日志模型;两者都不能证明事件在产生前就一定真实。答案要说清系统能证明什么。
面试官考察什么
面试官考察持久接入、追加写入、完整性验证、租户隔离、留存策略和运维权衡。好的回答会把审计证据与普通调试日志分开,并解释过载时如何避免安全事件丢失或被修改。
作答前需要确认的问题
- 哪些动作必须记录,事件每秒量和突发量是多少?
- 需要的是可发现篡改、抗篡改,还是外部可证明?
- 审计事件无法接收时,业务请求必须失败吗?
- 每个租户保留多久,法律保全是否覆盖删除?
- 谁能查询、导出或验证其他租户数据?
- 调查人员需要哪些查询维度和导出格式?
30 秒回答框架
“我会提供区域接入 API 和本地持久缓冲,让业务请求不依赖搜索索引。每条事件包含租户、操作者、动作、目标、请求关联、事件时间、接收时间、Schema 版本和来源。按租户与时间分区写入追加日志并跨故障域复制,再通过哈希链或签名段清单检测后续修改。近期事件进入热索引,旧段进入不可变留存。查询和导出按租户授权、留存与法律保全执行,并输出可验证清单。监控接收与丢弃、延迟、完整性检查和导出完成率。”
分步深入
第一步:定义事件契约
要求事件 ID、租户 ID、操作者和认证上下文、动作、目标、结果、来源服务、请求 ID、事件时间、接收时间、Schema 版本和必要属性。不要把密钥和无关载荷写入记录,使用引用或脱敏摘要。
第二步:分离接收与索引
只有事件进入持久缓冲或复制日志后才返回成功。消费者异步构建搜索索引和导出。这样搜索集群故障不会静默删除证据,也不会让每个业务请求等待索引完成。
第三步:让完整性可验证
规范化事件,用前一事件或段根计算哈希,并周期性签名或把清单锚定到独立信任域。保存序列缺口和验证结果。哈希链能发现接收后的修改,但不能证明上游服务发出的内容本身真实。
append(event):
canonical = canonicalize(event)
record.hash = H(previous_hash || canonical)
durable_log.append(record)
return accepted(record.event_id, record.hash)第四步:分区与复制
按租户和时间分区,用哈希或租户键分散热点租户。按持久性目标跨故障域复制后再确认。保留租户内或聚合内顺序即可,除非确有必要,不要承诺全局顺序。
第五步:构建热检索与冷留存
近期事件进入调查索引,旧段压缩到不可变对象存储。索引必须能从日志重建。留存任务遵守租户策略和法律保全;删除可以留下可审计的策略记录,但不保留受保护载荷。
第六步:执行访问与导出控制
每次查询按租户、角色、用途和时间范围授权。查询和导出本身也记录为审计事件。导出生成签名清单,包含过滤条件、事件数、段哈希和时间戳,接收方可验证完整性。
第七步:定义故障和过载行为
选择有界本地缓冲、背压和关键事件策略。非关键遥测可以采样或延迟;安全事件则拒绝原始变更,或路由到隔离应急通道。只有易失内存暂存时,不能向调用方报告已接收。
第八步:运营信任边界
监控接入延迟、持久确认耗时、消费者延迟、拒绝事件、序列缺口、哈希失败、索引新鲜度、导出耗时和留存错误。限制密钥访问、轮换签名密钥、测试恢复和验证,并记录“审计系统的审计”。
权衡与边界
权衡一:同步持久还是可用性
同步确认提供更强证据,但会增加延迟,区域故障时可能阻塞写入。应按事件关键性制定策略,不要所有动作一刀切。
权衡二:全局顺序还是租户顺序
租户内顺序成本更低,通常足够调查。全局序列需要协调,会成为吞吐瓶颈。
权衡三:丰富载荷还是最小化
更多上下文利于调查,却增加隐私、存储和删除风险。只收集与决策或控制相关的字段,并记录脱敏和留存规则。
失败演练与演进计划
演练一:搜索索引丢失
删除热索引,从不可变段重建。通过事件数和清单验证查询完整性,同时保持接入继续运行。
演练二:签名密钥泄露
轮换密钥,保留旧验证材料并标记受影响清单。确认调查人员能区分密钥轮换和段被篡改。
演练三:租户热点
压测单一租户,验证分区隔离、租户配额和公平性。其他租户仍应满足持久性和查询 SLO。
常见错误与追问
错误一:把普通数据库表称为不可变
数据库权限能降低风险,却不等于独立证据。要说明追加写入、受限删除和外部验证。
错误二:持久化前确认成功
进程内存队列会随进程消失。明确返回给调用方的实际持久性节点。
错误三:混用调试日志和审计证据
调试日志噪声大且常可修改。审计事件应有独立 Schema、留存、访问策略和完整性路径。
错误四:忽略读取和导出
管理员下载敏感历史本身就是可审计动作。记录对审计系统的访问。
错误五:不说明删除范围
留存与隐私可能冲突。说清法律保全、脱敏、墓碑、复制副本、索引和备份如何处理。
错误六:声称哈希证明事实真实
哈希只能证明与记录链一致,不能证明最初声明准确。保护发出者身份,并明确这个边界。