多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

SAP安全审计日志接入SIEM:RSAU_LOG_API接口采集与合规实践

SAP安全审计日志接入SIEM:RSAU_LOG_API接口采集与合规实践 接手这个需求之前我的第一反应是SAP 安全审核日志这种老生常谈的东西能有什么新花样直到去年帮一家制造企业把审计日志推进他们的 SOC 平台我才发现大部分项目不是不想做而是卡在“怎么稳定地把日志拿出来”这一步。SM20 里翻日志和真正把日志做成 SIEM 里的告警源中间隔着 RSAU_LOG_API 这个被很多人忽略的关键接口。如果你也在做 SAP 合规审计、等保整改或者企业安全日志中台建设这篇文章应该能帮你把整条链路走通。1. RSAU_LOG_API 是在什么场景下非用不可1.1 SAP安全审核日志到底在记录什么SAP 的安全审核日志Security Audit Log记录的是系统里的安全相关事件不是普通的业务流水。它主要覆盖几类内容用户登录成功与失败、RFC 连接尝试、权限检查失败、事务代码启动、敏感授权变更、密码修改、导出下载行为等。很多企业以为只要装了 SAP 就有这些日志实际上默认配置下它可能只开了一部分或者根本没有开启。举个例子生产系统里财务人员用 F-02 做了一笔清账凭证如果审计日志没开事后追查就只能靠操作记录表里的蛛丝马迹。开了审计日志之后谁在什么时间、从哪个客户端、用哪个用户执行了什么事务代码全部有迹可循。这不是业务日志它是安全事件日志是 SIEM 分析用户行为、发现异常操作的关键数据源。1.2 只靠 SM20 翻日志为什么走不通SM20 是 SAP 官方的审计日志查看事务代码很多安全团队第一反应就是让管理员定期去 SM20 里导出。这种方式在小系统、低频审计的场景下勉强能用但放到稍微正规一点的企业里就彻底撑不住。我见过一个集团客户生产环境有 6 个应用服务器实例每天的审计日志大约 20 万条。审计人员想查上周某个账号是否有异地登录得先登录 SAP 图形界面一台实例一台实例地切再用 SM20 按用户名过滤导出来之后还得手工合并 Excel。整个过程快则半小时慢则一天。SIEM 的核心价值是集中关联和实时告警靠人工翻 SM20 根本做不到。另外安全审核日志还有一个特性日志文件会按实例分散存放。开发、测试、生产各一套系统每个系统里可能有多个实例。如果不定时集中采集日志随老化策略滚动覆盖之后事后再想追就追不回来了。1.3 RSAU_LOG_API 解决的核心问题RSAU_LOG_API 是 SAP 提供给外部程序读取安全审核日志的函数模块通过 RFC 方式调用。它解决的是“如何批量、结构化、可编程地拿到审计日志”的问题。外部系统只要具备一个 RFC 账号和接口调用权限就可以按时间窗口、按事件过滤条件拉取日志数据返回结果是结构化数据表而不是 SM20 界面上的显示文本。你可以把它理解成 SAP 给 SIEM 开的一扇窗日志在 SAP 内部怎么产生、怎么存储不用管外部采集器只需要按照约定的接口协议来拉数据。你最终在 SIEM 里看到的每一条登录失败、权限报错、事务代码执行记录源头就是这扇窗。注意SM20 和 RSAU_LOG_API 看到的是同一份底层日志只是入口不同。2. 方案选型与整体架构设计2.1 主流接入方案对比聊到把 SAP 审计日志接进 SIEM市面上能走的路线不止 RSAU_LOG_API 一条。我自己过了一遍主流方案列个对比表供参考方案适用版本优点缺点RSAU_LOG_APIRFC 拉取ECC、S/4 均可跨版本兼容性好结构化返回可精确控制时间窗和过滤条件需要 RFC 账号和函数授权不同版本参数有差异官方 SIEM Connector特定版本和平台官方维护字段映射现成依赖 SIEM 平台版本定制空间小Security Audit Log REST APIS/4 HANA 新版本HTTP 接口运维友好适合云部署老系统不可用升级路径有要求直接读日志文件或内部表任意看起来直接内部结构随版本变化容易漏数据不推荐工程上最常用的还是 RSAU_LOG_API。原因很实在ECC 存量市场太大很多企业还在用传统部署RSAU_LOG_API 的兼容性比 REST API 好它返回结构化字段比解析日志文件省掉大量正则匹配工作。新上的 S/4 HANA 云项目可以优先评估 REST API传统项目直接走 RSAU_LOG_API 是最稳妥的路径。2.2 一套耐用的采集架构长什么样我习惯把整个链路分成四层SAP 应用层、采集层、解析标准化层、SIEM 消费层。SAP 应用层负责生成审计日志SM19 确认配置、SM20 可以随时抽查。采集层部署一个独立采集器通过 RFC 定时调用 RSAU_LOG_API 拉取新增日志。解析层把 SAP 返回的字段映射成统一事件格式补充来源标识、业务域标签。SIEM 消费层负责索引、告警和报表。这里有一个经常被忽略的设计原则采集层拿到的原始数据不能直接往 SIEM 里灌必须先落一份原始日志到本地磁盘。为什么因为 SAP 端日志有保存周期一旦被覆盖清洗规则改错了想重新解析就没有数据源了。我后来在项目里都要求采集器先写原始 JSON 文件保留 30 天再进 SIEM。这个习惯救过我好几次。2.3 SAP侧的前置条件检查单动手配置之前建议先过一遍以下清单能省掉很多排障时间确认安全审核日志已经在配置文件中激活而不是只在 SM19 里动态开了一下确认要采集的应用服务器实例都在记录范围内创建专用 RFC 服务账号只授予读取审计日志所需的权限在 SE37 里确认 RSAU_LOG_API 可以被远程调用用 SM20 手工查一下最近一小时是否有日志产生确认数据源本身是通的评估日志量先抓一个高峰小时的条数估算日均量再按这个量规划存储和同步频率如果这些前置条件没确认就急着写采集器后面百分之百会出问题而且是那种看起来代码没问题但就是拉不到数据的诡异问题。3. 实操配置与接口调用细节3.1 把安全审核日志安全地打开遇到很多项目第一步就翻车管理员在 SM19 里把激活状态改了当时能看到日志但实例一重启又回到原样。原因很简单SM19 是动态配置有些参数不写入配置文件就不可持久。正确做法是先改实例配置文件里的审计日志激活参数把激活级别从 0 调整为需要的级别具体级别含义以你系统版本为准不同级别记录范围不同然后重启实例或按参数类型决定是否热生效。之后再进 SM19 做动态细化配置哪些事件要记录、按什么条件过滤。最后用 SM20 验证是否能查到实时产生的日志条目。生产的建议是重点关注这几类事件登录成功与失败、RFC 登录、权限检查失败、事务代码启动、密码变更、导出敏感数据。至于高噪声的内部监控类事件建议从过滤条件里排除否则日志量直接翻好几倍。这里补一个经验动态激活和静态激活搞混是 SAP 审计日志项目里排名第一的坑。我见过有人前期验证一切正常上线后第二天发现日志停了查了半天才发现实例在夜间自动重启过动态配置丢了。改配置文件这步不能少。3.2 用 RFC 调用 RSAU_LOG_API 的正确姿势RSAU_LOG_API 是函数模块外部采集器通过 RFC 协议调用。SAP 侧需要一个可远程调用的函数环境SE37 里可以看这个函数模块的属性RFC 目的地可以用 SM59 配置服务账号要能通过授权检查。这些准备工作做完之后外部调用就比较简单了。下面是一段示意代码注意函数参数名在不同 SAP 版本里可能有差异落地前用 SE37 对着实际参数名核对一遍import pyrfc conn pyrfc.Connection( ashost10.0.0.10, sysnr00, client300, userALM_AUDIT, passwdxxxx, langEN, ) # 示意调用RSAU_LOG_API 的具体导入/导出参数以 SAP 版本为准 resp conn.call( RSAU_LOG_API, date_from20250101000000, date_to20250131235959, max_rows50000, ) logs resp.get(OUTPUT_TABLE, []) for row in logs: print(row)调用的时候有几点值得注意一是时间窗口尽量控制在可预测的范围内别一上来就拉一整年数据二是 max_rows 这种上限参数不要盲目调大数据量大时应该缩小时间窗口分批拉而不是指望一次全拿回来三是采集器要有超时重试机制RFC 调用在日志量大的时候响应时间会明显变长。我实际测试过单次拉取控制在几千到几万条范围内响应最稳定。超过这个量级与其调大参数不如把窗口切成 10 分钟一段。3.3 增量拉取与可靠性设计审计日志接入 SIEM 必须做到可重放、不丢数、尽量不重复。我的做法是在采集器里维护一个“上次成功拉取到的时间戳游标”每次只拉游标之后的数据同时把窗口起点往前多退 10 分钟作为重叠区。数据进入本地原始文件后按时间戳和事件唯一标识做去重再进入解析环节。增量设计有一个容易踩的坑SAP 审计日志的事件时间戳是事件发生时间不是落盘时间如果采集器按“当前时间往前推固定窗口”去拉边界处容易出现漏数。重叠窗口加去重能很好解决这个问题。另外采集器建议支持断点续传程序重启后从上次游标继续拉而不是从头开始。这里不用做太复杂把游标持久化到本地文件或数据库表就行。还有一个性能上的心得多实例环境下可以按实例并行拉取但并发数别开太大。我试过同时开 5 个连接同时拉同一套系统SAP 侧 CPU 有明显波动后来控制在 2 到 3 个并发就稳定了。4. 日志解析、字段映射与减噪过滤4.1 返回日志里有价值的核心字段RSAU_LOG_API 返回的是结构化数据字段比解析文本日志友好太多。拿到一条日志后落地到 SIEM 时至少要把以下信息单独拆出来字段含义SIEM 中的用途事件ID / 事件名称记录的是哪类安全事件告警规则主键严重级别 / 告警标记事件的重要程度风险分级事件时间戳审计事件发生时间时间轴关联用户名执行操作的用户主体属性客户端SAP 客户端编号租户隔离维度事务代码执行的业务操作业务关联主机名 / IP来源主机和地址网络溯源程序名调用的 ABAP 程序识别批处理场景消息文本补充说明信息人工研判辅助字段名在不同 SAP 版本里可能略有差别但“找这些信息”的思路是通用的。第一次对接时先把一条日志打印出来人工对照字段含义再写解析映射。不要拿着网上别人给的字段名硬套版本差异会让你怀疑人生。4.2 常见事件ID先认识一遍SAP 审计日志的事件 ID 类似于 Windows 事件 ID每个 ID 对应一类事件。常见的有这些事件ID含义关注场景001对话登录成功正常/异常访问基线002对话登录失败暴力破解检测003RFC 登录成功接口调用行为审计004RFC 登录失败接口暴力尝试005密码修改账号异常变更008事务代码启动业务操作追溯409权限检查失败越权行为检测410权限检查失败其他越权行为检测这里必须提醒一句不同 SAP 版本、不同内核版本对事件 ID 的定义可能扩展或调整。别拿这个表当成金科玉律正确做法是先在自己系统上用 SM20 点开几条日志确认你当前版本的 ID 映射关系再写进 SIEM 的 enrichment 配置里。4.3 落地到SIEM之前的减噪动作不经过减噪就直接灌日志SIEM 会被海量信息淹没。我处理审计日志时一般做三个固定动作。第一个是过滤内部心跳。监控探针、健康检查、接口轮询这类固定源头的日志在采集端直接丢弃或标记为低优先级不参与告警计算。第二个是合并短时事件。同一用户同一来源 IP 短时间内多次成功登录往往是会话重连不是攻击行为可以聚合成一条会话记录再进 SIEM。第三个是补充事件标签。给每条日志打上 success、failure、denied 这类语义标签后续写告警规则时直接按标签筛选效率高很多。减噪不是让你把信息删掉而是让 SIEM 里留存的数据更聚焦。真正的原始日志在采集器本地有备份需要时还能回溯。5. 从安全事件到业务审计的关联实战5.1 安全团队值得先上马的检测场景日志进了 SIEM 之后第一步不是做华丽的可视化大屏而是先把告警规则跑起来。我认为有三类检测场景优先级最高。第一类是暴力破解检测。基于 002/004 类登录失败事件统计同一用户在 5 分钟内失败次数超过阈值触发告警。规则里要排除已知的内部跳板机和服务账号否则误报会非常多。第二类是敏感权限变更检测。当日志中出现授权对象修改、角色调整、用户锁定/解锁等事件时告警同步给安全管理员。这类操作很多企业完全不做监控出了内鬼才想起查日志。第三类是 RFC 接口滥用检测。针对 003/004 类事件重点观察非业务时间段的 RFC 调用。如果某个接口账号突然在凌晨三点频繁建立 RFC 连接即使登录成功也要拉出来人工确认。这些规则在 Splunk、QRadar、ArcSight、ELK 里都能实现关键在字段有没有解析干净。字段没映射好规则写得再漂亮也是空转。5.2 把事务代码和具体业务动作对上审计日志里的 TCODE 是业务操作的入口但安全团队往往不熟悉每个事务代码的业务含义。我建议建一张 TCODE 字典表把常用事务代码映射到业务域在解析阶段直接加一个 business_area 字段。比如财务域F-02、FB50、FB02、F.13、AB08采购域ME21N、ME22N、ME23N、ME31K物料域MIGO、MB11、MBST、MB1C、MB1B物流域VL01N、VL02N、VT01N有了这个映射很多业务上的异常操作就能快速定位。举个例子物料账上出现一批凭证冲销操作安全团队在 SIEM 里按 TCODEMBST 一筛立刻能看到是什么人、什么时间、用的哪个客户端做的再联动业务部门确认是否授权。如果只盯着安全事件看这种问题很难主动暴露。还有一个很典型的场景制造企业经常有人用 MD07 查看物料覆盖情况再去 MD04 做需求追溯。这种高频查询本身不是风险但如果你发现一个平时从不碰这个事务代码的账号突然开始大批量执行就该查一下是不是账号被盗用了。采购订单含税价格变更也是同理ME22N 改单动作本身正常但价格敏感字段变化需要和权限审批流关联起来判断。5.3 报表模板与留存周期建议SIEM 上线后管理层和审计总要看到报表。我常用的几张报表模板可以给你参考登录成功/失败趋势图按小时聚合登录失败次数 Top 用户和 Top 来源 IP高风险事务代码调用排行权限变更操作流水明细敏感客户端的高危操作汇总留存周期方面我的建议是安全审核日志在线保留至少 180 天冷归档 12 个月以上。等保三级和 ISO27001 行业还会有额外要求具体以企业安全策略为准。按前面的日志量估算逻辑如果每天 120 万条约 60GB 原始数据在线 180 天大概需要 11TB 左右存储预留 1.2 到 1.5 倍余量比较稳妥。6. 常见问题排查与避坑清单6.1 接不到数据按什么顺序排查接口调通了但 SIEM 里没有数据这是最常见的故障。我建议按以下顺序排查现象常见原因定位方法调用超时时间窗口过大缩短窗口到 10 分钟先跑通再扩大返回空表激活级别不够或过滤条件过严用 SM20 查同一时间窗口是否有数据授权失败RFC 账号权限不足用 SE37 单步测试函数模块看授权错误有时间差时区未对齐确认 SAP 系统时区和 SIEM 时区映射数据重复/丢失游标和重叠窗口处理不当检查游标持久化逻辑和去重策略遇到过一种很迷惑的情况调用能成功返回但只返回最近 1 小时数据再早的数据全部为空。最后发现是采集器把日期参数格式传错了SAP 端没有报错只是按参数做了静默过滤。遇到空结果时先把参数原样打出来和 SE37 文档对一遍。6.2 日志量大同步慢怎么处理同步慢的根因多数不是接口本身而是采集策略太粗暴。单次调用拉一整天的数据SAP 侧扫描时间长网络传输也慢还容易把应用服务器搞出性能告警。我的处理方式是按源实例分片配合时间窗口分段。比如 6 个实例并行拉取时并发控制在 2 到 3 个每个实例按 10 分钟窗口横向切分。同步频率也可以做弹性调整白天高峰期每 5 分钟同步一次夜间低峰期每 15 分钟一次。这样既保证实时性又不给 SAP 系统增加不必要的负担。如果历史数据量特别大建议分两条链路一条实时增量一条历史回填。历史回填放到夜间窗口慢慢跑不占用白天资源。6.3 容易被忽视的时区与版本差异时区问题几乎每个项目都会遇到而且第一次对接必中招。SAP 审计日志存储的时间戳通常是 UTC 或系统时区SAP GUI 里显示的是登录用户本地时区。如果 SIEM 直接按接收时间展示你会看到登录记录比企业标准时间差了几个小时。解决办法是在 SIEM 接入配置里显式维护“SAP 系统时区 → SIEM 展示时区”的映射关系并在最终事件里统一存 UTC 时间戳展示时再转换。不要想当然地在采集器里固定加 8 小时有些系统部署在非中国时区的服务器上固定偏移会二次踩坑。版本差异则更隐蔽。SAP 升级后事件 ID 含义可能扩展甚至字段结构都有小变化。我的习惯是每次系统版本升级后回看最近一天的日志样例确认解析规则没有失效。这个动作虽然不起眼但能避免升级后的“静默丢日志”。7. 收尾前再分享几条硬经验做了几个 SAP 审计日志对接项目之后我发现真正决定项目成败的往往不是接口调用本身而是周边配套。这里分享几条可能对你有用的体会。第一SAP 侧的配置文档一定要写进交付物。项目上线半年后运维人员换了一拨如果只留了 SIEM 侧的字段映射文档没人知道运行时审计日志激活级别在哪改、RFC 账号权限在哪查出了问题只能抓瞎。我在交付里固定放一份“SAP 侧配置手册”从激活参数到账号授权到常见排障全部覆盖。第二同步延迟的监控比日志本身更重要。SIEM 里日志再多如果同步停了三天没人发现告警规则全在空转。我一般会在采集器上做一个心跳指标每次成功拉取后上报到 SIEM超过 15 分钟没心跳就触发采集故障告警。这个改造成本很低但效果非常明显。第三原始日志备份策略要提前想清楚。SAP 审计日志按老化策略滚动企业审计最长可能要回溯一年以上的数据SIEM 在线存储不可能全留。我的做法是采集器本地保留 30 天原始文件定期把更早的原始日志归档到对象存储一旦 SIEM 需要重放历史数据随时可以从归档里取。别等审计找上门才想起原始日志已经被 SAP 覆盖了。最后补一个细节接口对接完成后别急着把 SIEM 告警开满。先用两周时间做告警调优把误报率压下来再推给安全团队使用。一上来告警轰炸结果就是安全团队把告警全部静默届时你这个项目就真的白做了。
返回列表