
简介面向SAP系统审计人员、内控与合规岗位从业者的一份审计程序清单文档围绕SAP环境下的审计准备与实施展开帮助读者建立从组织架构、安全政策、应用架构到系统版本、模块与接口的完整核查思路。压缩包内共1个doc文件约112KB以英文条目化形式列出General、Design And Implementation等阶段的审计步骤并给出T000、T001、T042G、TGSB、T001W等关键数据表的查询路径与事务代码提示便于对照实际系统逐项取证。内容还涉及客户端数量、地理部署、定制ABAP程序程度、操作系统与数据库环境等评估维度可作为编制审计底稿与访谈提纲的参考框架。已有414人学习适合需要梳理SAP审计要点、补齐检查清单的初中级读者查阅使用。1. 审计 SAP 系统为什么一份清单能决定审计的成败SAP 系统审计最反直觉的一点是真正决定审计质量的往往不是审计员多会写 SQL、多懂 ABAP而是他在动手之前拿到了什么。一份组织架构图、一份传输目录的读写权限清单、一份 INIT.ORA 里 AUDIT_TRAIL 的取值这些东西看起来平淡却直接决定了后面所有判断是建立在事实上还是建立在猜测上。SAP 审计的本质不是查漏洞而是先建立一套可验证的系统事实基线再拿基线去比对设计意图和实际状态之间的偏差。搞懂这套基线是怎么搭起来的、每一层为什么必须按这个顺序取数比记住任何单条检查项都值钱——因为清单会过时取数的逻辑不会。2. 审计基线为什么必须先取事实再谈风险审计翻车的经典场景是审计员一上来就打开 SM52 看谁有 UNIX 命令权限或者直接跑一条find / -perm -4000然后把结果当成风险报告交上去。问题在于这些输出脱离了上下文就没有意义一个能执行SAPMSOS0的账号如果它同时是生产机 root 且没有变更记录那是高危如果它是受控的批处理账号、有工单和日志那只是设计选择。所以基线层的任务不是找问题而是把系统长什么样固定下来让后续每一条风险判断都有参照物。2.1 组织与架构事实审计的坐标系清单前半段获取组织架构图、安全政策、应用架构图、事件报告、待实施增强、开发方法论、SLA、容灾与备份计划看似是收集文档实际是在建立三组坐标系。第一组是责任坐标组织架构图告诉你谁对哪个模块负责安全政策告诉你权限授予的规则是什么两者一比对就能发现有权限但无对应岗位的账号。第二组是变更坐标待实施增强列表和开发方法论决定了系统未来会怎么变审计员据此判断变更控制流程是否覆盖了所有入口。第三组是连续性坐标备份计划和灾难计划回答的是系统挂了能不能回来这是所有安全控制的地基。这里有个容易被忽略的细节清单要求同时取应用级容灾计划和企业级灾难计划。这两份文档经常不一致应用团队写的 RTO 是 4 小时企业级写的是 24 小时审计员要做的不是选一个信而是把这个矛盾本身作为发现记录下来。常见的实现思路是把每份文档映射到谁批准、谁维护、上次演练时间三个字段缺任何一个字段就标记为控制缺口。2.2 版本、模块与接口决定审计范围的三个变量第 11 到 18 项SAP 版本、已装模块、生产接口、客户端数量、地理分布、定制编程程度、整体安全架构、操作系统与数据库是范围界定层。为什么版本要单独取因为不同大版本在权限模型、审计日志粒度、默认参数上差异很大同一套检查项在不同版本上的结论可能完全相反。模块决定业务对象范围上了 FI 就要查公司代码和会计科目表上了 MM 就要查采购组织和工厂没上的模块不用浪费精力。定制编程程度这一项最值得展开。清单问的是on-going ABAP/4 程序和数据录入屏幕的定制水平本质是在问这套系统里有多少逻辑是标准产品之外的。定制越多标准审计程序覆盖不到的面越大因为自定义报表和增强出口可能绕过标准的权限检查。我一般会这么理解标准模块的权限检查是框架保证的定制代码的权限检查是开发者保证的后者的可靠性完全取决于开发规范执行得如何所以定制程度直接决定了审计抽样要往代码层下沉多深。2.3 组织单元表把配置变成可核对的清单清单第 19 到 33 项是一串表名T000客户端、T001公司代码、T042G公司代码组、TGSB/TGSBT业务范围、T014/T014T信用控制范围、T004/T004T会计科目表、T001W/TVKWZ工厂、T001L存储地点、T024W采购组织、T024采购组、TVKO/TVKOT销售组织、TVTW/TVTWT/TVKOV分销渠道、TSPA/TSPAT/TVKOS产品组、TVTA销售区域、TVBUR/TVKBT/TVKBZ销售办事处、TVKGR/TVBVK/TVGRT销售组。这串表名的价值在于它们把组织架构从一张 PPT 变成了可以逐行核对的数据库事实。审计员拿到组织架构图后用 SE16 打开 T001 比对公司代码列表多出来的代码要么是历史遗留、要么是未登记的组织两种都是发现。带 T 后缀的表T001T、T014T 等是文本表存的是多语言描述审计时用来确认代码和名称的对应关系没有被人为改乱。 通过 SE16/SE17 读取组织单元核对与组织架构图的一致性 T000: 客户端清单确认生产客户端编号与审计范围一致 SELECT MANDT, MTEXT, ORT01 FROM T000 INTO TABLE DATA(lt_clients). T001: 公司代码与组织架构图逐项比对 SELECT BUKRS, BUTXT, ORT01, LAND1 FROM T001 INTO TABLE DATA(lt_company_codes). T001W: 工厂注意 WERKS 与公司代码的归属关系 SELECT WERKS, NAME1, ORT01 FROM T001W INTO TABLE DATA(lt_plants).上面这段的关键不在语法而在比对逻辑MANDT是客户端号生产客户端通常不是 000审计员要确认自己连的是生产而不是开发或测试客户端否则后面所有取数都作废。BUKRS是公司代码是 FI 模块权限和数据的核心分隔维度。WERKS是工厂跨公司代码的工厂配置是常见的权限越界点。参数上INTO TABLE DATA(...)是内联声明实际审计中更常见的是用 SE16N 导出到本地文件再做比对因为审计员通常没有开发权限。提示用 SE16 取数时务必确认当前客户端。在非生产客户端上做的所有核对结论都不能直接用于生产审计。3. 权限链路从 SAP 应用层一路查到操作系统SAP 的安全模型是分层的应用层权限对象、数据库层账号、操作系统层账号三者独立又互相穿透。审计最容易漏的不是某一层而是层与层之间的穿透点——那些让应用层用户获得下层能力的接口。这一章按穿透方向从应用往操作系统走。3.1 应用层权限对象与职责分离矩阵清单第 II 部分第 9、10 项提到用矩阵定义岗位职能和职责分离以及为 SAP 对象字段定义数据归属责任。这是应用层审计的核心方法把岗位和事务码/权限对象做成矩阵检查是否存在同一人同时持有创建供应商和付款这类互斥组合。SAP 的权限检查发生在事务码执行时通过AUTHORITY-CHECK语句比对用户主记录里的权限参数文件所以审计的落点是用户主记录SU01/SUIM和角色定义PFCG。职责分离矩阵的常见实现是行是业务岗位列是事务码或权限对象交叉点标记允许/禁止然后从 SUIM 导出用户-角色-事务码关系做集合运算找出违反互斥规则的组合。这里没有捷径因为 SAP 标准并不内置完整的互斥规则库矩阵必须由审计员根据业务实际自己建。3.2 穿透点一SAPMSOS0 与 SM52清单第 V 部分第 1 项点得很准程序SAPMSOS0能访问 UNIX 命令提示符通过事务 SM52 运行。这意味着任何能执行 SM52 的 SAP 用户实际上获得了操作系统命令执行能力。审计动作是双层的先在应用层查 SM52 的权限分配谁的角色里有 S_DEVELOP 或对应的对象权限再到操作系统层确认这些用户对应的 OS 账号是什么权限级别。这个穿透点的危险性在于它绕过了应用层用户不该有 OS 权限的假设。一个只做报表的 SAP 账号如果角色里误挂了 SM52就等于拿到了 shell。常见的排查方式是导出所有含 SM52 权限的用户逐个核对岗位说明书凡是岗位职责里不涉及系统管理的一律标记为权限过度授予。3.3 穿透点二传输目录与 RDDIMPDP清单第 V 部分第 4、8 项把目光投向/usr/sap/trans下的子目录buffer存待导入的传输请求信息cofiles存传输请求元数据sapnames存请求状态tmp存临时数据log存本地日志work存运行时数据。这些目录的读写权限直接决定了谁能往生产系统里灌代码。如果普通 OS 用户对cofiles或buffer有写权限他就能伪造或篡改传输请求绕过 SAP 内部的传输控制流程。与之配套的是/usr/spool/cron/crontabs/root里的RDDIMPDP它每 5 分钟把排队中的作业迁移到生产。审计员要确认这个批处理文件的权限受控且RDDIMPDP的调度没有被额外篡改——因为一旦有人能改这个 crontab就能让任意作业在任意时间以高权限执行。# 检查传输目录的属主与权限重点看 group/other 是否有写位 ls -ld /usr/sap/trans /usr/sap/trans/buffer /usr/sap/trans/cofiles \ /usr/sap/trans/sapnames /usr/sap/trans/tmp /usr/sap/trans/log /usr/sap/trans/work # 检查 RDDIMPDP 调度是否被改动 cat /usr/spool/cron/crontabs/root | grep -i rddimpdp # 列出所有 root 拥有的 suid/sgid 程序做基线快照 find / -user root -perm -4000 -print /tmp/suid_today find / -user root -perm -2000 -print /tmp/sgid_today第一组命令的输出要看drwxrwxr-x这类权限串里 group 和 other 位的w有写位就是发现。第二组确认RDDIMPDP的调度周期和执行的脚本路径没有被替换。第三组是基线方法把今天的 suid/sgid 清单存下来明天再跑一次做diff新增的条目就是需要解释的变更。清单原文用sum做哈希比对实际用diff更直观两者目的相同——把当前状态变成可比较的状态。3.4 穿透点三数据库层默认账号清单第 VII 部分第 7 项列了四个必须确认已改默认口令的账号SYS、SYSTEM、SCOTT、SAPR3。前三个是 Oracle 自带的SAPR3是 SAP 安装时创建的。这四个账号的共同点是安装文档公开、默认口令公开、权限极高。审计动作是逐个确认口令已改、且改后的口令符合复杂度要求同时确认这些账号的登录是否被审计记录覆盖。第 11 项要求列出所有具备 Resource 或 DBA 权限的用户特别点名SAPDBA。这里要区分角色和用户Oracle 的 DBA 角色可以被授予多个用户审计员要的是最终持有 DBA 权限的用户清单而不是角色定义本身。第 14 项的WITH GRANT OPTION是另一个高频漏洞点——一个普通用户如果对某张表有带授予权的访问他就能把访问权转授给任何人等于权限扩散的源头。-- 确认默认账号的口令状态与账号锁定情况 SELECT username, account_status, expiry_date, default_tablespace FROM dba_users WHERE username IN (SYS,SYSTEM,SCOTT,SAPR3,SAPDBA); -- 列出直接持有 DBA 角色的用户 SELECT grantee, granted_role, admin_option FROM dba_role_privs WHERE granted_role DBA; -- 找出带 WITH GRANT OPTION 的对象授权 SELECT grantee, owner, table_name, privilege, grantable FROM dba_tab_privs WHERE grantable YES AND grantee NOT IN (DBA,SYS,SYSTEM);第一条查account_statusOPEN且expiry_date为空通常意味着口令永不过期是发现。第二条查admin_option为YES说明该用户还能把 DBA 角色转授出去权限链会失控。第三条查对象级授权扩散grantableYES就是带授予权的授权排除系统账号后剩下的每一条都要有业务理由。3.5 审计开关本身也要被审计清单第 VII 部分第 15 项要求检查INIT.ORA里AUDIT_TRAIL是否设为TRUE并核对DBA_SYS_AUDIT_OPTS和DBA_TAB_AUDIT_OPTS。这一项的逻辑很硬如果数据库审计没开前面所有确认操作被记录的结论都不成立。审计员要做的不是看参数值而是看开了之后审什么——AUDIT_TRAILTRUE只表示审计写入数据库表具体审哪些操作由AUDIT语句决定两个审计选项视图就是实际生效的审计策略清单。第 16 项确认审计记录被定期审阅是这一层的收口。审计日志开了没人看等于没开。常见的实现思路是要求提供最近三个月的审计日志审阅记录没有记录就标记为控制失效。4. 避坑与排查审计执行中最容易翻车的五个点4.1 在错误的客户端上取数现象组织单元核对全部通过但业务部门反馈我们根本没这个公司代码。原因审计员连的是开发客户端或测试客户端T000里看到的客户端清单和生产不一致。解决每次取数前先执行SELECT MANDT FROM T000确认当前客户端并与运维确认生产客户端编号把客户端号写进审计工作底稿的每一页。4.2 把 suid 清单当成一次性快照现象第一次跑find / -perm -4000发现一堆条目逐个解释后结案三个月后出了提权事件。原因suid/sgid 是动态变化的单次快照只能证明当时是什么不能证明之后没变。解决建立每日基线用diff比对新增条目必须有人解释来源清单原文用sum做哈希也是同一思路关键是持续比对而不是一次采集。4.3 忽略文本表导致代码名称错配现象T001里的公司代码数量和组织架构图一致但名称对不上。原因只查了主表没查文本表T001T、T014T等主表存代码文本表存多语言描述两者可能被分别修改。解决主表和文本表成对查询用SPRAS限定语言比对代码-名称映射是否与组织架构图一致。4.4 把 AUDIT_TRAILTRUE 当成审计已生效现象参数检查通过但事后追溯某个操作时查不到记录。原因AUDIT_TRAIL只控制审计记录的写入位置具体审哪些语句由AUDIT命令决定没下过AUDIT语句的对象根本不会被记录。解决同时查DBA_SYS_AUDIT_OPTS和DBA_TAB_AUDIT_OPTS确认关键表和关键操作在审计策略里再抽查一条历史操作验证日志里确实有对应记录。4.5 传输目录权限只看属主不看组现象/usr/sap/trans/cofiles属主是sapadm看起来没问题但同组用户能写。原因只看了 owner 位忽略了 group 位的写权限而 SAP 环境里同组往往包含多个功能账号。解决用ls -ld逐目录检查完整权限串重点看 group 和 other 的w位对buffer、cofiles、sapnames三个目录要求 group 写权限必须有明确的业务理由和审批记录。5. 设计取舍为什么这份清单选择先文档后技术这份审计程序的结构本身就是一个设计决策前两部分几乎全是获取文档、确认流程技术检查被推到第三部分之后。这个顺序不是随意的它反映了一个判断——SAP 系统的绝大多数风险来自流程缺口而不是技术漏洞。一个权限配置错误的账号背后往往是岗位变更没走审批一个未授权的传输请求背后往往是变更控制流程被绕过。先取文档是为了让后面的技术发现能挂靠到流程缺陷上而不是变成一堆没有归因的孤立告警。但这个取舍也有代价。文档层的证据依赖被审计方提供提供什么、提供多全审计员控制不了技术层的数据是审计员自己取的可控性高但解释成本高。所以实际执行时我一般会把两层的结论做交叉验证技术层发现一个异常账号回到文档层找它的岗位依据文档层发现流程缺失到技术层找它造成的实际暴露面。两边对不上才是真正值得写进报告的东西。验证方法上最实用的是基线差分把首次采集的组织单元表、suid 清单、权限分配导出成基线文件每次审计或每次变更后重新采集做差分差异项逐条归因。这个方法不依赖任何特定工具diff加人工解释就能跑但要求基线文件本身受控存储否则基线被改了就失去意义。审计层证据来源可控性主要风险文档与流程被审计方提供低文档与实际不符、版本过期应用层权限SUIM/PFCG 导出中角色嵌套导致实际权限被低估操作系统层审计员直接采集高单次快照无法反映变化数据库层DBA 视图查询高审计开关未覆盖关键对象这张表想说的是可控性越低的层越需要交叉验证可控性越高的层越容易让人放松对变化的警惕。我踩过的最深的一个坑就是拿着一次 suid 快照当结论半年后复盘发现中间新增了两个提权程序而基线文件早就不知道放哪了。从那以后我每次做这类审计第一件事就是把基线文件连同采集时间、采集人、采集命令一起归档差分跑完才敢下结论。希望帮到你。本文还有配套的精品资源点击获取