尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SAP ABAP高危授权对象治理:把权限关进笼子

SAP ABAP高危授权对象治理:把权限关进笼子 干SAP这一行快十年权限这块我见过最瘆人的事故不在系统宕机而在某个财务主管的账号深夜被人用批量导走了三年的供应商付款数据。事后排查问题出在几个平时没人盯的授权对象上S_TCODE被配了“”S_RFC里RFC_NAME也是“”。这相当于把能开全厂所有门的钥匙挂在门口不是他权限太大是我们压根没给高价值钥匙配保险柜。这篇想聊的就是SAP ABAP权限体系里那些高危授权对象到底长什么样、为什么会失控以及我们怎么在角色设计、字段值控制、日常审计这些环节把它一步步“关进笼子”。适合BASIS管理员、权限顾问、ABAP开发以及每年要给审计写整改报告的同行参考。1. 高危授权对象与失控的真相1.1 授权对象在原理上就容易被放大SAP ABAP权限控制的基础是授权对象一个授权对象由若干权限字段组成。举个最常见的例子事务码权限对象S_TCODE只有TCD一个字段给字段赋什么值用户就能跑对应的事务码。字段值为“”时SAP默认解释为“所有值”在TCD上就是所有事务码都能执行。这个机制本身设计得没问题问题出在很多人用“”图省事或者对字段含义理解不到位权限一下就放大到失控。授权对象的危险程度和字段数量、字段类型强相关。像S_ADMI_FCD有ADMI_FCD和ACTVT两个核心字段ADMI_FCD取值可以是DBALOG、SYST、SUPR等代表数据库管理、系统配置、用户维护等后台管理动作ACTVT是活动类型01代表创建02代表修改03代表显示。如果这俩字段都配了“*”基本等同于把这个用户变成了半个系统管理员。这里要理解一个底层逻辑授权对象在ABAP程序中通过AUTHORITY-CHECK语句被检查程序检查的是“你在这个授权对象上有没有对应的权限值”而不是“你这个人有多重要”。所以只要有人在某对象的字段上配了宽泛的值再普通的账号也具备同等的操作能力。权限安全的第一道防线就是别让授权对象出现不必要的宽值。1.2 高危授权对象的典型画像与风险清单多年做权限治理我自己整理过一张高危授权对象清单每次给客户做健康检查都会先扫这一遍授权对象关键字段典型风险S_TCODETCD配“*”则所有事务码可执行包括SE16N改表、SM20看日志S_ADMI_FCDADMI_FCD, ACTVT后台管理功能配“*”等于系统管理员能力S_USER_GRPCLASS, ACTVT用户组维护可创建/修改其他用户甚至改自己的授权S_DEVELOPDEVCLASS, OBJTYPE, OBJNAME, ACTVTABAP开发权限可写代码、改程序、绕过前台上传程序S_PROGRAMP_GROUP, P_ACTION程序运行控制不恰当配置可执行任意ABAP程序S_RFCAUTH_TYPE, RFC_NAME, ACTVT远程函数调用可绕过事务码做后台直接调用常见数据泄露出口S_TABU_DISDICBERCLS, AUTHGRP, ACTVT表维护权限直接操作财务、主数据表比事务码更隐蔽S_BTCH_ADMBTCADMIN, ACTVT后台作业管理可修改他人作业、删作业、伪造作业路径S_CTS_ADMICTS_ADMI传输管理授权可释放/修改传输请求把未审代码传进生产S_TRANSPRTTRANSPRT, ACTVT与S_CTS_ADMI配合精细管控请求对象风险等级最高的组合是“S_TCODE带* S_RFC带* S_DEVELOP带*”这套组合一旦同时出现系统里所有技术防线基本可以绕开。所以对这些对象我的原则是可以给但必须拆开、限量、留痕、可审计。2. 诊断阶段先把“谁手里握着老虎钳”摸清楚2.1 用SUIM和SE16N做全量盘点上手做权限保护的第一步不是立刻改角色而是摸家底。SAP标准工具里事务码SUIM是最常用的权限信息查询入口。用SUIM按“用户-权限对象”维度查输入S_ADMI_FCD或S_TCODE就能列出哪些用户通过这些对象获得了权限。SUIM底层跑的是一组标准报表比如RSUSR002你也可以直接在SE38里运行它查“哪些用户拥有某个授权对象的关键值”。操作路径我习惯这样SUIM进去选“Users”-“By Authorization Object”输入对象名勾选“Approach: Where used”执行后系统会列出用户清单和来源角色。这里有个坑如果角色是用派生角色或者复合角色搭出来的SUIM结果可能只显示底层主角色不会直接显示用户最终从哪个复合角色继承来。所以盘点时需要联合AGR_USERS、AGR_1251这些表一起看。批量盘点时用SE16N查这几张核心表效率很高USR02用户主数据可以看账号状态、最后登录日期LDATE字段。热词里提到的“ABAP中查看用户登录日期”实际就是从USR02-LDATE取审计盘点时这个字段很有价值长期不登录的账号如果有高危授权是第一个要收的。UST04用户直接分配的参数文件老系统常用SU02建参数文件这张表能确认有没有绕过角色直接挂参数的账号。AGR_USERS角色和用户的分配关系按角色反查用户。AGR_1251角色的授权对象和字段值按授权对象反查角色。2.2 自制授权风险登记表工具查出来的结果往往几百行不整理成一张可读的表后面审计没法交代。我会用SE38写一个简单的ABAP报表导出清单或者直接SE16N导出到Excel后加工。登记表至少要有这些列用户ID、用户名称、授权对象、权限字段、权限值、来源角色、最近登录日期、账号是否锁定、风险等级。补充一个热词相关的小知识点导出清单时在ABAP代码里用SORT按用户和授权对象排序能方便后续做“同人同对象”去重。毕竟给审计看的材料第一眼要能看懂。风险等级打标规则可以参考高危S_ADMI_FCD为*或S_TCODE为*或同时拥有S_DEVELOP和S_RFC。中危有S_TABU_DIS且AUTHGRP为*或有S_USER_GRP的ACTVT为01/02且CLASS为*。低危有具体事务码、具体函数组限制但缺复核记录。这份登记表应该定期刷新我的习惯是每季度跑一次有重大组织架构调整时临时加跑一次。2.3 覆盖容易被忽略的内嵌权限与表维护权限盘点时最容易漏的是两类一类是事务码内嵌的权限比如用户能执行某个报表事务码但报表内部的某个Function Module会另做一次AUTHORITY-CHECK这时候只看S_TCODE完全不够。另一类是S_TABU_DIS很多顾问用SE11/SE16N维护表没意识到SE16N的“表维护”操作最终检查的是S_TABU_DIS而不是S_TCODE。怎么排查这些隐蔽权限快一点的办法是在SUIM里把S_TABU_DIS、S_PROGRAM、S_RFC这些对象单独拉起清单。更细的办法是做一次ABAP源码扫描RS_ABAP_SOURCE_SCAN这个标准报表可以把指定包中所有源代码搜出来搜AUTHORITY-CHECK OBJECT关键字看有没有关键程序根本没做权限检查。我做过一次客户的财务自定义程序审计40多个自开发程序里有一半压根没写权限检查与其说是漏写不如说是开发时没人提需求。还有一种隐蔽情况是权限对象对应字段里有变量比如S_USER_AGR中的ACTVT配了变量USER本意是“只能操作自己”但如果变量在角色参数里被替换成*意义就完全变了。盘点时遇到变量一定要展开看清楚别让变量成为第二个“*”。3. 治理阶段把分配权限的动作关进笼子3.1 角色设计层的前置控制摸完家底进入真正动手治理的阶段。我见过太多企业把权限问题全甩给“上线后再改”结果权限越改越乱。真正有效的做法是从角色模板阶段就按住。第一高危授权必须拆到独立角色里。不要在生产订单操作员角色里顺手加一个S_ADMI_FCD也不要给财务角色挂整个S_TCODE的“*”。我一般建议单独建纪律角色比如Z_ADMIN_SYSTEM_ROLE里边只放系统管理类授权再通过复合角色按需分配给极少数人。这样即使有人误操作也不会把系统管理权限散到业务角色里。第二做好职责分离。权限治理里有个词叫SoD意思是同一件事不能让一个人从头管到尾。落到SAP里最简单的是“能创建用户的人不能改自己角色的权限”、“能释放传输请求的人不能编辑请求内容”。把这些约束写进权限变更流程的检查项比事后从日志里补救要省钱得多。第三命名规范要硬。基础角色、复合角色、派生角色用统一前缀区分例如Z_BASE_、Z_COMP_、Z_DERI_。否则三个月后你根本分不清哪个角色是干什么的清理风险授权时只能一份份点开看人力和时间消耗都很大。3.2 字段值“精确制导”而不是“一刀切”角色设计之外授权对象字段值怎么赋是核心操作环节。原则很简单能写具体值就不写范围能写范围就不写“*”能限制活动类型就限制到最小。拿S_TCODE举例不要给TCD配“*”。哪怕用户是财务经理他需要的事务码也就是F-001、FB50、FBL1这些建议做成一张允许清单在Z_FIN_MANAGER角色里逐条列出。热词里有人提到“abap请求提交授权F_001”实际上F-001只是个记账事务码把它和其他F系列事务码一起限定给对应岗位就够了没必要给整个财务模块的权限树。再比如S_USER_GRP很多权限顾问喜欢给CLASS赋“*”图省事后果是这个人能维护所有用户组。如果只是想让HR专员维护HR用户的账号CLASS就该是USR_HRACTVT只给02修改不给01创建和03显示。这样即便他登录了SU01也只能在限定组里干活。这里有一个细节CLASS字段在老版本里取值USR_是标准用户组自建的用户组如果放在Z开头的组里权限配置会更清晰但要注意代码里是否写死了标准组名。活动类型ACTVT的值也要抠细。创建01、修改02、显示03、删除06、执行16这些值含义不同。曾见过一个角色给S_ADMI_FCD配了ACTVT02又顺手给了03最后发现用户能看生产系统的后台配置。虽然只是显示权限对某些公司来说这也属于越权所以活动类型一定要按需勾选。3.3 用SU21/SU24固化事务码默认权限很多系统里同一事务码在不同角色中重复配置权限时间久了容易出现权限漂移。标准工具SU24可以在事务码层面维护“建议权限”也就是当你在PFCG里往角色里加一个事务码时系统会自动带上这个事务码的默认授权建议。实际操作分三步先用SU21维护好自定义授权对象的字段说明再用SU24给事务码维护对应的授权对象和字段值最后在PFCG创建角色时执行“添加事务码”让系统自动带出权限建议。带出来的建议值不代表一定正确保存前还要逐个检查尤其是系统建议的S_TCODE值可能带“*”或带一大串业务事务码要根据岗位清单砍到最小。SU24还有一个应用场景给自开发报表挂权限对象。ABAP开发时报表里写了AUTHORITY-CHECK OBJECT Z_MM_PRICE那么在SU24里为这个报表的事务码维护好Z_MM_PRICE的默认授权后续分角色就不用手工填权限了。这里要提醒SU24维护的是“建议”而非“强制”最终生效还是看角色参数文件所以上线前要用SUIM再核对一遍。3.4 权限变更流程与管理闭环权限分配不能靠一张邮件口头审批。我经手的系统里凡是不走流程的权限变更一查一个准最后全是越权。简单但有效的流程可以是业务部门填权限申请单写明账号、需要的角色、开始结束时间权限顾问根据申请生成或调整角色使用SUIM预检查确认不含高危对象宽值系统管理员复核后执行分配并在申请单留痕最后定期导出权限清单发给业务部门确认。企业没上SAP GRC的情况下用Excel维护权限矩阵也完全够用。权限矩阵就三列岗位、事务码权限范围、特殊授权说明。每次新增角色都先和矩阵对照超出范围的一律退回。这套做法不需要额外采购但对控制高危授权尤其有用。4. 执行阶段日常运维中的加固细节与审计4.1 传输、开发与后台作业的权限防水高危授权里开发类和传输类权限一旦失控危害是双倍的。开发人员如果持有S_DEVELOP且OBJTYPE为“*”他可以写一段程序直接读任何表再通过AL11把内容写到服务器文件或者用SE38执行刚写的代码整个过程完全可以绕过业务事务码权限。所以对开发环境的S_DEVELOP建议把DEVCLASS限制在项目专用的开发包比如ZDEV*OBJTYPE字段不要配“*”只给需要在SE80操作的对象类型ACTVT尽量控制为02修改、03显示不给01创建除非确需新建对象。生产环境则干脆不给普通用户S_DEVELOP连SE38查询都通过S_PROGRAM单独放行白名单程序。传输请求这段SE03和STMS是最常被忽略的高危点。SE03允许修改请求所有者、释放请求如果普通用户有S_CTS_ADMI他可以把别人未审的请求悄悄改成自己的再释放。STMS一旦有S_TRANSPRT的高权限可以直接把开发系统任意请求传到生产。这里的防护很简单S_CTS_ADMI和S_TRANSPRT只分配给运输管理员和BASIS其他人一个都不给。传完生产后应在STMS里看导入日志而不是只在开发系统里看请求号。后台作业方面S_BTCH_ADM的高危在于能操作别人的作业。有些ABAP程序在生产机定时跑作业内容是更新财务数据若有人拿到S_BTCH_ADM他可以修改作业的执行时间和参数甚至把作业Content替换成恶意程序。收权策略是只给作业负责人自己创建的作业通过S_BTCH_JOB配合作业名前缀控制避免BTCADMIN设成“*”。4.2 用SU53与SM19/SM20盯住访问行为权限检查失败的瞬间SU53是你最重要的第一手信息。用户跑某个事务码报权限不足第一时间输入SU53画面会显示最近一次权限检查失败的具体对象、字段、应有的值和实际值。排查和加固时我会让用户把SU53截图发过来比翻日志快太多。更上一层是SAP安全审计日志事务码SM19配置SM20查看。你可以给关键授权对象配置审计策略比如当S_TCODE为“*”的用户执行SM20或某个敏感事务码时记录日志对S_ADMI_FCD、S_USER_GRP、S_TABU_DIS的异常访问也记录。审计日志不是配完就完事要定期导出归档至少保留半年遇到安全事件才能回溯。日常监控有一个比较容易忽略的点已经分配给用户的高危授权不一定每天都被用到但用户最后登录日期能反映出“僵尸账号”风险。前面提过用USR02-LDATE查最后登录如果某个账号超过180天没登录还挂着一堆高危角色我会直接禁用账号并回收权限。用AL08可以看当前在线用户但那是即时状态历史登录情况还是查USR02更可靠。4.3 权限变更流程与定期复核的节奏人员调整频繁的公司权限变更如果靠脑子记半年就乱套。我的做法是每季度做一次权限复核触发条件包括年度审计前、人员大规模调整后、职责分离风险出现时。复核流程按三步走第一步从SUIM/自开发报表导出最新权限清单和权限矩阵比对。第二步标出新增的高危授权要求对应负责人重新确认必要性。第三步向业务负责人邮件发送本部门高风险用户清单请他在5个工作日内反馈“哪些可以收、哪些确实还要”。这一步容易得罪人但必须要做。曾经有个部门负责人对我抱怨收权限太麻烦我把上季度该部门员工用SE16N查供应商主数据的日志截图发过去他马上闭嘴了。复盘时每次发现的高危授权都要回溯根因是角色模板本身有问题还是走特殊分配绕过流程还是系统参数文件历史遗留。根因不修下次还会从同样的口子溜进来。5. 常见问题排查与避坑实录5.1 权限检查失败的经典排查流程用户报“执行F-001没权限”这类问题时别急着加权限按这个流程走能少走很多弯路第一步让用户执行事务码后立刻跑SU53复制或截下失败画面。SU53显示的是最近一次AUTHORITY-CHECK失败的对象字段值。第二步进入SUIM查该用户所有角色以及角色指向的授权对象字段值。第三步对比SU53中“应有值”和当前角色中的实际值确认是角色里根本没有这项权限还是权限值冲突或角色未激活。第四步如果是角色缺权限在PFCG里改角色增加对应授权值重新生成参数文件然后让用户重新登录测试。第五步如果改了角色后仍然失败用SE03检查是不是角色没有分配或用户主数据里还残留旧的参数文件。一个容易栽的坑用户主数据直接分配了参数文件和角色授权交叉时系统按“并集”而不是“覆盖”来算权限。也就是说即使你改了角色去掉某个权限如果用户主数据里有参数文件保留了该权限系统照样放行。这种历史包袱在旧系统里很常见清理时一定要连同UST04一起查。5.2 常见问题速查表典型问题直接原因处理建议用户能进SM20但权限审计要求整改SM20对普通用户开放过宽撤销SM20改由BASIS统一查看并定期导出角色里S_TCODE为“*”导致所有事务码可执行历史模板图省事配置按岗位梳理事务码白名单建立角色模板开发账号能直接查看供应商表数据S_DEVELOP的OBJTYPE为“*”限制OBJTYPE和DEVCLASS到指定包表格查询改走授权报表RFC用户绕过事务码调用函数S_RFC的RFC_NAME为“*”限定RFC_NAME为具体函数组专号专用通过SU01修改自己用户组权限S_USER_GRP CLASS为“*”且ACTVT含02将CLASS限定到专属用户组ACTVT只留02后台作业被恶意修改S_BTCH_ADM BTCADMIN为“*”只给作业创建人或指定运维人员作业名限制前缀用户长时间不登录仍挂高危角色缺少定期复核用USR02-LDATE筛180天未登录禁用并回收权限5.3 几个真正值钱的避坑心得干权限这行越久越发现真正的问题往往不在技术上而在管理习惯。这里写几个被反复验证过的心得希望能帮你少踩坑不要在SU24里看到“建议权限”就直接保存建议权限只是系统根据默认参数推荐的值实际授权中经常出现过宽。手动检查每一项特别是S_TCODE的“”和S_PROGRAM的“”建议全部展开看一遍再保存。修改过的高危授权建议用SUIM再导一次最终值做前后对比。要给开发人员分权时隔离比信任更靠谱。偶尔有开发人员申请S_DEVELOP后顺手打开SE38查看业务数据这不是主观恶意但审计只看结果。我的做法是开发功能统一用限定包方式授权业务数据访问单独走带AUTH检查的报表两边互不交叉。这样真的出问题时责任边界清楚不用互相猜。自开发程序的权限检查必须在开发规范里硬性要求。凡是访问业务数据的自开发报表或功能模块一律写AUTHORITY-CHECK不允许只靠事务码权限兜底。热词里提到的ABAP SORT、DEQUEUE_ALL这类基础语句如果出现在一个读取敏感数据的程序里尤其要看看程序本身有没有做权限校验因为程序可以通过后台执行绕过S_TCODE检查。排查权限问题时别忽略角色激活状态。很多角色改了半天没生效用户重新登录后还是报错原因就是参数文件没生成或没保存。PFCG右上角改完一定要点“生成”按钮否则管理员的修改只是在草稿里躺着。最后所有对高危授权的变更都要留一份变更记录。我就遇到过审计要追溯“为什么三个月前给某个用户加了S_ADMI_FCD”如果当时没有邮件申请和复核记录这个锅只能自己扛。简单点在授权登记表里加一个“变更说明”列每次改一行就写一行理由半年后你会感谢当时的自己。我在实际项目里用过很多工具和方法最有效的可能还是那条最土的原则高危授权永远只给具体值永远只给够用的人永远要有记录。权限治理不是上线时做一次就完了它是一个不断盘点、收权、复核的循环。把高危授权关进笼子不是为了跟业务部门对着干而是为了在真正出事的时候能挺直腰杆说一句我们尽力了。
返回列表