GSE-2019 An Introduction To SAFTRACE
GSE-2019 An Introduction To SAFTRACE
November 2019
Session FK
Agenda
• What is SAFTRACE?
• When should SAFTRACE be
used?
• Who uses SAFTRACE?
• Where does the tracing occur?
• How is SAFTRACE used?
• A SAFTRACE Example
• Where to get more information
What is SAFTRACE?
• SAFTRACE is a RACF-provided tracing
facility that allows the tracing of:
• RACROUTEs
• RACF callable services
• RACF database requests (“ICHEINTY”)
• Creates a trace record before and
after each service is called
• Writes records to the z/OS
Generalized Trace Facility (GTF)
• Formatted with IPCS, using IPCS exit
IRRUSR57 (alias AMDUSR57) which is
shipped by RACF.
When should SAFTRACE be used?
• When you need/desire to know what
security calls are being made by a
resource manager
• Unexpected actions being taken by
resource managers after a RACF call
• Absence/excessive number of log records
• Key questions:
• Do the requests come from a known set of jobs or
user IDs?
• Are z/OS UNIX System Services functions being
invoked?
• Are the requests access control questions
(REQUEST=AUTH, REQUEST=FASTAUTH…)?
• Are they directed to specific classes?
• Are the requests related to authentication
(REQUEST=VERIFY, REQUEST=VERIFYX…)
• Are other RACF requests potentially involved?
• Is a trace of RACF data base I/O required?
Setting the SAFTRACE Options
SET TRACE(
APPC | NOAPPC
• The RACF subsystem ASID(asid ... | *) | ALLASIDS | NOASID
CALLABLE(ALL | NONE | TYPE(type ...)) | NOCALLABLE
SET command is used to CLASS(class-name ... | *) | ALLCLASSES
IFCLASS(class-name ... | *)
set the TRACE options NEVERCLASS(class-name ... | *)
NOCLASS
NODATABASE | DATABASE(
ALL | NONE
ALTER | NOALTER
ALTERI | NOALTERI
READ | NOREAD )
JOBNAME(jobname ... | *) | ALLJOBNAMES | NOJOBNAME
PDCALLABLE(ALL | NONE | TYPE(type ...)) |
NOPDCALLABLE
RRSF | NORRSF
RACROUTE(ALL | NONE | TYPE(type ...)) | NORACROUTE
SYSTEMSSL | NOSYSTEMSSL
USERID(userid ... | *) | ALLUSERIDS
IFUSERID(userid ... | *)
NEVERUSERID(userid ... | *)
NOUSERID
SAFTRACE in Action: Example 1
Let’s explore why a user can delete a data set to which they have no access
Example: Why Can Bert Delete Ernie’s data?
//SAFTEBRW JOB 'D5202P,?',MSGLEVEL=(1,1),CLASS=A,MSGCLASS=H,
• WHY? ICH70001I BERT LAST ACCESS AT 12:41:00 ON WEDNESDAY, OCTOBER 16, 2019
IEF236I ALLOC. FOR SAFTEDEL COPY
IGD103I SMS ALLOCATED TO DDNAME DD1
IEF142I SAFTEDEL COPY - STEP WAS EXECUTED - COND CODE 0000
IGD105I ERNIE.TOOLS.CNTL DELETED, DDNAME=DD1
IEF373I STEP/COPY /START 2019289.1255
IEF032I STEP/COPY /STOP 2019289.1255
Let’s Apply the Steps…
• Recall the seven SAFTRACE steps:
1. Ensure that the RACF subsystem is active.
Done!
2. Determining what events you want to trace.
RACROUTE REQUEST=AUTH (but let’s trace
all RACROUTEs just to see what is
happening with job SAFTEDEL). Done!
3. Set the trace options using the RACF SET
command. Shown in a moment.
4. Start GTF / ensure that GTF is running.
Shown in a moment.
5. Recreate the scenario that is to be traced.
Shown in a moment.
6. Stopping the trace/GTF. Shown in a
moment.
7. Formatting the trace output. We’ll spend a
lot of time on this in a moment.
Step 3: Setting the Trace Options
• The SET TRACE command is used to set the trace options. If we
wanted REQUEST=AUTH only, that’s service #1 (TYPE(1)). But let’s
get all of the RACROUTEs issued by jobname SAFTEDEL
.-----------------------------------------------------------------------.
-- | Edit Options Help |
SD | -------------------------------------------------------------------- |
CO | System Command Extension |
0 | |
| ===> @set trace(RACROUTE(all)) jobname(SAFTEDEL)) |
0 | ===> |
4 | STORELIMIT |
0 | Comment |
C0 | |
4 | Group Show * (F4 for list) |
0 | More: + |
** | => STOP GTF |
| => STOP GTFMARKN |
| => D A,L |
| => S HC |
| |
| F1=Help F3=Cancel F4=Prompt F5=FullScr F6=Details |
PF | F7=Up F8=Down F10=Save F11=Clear F12=Cancel |
*SDSF
Step 3: Setting the Trace Options…
• It’s a Real Good Idea to ensure that you got the trace set as you
wanted it to be set. The SET LIST command shows the current trace
settings
.-----------------------------------------------------------------------.
-- | Edit Options Help |
SD | -------------------------------------------------------------------- |
CO | System Command Extension |
RE | |
I | ===> @set list |
0 | ===> |
4 | STORELIMIT |
0 | Comment |
C0 | |
4 | Group Show * (F4 for list) |
0 | More: + |
** | => @set trace(RACROUTE(all) jobname(SAFTEDEL)) |
| => STOP GTF |
| => STOP GTFMARKN |
| => D A,L |
| => $PI2 |
| => $PI1-20 |
| => S HC |
| => setprog apf,add,dsn=markn.hrf77C0.load,vol=d94rf4 |
| |
| F1=Help F3=Cancel F4=Prompt F5=FullScr F6=Details |
PF | F7=Up F8=Down F10=Save F11=Clear F12=Cancel |
*SDSF
Step 3: Setting the Trace Options…
• It’s a Real Good Idea to ensure that you got the trace set as you
wanted it to be set. The SET LIST command shows the current trace
settings
-------------------------------------------------------------------------------
SDSF HELD OUTPUT DISPLAY ALL CLASSES LINES 367 13 RESPONSES NOT SHOWN
COMMAND INPUT ===> SCROLL ===> HALF
RESPONSE=SY1
IRRH005I (@) RACF SUBSYSTEM INFORMATION:
TRACE OPTIONS - NOIMAGE
- NOAPPC
- NOSYSTEMSSL
- NORRSF
- RACROUTE
ALL
- NOCALLABLE
- NOPDCALLABLE
- NODATABASE
- NOGENERICANCHOR
- NOASID
- JOBNAME
SAFTEDEL
- NOCLASS
- NOUSERID
Step 4: Starting GTF
• GTF must be started before you run your test scenario. These are the
values that I used:
• PROCLIB (member GTFMARKN in my PROCLIB concatenation)
//GTFRACF PROC MEMBER=GTFMARKN
//BR14 EXEC PGM=IEFBR14,REGION=512K
//SYSPRINT DD SYSOUT=*
//D DD DISP=(OLD,DELETE),UNIT=3380,VOL=SER=D94RF1,
// DSN=MARKN.GTF.TRACE
//IEFPROC EXEC PGM=AHLGTF,PARM='MODE=EXT,DEBUG=NO,SA=100K,AB=100K',
// REGION=2880K,TIME=NOLIMIT
//IEFRDER DD DSNAME=MARKN.GTF.TRACE,UNIT=3380,VOL=SER=D94RF1,
// DISP=(NEW,CATLG),SPACE=(TRK,(30,10))
//*EFRDER DD DSNAME=SYS1.TRACE,UNIT=3390,VOL=SER=TEMP03,
//* DISP=(NEW,CATLG),SPACE=(TRK,(100))
//SYSLIB DD DSNAME=RACFDRVR.PARMLIB.ZR13(&MEMBER),DISP=SHR
.-----------------------------------------------------------------------.
-- | Edit Options Help | --
SD | -------------------------------------------------------------------- |
CO | System Command Extension | F
PR | |
NP | ===> s gtfmarkn,,,noprompt |
| ===> |
| STORELIMIT |
| Comment |
| |
| Group Show * (F4 for list) |
| More: + |
| => @set list |
| => @set trace(RACROUTE(all) jobname(SAFTEDEL)) |
| => @set trace(RACROUTE(all)) jobname(SAFTEDEL)) |
| => @set trace(RACROUTE(type(all)) jobname(SAFTEDEL)) |
| => @set trace(RACROUTE(type(1)) jobname(SAFTEDEL)) |
| => STOP GTF |
| => STOP GTFMARKN |
| => D A,L |
| |
| F1=Help F3=Cancel F4=Prompt F5=FullScr F6=Details |
PF | F7=Up F8=Down F10=Save F11=Clear F12=Cancel |
//SYSLIB DD DSNAME=RACFDRVR.PARMLIB.ZR13(&MEMBER),DISP=SHR
Step 4: Starting GTF…
• Console messages after a successful start
S GTFMARKN.GTF,,,NOPROMPT
IRR813I NO PROFILE WAS FOUND IN THE STARTED CLASS FOR 608
GTFMARKN WITH JOBNAME GTFMARKN. RACF WILL USE ICHRIN03.
$HASP100 GTFMARKN ON STCINRDR
IRR813I NO PROFILE WAS FOUND IN THE STARTED CLASS FOR 610
GTFMARKN WITH JOBNAME GTFMARKN. RACF WILL USE ICHRIN03.
IEF695I START GTFMARKN WITH JOBNAME GTFMARKN IS ASSIGNED TO USER STCUSER
, GROUP SYSGRP
$HASP373 GTFMARKN STARTED
IEF188I PROBLEM PROGRAM ATTRIBUTES ASSIGNED
AHL121I TRACE OPTION INPUT INDICATED FROM MEMBER GTFMARKN OF PDS
RACFDRVR.PARMLIB.ZR13
TRACE=USRP
USR=(F44)
END
AHL103I TRACE OPTIONS SELECTED --USR=(F44)
AHL906I THE OUTPUT BLOCK SIZE OF 23476 WILL BE USED FOR OUTPUT 619
AHL906I THE OUTPUT BLOCK SIZE OF 23476 WILL BE USED FOR OUTPUT 619
DATA SETS:
MARKN.GTF.TRACE
AHL080I GTF STORAGE USED FOR GTF DATA: 620
GTFBLOCK STORAGE 68K BYTES (BLOK= 40K)
PRIVATE STORAGE 1031K BYTES (SIZE= 1024K)
SADMP HISTORY 45K BYTES (SADMP= 40K)
SDUMP HISTORY 45K BYTES (SDUMP= 40K)
ABEND DUMP DATA 0K BYTES (ABDUMP= 0K)
AHL031I GTF INITIALIZATION COMPLETE
Step 5: Recreating the Scenario
• Our test scenario is straightforward: Submitting our batch job
-------------------------------------------------------------------------------
EDIT MARKN.TOOLS.CNTL(SAFTDEL) - 01.04 Columns 00001 00072
****** ***************************** Top of Data ******************************
002200 //SAFTEDEL JOB 'D5202P,?',MSGLEVEL=(1,1),CLASS=A,MSGCLASS=H,
002300 // REGION=0M,USER=BERT,NOTIFY=MARKN
002400 //COPY EXEC PGM=IEFBR14
002700 //DD1 DD DISP=(SHR,DELETE),DSN=ERNIE.TOOLS.CNTL
****** **************************** Bottom of Data ****************************
.-----------------------------------------------------------------------.
-- | Edit Options Help |
SD | -------------------------------------------------------------------- |
CO | System Command Extension |
009 | |
029 | ===> p gtf |
029 | ===> |
009 | STORELIMIT |
009 | Comment |
009 | |
009 | Group Show * (F4 for list) |
009 | More: + |
009 | => D A,L |
009 | => |
009 | => |
009 | => |
029 | => |
009 | => |
DUM | => |
DUM | => |
*** | |
| F1=Help F3=Cancel F4=Prompt F5=FullScr F6=Details |
F | F7=Up F8=Down F10=Save F11=Clear F12=Cancel |
Step 7: Formatting and Reviewing the Trace
• SAFTRACE output consists three
distinct parts
Area value:
00000000 00000000 00A40000 00010000 | .........u...... |
Area value:
0000003C
Area length:
00000000
00000008
| ............ |
function-specific parameter 1
Area value:
D7C1C7C5 F0F84BC3 C1E3C1D3 D6C74040 | PAGE08.CATALOG |
list 40404040 40404040
40404040 40404040
40404040
40404040
40404040 |
|
|
|
Area value:
which is the entity name D6C6C6E2 C5E30028 | OFFSET.. |
Area value:
00000008
Area value:
D7C1C7C5 F0F8 | PAGE08 |
Step 7: Formatting and Reviewing the Trace…
• (3) The raw hex dump
Hexadecimal dump of record follows:
+0000 00000036 D9E3D9C1 C3C54040 D9C1C3C6 | ....RTRACE RACF |
+0010 D7D9C540 00000000 00000000 00000000 | PRE ............ |
+0020 00000000 00000000 00000000 00000000 | ................ |
+0030 83C78020 C9C5C5F0 F0F0F3C4 4040C3D6 | cG..IEE0003D CO |
+0040 D5E2D6D3 C5400000 00000000 00000000 | NSOLE .......... |
+0050 00000000 00000000 009F81A0 00000000 | ..........a..... |
+0060 00F53700 00000000 00F53700 00000029 | .5.......5...... |
+0070 00000029 E2C1C6E3 C5C4C5D3 E2C1C6E3 | ....SAFTEDELSAFT |
Area value:
Area value:
00000006
Area value:
Area value:
D7C1C7C5 F0F8 | PAGE08 |
Step 7: Formatting and Reviewing the Trace… <SAP Plist omitted>
Area value:
68000000 88000000 00000000 009C403C | ....h......... . |
Area value:
name (“DATASET”) D6C6C6E2 C5E30034 | OFFSET.. |
Area value:
0000002C
• This session is FK
An Introduction to SAFTRACE
Mark Nelson, CISSP®, CSSLP®
IBM
November 2019
Session FK