ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SAP SM30配置表审计留痕全攻略:日志、字段与权限加固实战

SAP SM30配置表审计留痕全攻略:日志、字段与权限加固实战 开头直接说一个我自己的经历我之前在项目上做配置类表的合规加固时审计方丢过来一张表清单要求提供核心配置表的完整变更历史要覆盖谁、何时、把哪个字段从什么值改成了什么值、走没走传输请求。我胸有成竹地打开SM30维护视图准备倒数据结果表里没有创建人、修改时间这类自动更新字段后台日志也没开整张表就像一张白纸——只能看到当前值完全不知道历史。那次之后我把SM30这整套机制从头到尾捋了一遍也踩了不少坑这里把最有价值的5个关键配置步骤和一个真实排障过程完整写出来。不管你是SAP顾问、安全审计配合人还是刚接手配置表维护的新人照着这套做基本能让你的维护视图从无痕现场变成全程留痕。1. SM30表面上是改数据实际上是个无痕现场两个关键缺口必须先认清很多老顾问用SM30维护视图用了好几年从来没觉得它有什么问题因为日常操作确实简单输入表名、增删改、保存、完事。但一旦遇到安全审计、故障追溯、加固交付这套简单就会立刻变成麻烦。1.1 缺口一表结构里没有审计字段系统永远不会告诉你谁建的、谁改的SM30维护视图本质上是SE11表维护生成器生成的一套维护程序它做的事情就是把透明表的增删改操作封装成屏幕交互。但标准行为里它不会自动帮你往表里写创建人、创建日期、创建时间、修改人、修改日期、修改时间。除非你在表结构里显式定义这些字段并且有逻辑去填充它们否则审计人员问这条配置是谁加进来的你只能翻聊天记录、查邮箱去找答案。我在实际项目里见过很多张业务配置表表结构里四个字段ERNAM、ERDAT、AENAM、AEDAT一个都没有。补充这些字段本身不难难的是填值的时机和逻辑这也正好是后面配置步骤二要解决的问题。1.2 缺口二表日志默认关闭旧值丢了就是真丢了SM30不会自动把修改前的值保存下来。你说数据是从A改成B的但审计要的是证据SM30界面上除了截图记录以外没有标准的历史快照机制。这个缺口的影响平时看不出来直到遇到一次生产环境配置被改坏的事故。我们曾经排查过一张审批条件表两位同事先后在SM30里维护过数据但都说不清自己改过什么。因为没有日志数据库里只有最后一次保存的结果中间过程完全无法还原。最后只能靠人海战术回忆效率极低而且没有证据支撑结论。1.3 什么场景下必须补这两个缺口不是所有表都需要做这套东西。像那种一次写入、永远不动的参数表优先级可以放低但凡是审计、合规、安全加固涉及的表尤其是有任务4交付这类硬性交付要求的场景通常审计方会直接要求提供变更记录谁在什么时间申请、审批、执行了变更日志审查表每条数据的新增、修改、删除记录最好到字段级加固前后对比说明改造前和改造后系统在权限、日志、传输方面分别是什么状态这三种交付物如果底层的SM30维护视图没做自动更新字段和日志记录你根本交不出来。所以这两个缺口不是锦上添花的问题是关键路径上的硬需求。2. 动手前的工具箱三条实现路径到底怎么选在讲具体的5个配置步骤之前我强烈建议你先理解三条可用的实现路径因为它们不是互斥关系组合起来才能覆盖完整需求。2.1 路径A表技术设置里直接打开Log data changes这是SAP标准提供的能力。在SE11的表技术设置里有一个日志数据更改选项勾选激活后系统会记录通过表维护框架进行的增删改操作。之后可以用事务代码SCU3查看表的历史记录能看到谁在什么时间对哪些记录做了新增、修改、删除。这条路径的好处是零代码、标准、快速缺点是记录粒度不够细而且对写入方式有限制不是所有数据修改都能记录进去。后面配置步骤一里我会专门讲它覆盖不到的地方。2.2 路径B表维护事件01/02自动填充审计字段表维护生成器在生成维护程序时允许你挂事件Event。其中01号事件是保存前执行02号事件是保存后执行。利用01号事件可以在数据落库前自动填充创建人、创建时间、修改人、修改时间甚至可以做更复杂的数据校验。这条路径解决的是表里这些审计字段谁来写的问题必须写一点ABAP代码但量不大属于常规开发能力就能搞定的范围。2.3 路径C自建日志表记录逐字段旧值/新值这是审计最认的一条路径。自建一张Z开头的日志表在维护事件里把每条变更记录成表名主键字段名旧值新值操作人时间这样的明细行。审计要日志审查表时直接导出一张Excel就能交。这条路径工作量最大但它把你对日志的控制权握在了自己手里。标准日志给不了的字段级对比它全都能给。2.4 三条路径的组合策略我在实际项目里的推荐组合是ABC一起上而不是只选一条。需求标准Log data changes事件自动填充字段自建日志表知道谁在何时操作过表记录满足部分满足满足知道每条记录何时创建、最后修改人不满足满足部分满足靠日志反推字段级旧值→新值对比不直观不满足满足直接导出审计认可的日志审查表不满足不满足满足开发成本无低中高路径A负责兜底防止有人绕过事件路径B负责审计字段本身路径C负责交付物。三者各管一段组合在一起才完整。下面一个个讲配置细节。3. 配置步骤一在表技术设置中激活Log data changes让SCU3有据可查3.1 具体操作路径第一步SE11输入表名点击技术设置按钮。在技术设置页签里往下找到日志数据更改复选框位置通常在数据类别、尺寸类别下方。给它打上勾保存然后激活表结构。第二步去SM30里随便改一条数据保存。第三步用事务代码SCU3输入表名设置时间范围执行。你会看到这张表的操作记录包括操作类型、操作人、操作时间。我建议在做这一步时先拿一张测试表走一遍完整流程确认SCU3能出数据再动正式表。因为SCU3在你真正有数据变更之前显示的就是一张空表别等到审计来查时才发现自己还没激活。3.2 激活后SCU3能查到什么查不到什么SCU3能告诉你的是这张表发生了一次修改操作类型是UPDATE操作人是XXX时间是什么时候它也能向你展示每个被修改记录的当前值和历史值的一个概览。但对审计来说SCU3存在两个明显的短板第一个短板是字段级对比不够直观。如果一条记录有10个字段操作人改了其中2个SCU3的展示逻辑会告诉你这条记录有变更但你能不能一秒看出哪个字段从多少变成了多少要看系统版本的展示效果很多时候还得自己点进去翻。第二个短板是它只记录通过表维护框架的修改。你直接在ABAP程序里写UPDATE语句更新这张表SE16N里手动改数据LSMW里跑批量更新这些操作不一定会被记录。至少我遇到的场景里绕开SM30的直改操作SCU3经常是看不到的。3.3 这个坑必须重视哪些写入方式不会触发日志我吃过一次亏。有一张配置表通过SM30维护时日志是正常记录的但有一个批次任务用SE16N直接改了数据后期审计时查出这批变更对不上号。后来排查才发现问题不在SM30而是SE16N的写入走了另一条路径没有触发表维护日志。所以如果你的交付物里写了本表已开启日志记录一定要在加固前后对比说明里加一句前提该日志仅覆盖SM30/SM34等表维护框架的修改绕过框架的直改不保证记录。这个前提写了审计不会挑你毛病反而不写一旦被发现漏记录信任度直接归零。4. 配置步骤二在表维护生成器里挂事件01自动填充创建和修改字段4.1 在SE11哪里定义维护事件用SE11打开你的配置表路径是实用程序→表维护生成器进入后会看到这张表当前的维护模块列表。在维护模块的界面里有一个事件按钮点进去就是维护事件的配置画面。新建事件时事件编号选择01保存前系统会让你指定一个Function Module来承载逻辑。这里有一个极其重要的经验不要自己从零创建Function Module再手工定义接口一定要在事件配置画面里选择从系统提供的候选参数中创建或者复制SAP提供的事件模板Function Module。因为表维护框架对事件FM的接口有严格的要求参数名必须符合系统约定手工建的接口经常在运行时拿不到数据。4.2 事件模块的接口参数说明事件FM可用的参数中最常用的是下面四个C_DATEN当前屏幕上的全部有效数据C_INSERT本次操作中新增的记录C_UPDATE本次操作中需要更新的记录C_DELETE本次操作中要删除的记录理解这四个参数是后续所有代码的基础。C_INSERT和C_DELETE语义很明确分别对应新增和删除C_UPDATE是当前事务里被修改的行具体它携带的是旧值还是新值不同SAP版本和表维护设置下行为不完全一致。我的做法是不赌它的语义统一用C_DATEN里的行加SELECT单读数据库旧值来判断逻辑最稳。4.3 一个可用的自动更新字段实现代码假设你的表是ZCONFIG_T主键是KEY1审计字段用SAP标准的ERNAM、ERDAT、ERZET、AENAM、AEDAT、AEZET。在事件01的FM中写下面的代码FUNCTION Z_TABLE_EVENT_01. *表维护事件01保存前自动填充审计字段 FIELD-SYMBOLS: fs_new LIKE zconfig_t. * 新增记录填充创建人、创建日期、创建时间 LOOP AT c_insert ASSIGNING fs_new. fs_new-ernam sy-uname. fs_new-erdat sy-datum. fs_new-erzet sy-uzeit. fs_new-aenam sy-uname. fs_new-aedat sy-datum. fs_new-aezet sy-uzeit. ENDLOOP. * 更新记录填充修改人、修改日期、修改时间 DATA: ls_old TYPE zconfig_t. LOOP AT c_update ASSIGNING fs_new. CLEAR: ls_old. SELECT SINGLE * FROM zconfig_t INTO ls_old WHERE key1 fs_new-key1. IF sy-subrc 0. fs_new-aenam sy-uname. fs_new-aedat sy-datum. fs_new-aezet sy-uzeit. ENDIF. ENDLOOP. ENDFUNCTION.这里有一个坑功能够不够直接决定了日志的完整度。对于新增记录我把六个字段全部填上这样创建人和修改人默认一致符合大多数审计预期。对于更新记录我只填修改相关字段不动创建字段。区分新增和更新我通过C_INSERT和C_UPDATE来判断这是最清晰的方式。4.4 事件没触发的几种可能配置完成后要反复验证。我遇到过事件配置了但不触发的情况总结下来主要三种原因第一种事件挂错维护模块了。一张表如果存在多个维护模块例如分步维护和一步维护各生成了一套SM30实际调用的是默认那个你的事件挂在另一个上面自然不触发。第二种事件FM的接口参数没勾选。特别是C_DATEN如果你没把它放进FM接口运行时LOOP AT c_daten就是空表什么都执行不了。第三种事件被停用了。表维护生成器的事件列表里每个事件有状态活动/非活动有时传输请求或增强冲突会把状态改掉很少见但确实发生过。5. 配置步骤三设计日志审查表把旧值→新值→操作人→时间落到明处如果你只需要给内部留个底路径A的SCU3就够用了。但如果是面对外部审计我强烈建议自建日志审查表原因很简单审计要的东西就是一个表格列名清清楚楚值一行行列出来而不是让审计自己去SAP里按事务代码。5.1 日志审查表的字段设计我的建议表结构如下字段名数据元素说明MANDTMANDT客户端ZLOG_IDCHAR20日志流水号TABNAMETABNAME变更的表名KEYVALUECHAR200主键拼接值用-分隔OPCODECHAR1操作类型I新增/U更新/D删除FIELDNAMEFIELDNAME发生变更的字段名OLDVALCHAR255变更前的值NEWVALCHAR255变更后的值UNAMESYUNAME操作用户CDATEDATS变更日期CTIMETIMS变更时间TRKORRTRKORR关联的传输请求可选主键拼接这个字段很重要。审计方拿到日志表后第一件事就是定位某一条业务数据的所有变更记录如果没有KEYVALUE他们要拿多个主键字段去组合查询体验会很差。拼接规则建议用字段值-字段值-字段值的固定格式在报表里也按这个格式展示。5.2 逐字段比对差异的实现逻辑日志写入的核心逻辑就是拿数据库旧值和屏幕新值逐字段比较不同的才写日志。在事件01中你可以先通过SELECT SINGLE把旧值读出来再用动态ASSIGN COMPONENT的方式遍历所有字段。这里给一段核心示意代码* 假设 fs_old 是旧值结构fs_new 是C_DATEN中对应的新值行 DATA: lt_fields TYPE TABLE OF dfies. FIELD-SYMBOLS: fv_old TYPE any, fv_new TYPE any, fs_log TYPE ztable_log. CALL FUNCTION DDIF_FIELDINFO_GET EXPORTING tabname ZCONFIG_T TABLES dfies_tab lt_fields. LOOP AT lt_fields INTO DATA(ls_field). ASSIGN COMPONENT ls_field-fieldname OF STRUCTURE fs_old TO fv_old. ASSIGN COMPONENT ls_field-fieldname OF STRUCTURE fs_new TO fv_new. IF fv_old fv_new. CLEAR fs_log. fs_log-tabname ZCONFIG_T. fs_log-keyvalue fs_new-key1. fs_log-opcode U. fs_log-fieldname ls_field-fieldname. fs_log-oldval fv_old. fs_log-newval fv_new. fs_log-uname sy-uname. fs_log-cdate sy-datum. fs_log-ctime sy-uzeit. INSERT ztable_log FROM fs_log. ENDIF. ENDLOOP.这一段看起来简单但有一个很隐蔽的问题文本字段和数值字段比较时系统可能因为前导零或空格导致值看起来不同实际上没有变化。所以写入日志前要做一个TRIM和条件收敛把数值字段的前导零统一去掉再比较否则日志表里会出现大量无效变更记录审计反而质疑你日志质量。5.3 查询和导出日志的报表日志表建好之后不要只停留在SE16N里能看要做一个小报表否则交付时你还是要写SQL。报表的选择屏幕建议包含表名、操作类型、用户名、日期区间、主键值。输出用ALV展示列顺序按日期时间→操作用户→表名→主键→字段→旧值→新值排这样审计直接按时间线读。报表里一定要提供导出Excel的按钮审计方十个有九个会要Excel版日志审查表。我做过的最低成本实现是直接复制SAP标准的ALV模板改个数据结构几十行代码就能跑起来别自己造报表框架。5.4 日志本身也需要维护保留周期和表增长控制日志表最大问题是增长快。一张频繁变更的配置表一次更新10个字段就会产生10行日志一个月的量可能到几十万行。不做清理一两年后这张日志表会成为数据库里的石头。我在生产环境里定的策略是日志保留12个月超期数据每月月底归档到历史表然后从主表删除历史表再保留24个月三年以上的数据按归档文件存放。清理作业用后台JOB跑SM37监控。这个周期可以根据项目需要调整但一定要有否则日志审查表交付完之后下一个问题就是你的运维同事来找你投诉日志表拖慢备份了。6. 配置步骤四权限与传输请求双控防止SM30从工具变成后门日志做得再全如果有人绕过SM30直接改数据或者有权限的人把日志关了再改那前面所有工作都会失效。权限和传输控制是日志机制之外的另一条防线。6.1 授权对象S_TABU_DIS和S_TABU_LIN的分配边界SM30的权限检查核心是授权对象S_TABU_DIS它控制用户能否对特定表执行维护操作ACTVT里有01创建、02修改、03显示、06删除。S_TABU_LIN可以做行级权限控制限定用户只能维护符合某些条件的数据行。我见过的最危险配置是给大部分开发顾问授了一个所有表全部权限的S_TABU_DIS。这在开发机问题不大但如果在生产系统上也这么配基本等于给所有人留了一个改配置的后门。加固时我的做法是生产系统上的SM30访问权限收敛到一个专门的变更执行组组里只有两三个人其他人如果需要看配置用SE16N只读访问授权对象的ACTVT只给03显示。运维账号和开发账号彻底分离。6.2 强制走传输请求别让人有本地保存的念头SM30维护数据时如果系统配置允许用户可以选择本地请求/不生成请求直接保存这种情况在很多项目里是标配。但站在合规角度看这就是失控点变更没有流转记录、没有审批闭环、也没有可回退的载体。要堵住这个口子建议在SCC4客户端属性里将更改与传输的设置调整为不允许直接更改或者至少调整为实现自动记录更改并要求传输请求。这样SM30保存时就会强制创建传输请求配置变更必须随请求流转到目标系统。交付记录里也就能写明本次变更的传输请求号是什么审计链条就完整了。6.3 加固前后对比说明的交付写法这里给一个我在项目里用过的模板供参考检查项加固前加固后表日志未激活SCU3无记录已激活SCU3可查历史审计字段表无ERNAM/ERDAT/AENAM等字段已增加并在事件01自动填充日志审查表无已建立Z_LOG表字段级记录变更SM30权限开发顾问全员可维护收敛到变更执行组2人传输请求可本地保存强制生成传输请求变更记录无日志审查表传输请求双向关联7. 配置步骤五任务收尾的自查清单与一次真实排障实录配置做完不是结束交付前的验证才是关键。这部分我结合自己一次差点翻车的经历来写。7.1 交付前必测的五个场景第一在SM30新增一条记录查ERNAM、ERDAT、ERZET、AENAM、AEDAT、AEZET六个字段是否自动填充。第二修改这条记录确认只更新了修改人、修改日期、修改时间字段创建人字段没被覆盖。第三删除一条记录检查ZLOG表是否生成D操作记录。第四用SE16N直接改一条数据验证它不会记录到自建日志表这个结果要记入测试说明告知审计覆盖边界。第五通过传输请求导入一批配置检查SCU3是否留痕、ZLOG是否有记录。第五个场景容易漏但实际很有价值。7.2 一次日志没写进去的排查链路有一张正式配置表做加固后我按上面自测场景过了一遍新增、修改、删除都正常ZLOG和SCU3都有数据。但过了几天业务反馈说在SM30里维护数据后ZLOG始终没有新记录。排查的第一步我先在SE11里确认事件01是不是活动状态。结果显示事件状态是生效的事件FM也挂在正确的位置上。第二步我用ST05跟踪了SM30保存的数据库操作发现事件FM根本没有被调用到的迹象。排除了FM本身逻辑问题后我开始怀疑是不是SM30实际调用的维护模块和我在表维护生成器里配置事件的维护模块不是同一个。回到表维护生成器一看果然这张表的一步维护和二步维护分别生成了两套维护模块事件挂在了一步维护模块上而SM30默认调用的是二步维护模块。这就是事件没触发最典型的原因。修复方法不难在二步维护模块上补挂同样的事件FM或者调整SM30调用入口让它统一走一步维护模块。我选了后者因为一个表只挂一套维护模块后续维护成本最低。这个排查过程花了近两个小时最后定位到根因时还是很值得的。7.3 交付物清单整个加固任务收尾时我建议按下面这个清单整理交付物缺什么补什么日志审查表ZLOG表查询报表导出的Excel覆盖测试期间的所有变更SCU3截图/导出展示表级标准日志生效加固前后对比说明按上一节的表格模板填写传输请求清单列出本任务涉及的配置变更请求号及状态权限变更记录谁新增了哪些SM30访问权限、谁被回收了权限测试记录五个自测场景的执行结果包括SE16N不写入日志这个边界按这个清单交付后审计方基本不需要再追着你问这个变更有没有记录这种问题了因为所有的链条都是闭环的。这也是我后来在别的项目里一直沿用的做法。
返回列表