報表安全系列五:如何限制指令 CHGSPLFA 的使用, 防止使用者更改其他人報表的屬性?
有鑑於 報表的安全性管理,iSeries(AS/400) 作業系統並未提供完善的保護,我將建議使用 VCP 命令
語法檢核程式來做安全空管,
報表安全系列一 :如何限制指令 WRKSPLF 的使用, 防止使用者察看全系統的報表 ?
報表安全系列二 :如何限制指令 DSPSPLF 的使用, 防止使用者於 WRKSPLF 畫面中瀏覽全系統的報表 ?
報表安全系列三 :如何限制指令 DLTSPLF 的使用, 防止使用者刪除其他人的報表 ?
報表安全系列四 :如何限制指令 CPYSPLF 的使用, 防止使用者複製其他人的報表 ?
報表安全系列五 :如何限制指令 CHGSPLFA 的使用, 防止使用者更改其他人報表的屬性?
有 *SPLCTL 權限的人可以更改系統上任何報表的屬性,如印表機,Outq 輸出佇列..等屬性,
要如何防止非授權使用者更改機密敏感的報表資料屬性,為了要防止這種情形發生,只能從命
令檢核程式著手,此範例與其他相關報表命令
(WRKSPLF, DSPSPLF, DLTSPLF, CPYSPLF)的檢核程式一樣,限制除了 QSECOFR, QSYSOPR
之外,使用者僅能刪除自己的報表,同樣也分 OS V5R1(含)以前及OS V5R2(含)以後的版本。
CHGSPLFAVC 命令語法檢核程式 for V5R1
File : QCLSRC
Member: CHGSPLFAVC
Type : CLP
OS version: V5R1 以前
Usage : CRTCLPGM mylib/CHGSPLFAVC
CHGCMD CMD(CHGSPLFA) VLDCKR(mylib/CHGSPLFAVC)
若執行有問題或不使用命令語法檢核程式時,執行
CHGCMD CMD(CHGSPLFA) VLDCKR(*NONE)
/* Program : CHGSPLFVAVC */
/* System : iSeries 400 */
/* */
/* Validity Checking program for command CHGSPLFA */
/* */
/* Example : protecting an OUTQ from a USER */
/* */
/* CHGCMD CMD(CHGSPLFA) VLDCKR(MYLIB/CHGSPLFVAL) */
/* To reset (in case you made errors) : */
/* CHGCMD CMD(CHGSPLFA) VLDCKR(*NONE) */
CHGSPLFVAL: PGM PARM(&P1 &P2 &P3 &P4 &P5 &P6 &P7 &P8 &P9 +
&P10 &P11 &P12 &P13 &P14 &P15 &P16 &P17 +
&P18 &P19 &P20 &P21 &P22 &P23 &P24 &P25 +
&P26 &P27 &P28 &P29 &P30 &P31 &P32 &P33 +
&P34 &P35 &P36 &P37 &P38 &P39)
DCL VAR(&P1) TYPE(*CHAR) LEN(1)
DCL VAR(&P2) TYPE(*CHAR) LEN(10) /* FILE */
DCL VAR(&P3) TYPE(*CHAR) LEN(26) /* JOB */
DCL VAR(&P4) TYPE(*CHAR) LEN(1)
DCL VAR(&P5) TYPE(*CHAR) LEN(44) /* SELECT */
DCL VAR(&P6) TYPE(*CHAR) LEN(10) /* PRINTER */
DCL VAR(&P7) TYPE(*CHAR) LEN(1)
DCL VAR(&P8) TYPE(*CHAR) LEN(20) /* OUTQ */
DCL VAR(&P9) TYPE(*CHAR) LEN(10) /* OUTQ LIB */
DCL VAR(&P10) TYPE(*CHAR) LEN(1)
DCL VAR(&P11) TYPE(*CHAR) LEN(1)
DCL VAR(&P12) TYPE(*CHAR) LEN(1)
DCL VAR(&P13) TYPE(*CHAR) LEN(1)
DCL VAR(&P14) TYPE(*CHAR) LEN(1)
DCL VAR(&P15) TYPE(*CHAR) LEN(1)
DCL VAR(&P16) TYPE(*CHAR) LEN(1)
DCL VAR(&P17) TYPE(*CHAR) LEN(1)
DCL VAR(&P18) TYPE(*CHAR) LEN(1)
DCL VAR(&P19) TYPE(*CHAR) LEN(1)
DCL VAR(&P20) TYPE(*CHAR) LEN(1)
DCL VAR(&P21) TYPE(*CHAR) LEN(1)
DCL VAR(&P22) TYPE(*CHAR) LEN(1)
DCL VAR(&P23) TYPE(*CHAR) LEN(1)
DCL VAR(&P24) TYPE(*CHAR) LEN(1)
DCL VAR(&P25) TYPE(*CHAR) LEN(1)
DCL VAR(&P26) TYPE(*CHAR) LEN(1)
DCL VAR(&P27) TYPE(*CHAR) LEN(1)
DCL VAR(&P28) TYPE(*CHAR) LEN(1)
DCL VAR(&P29) TYPE(*CHAR) LEN(1)
DCL VAR(&P30) TYPE(*CHAR) LEN(1)
DCL VAR(&P31) TYPE(*CHAR) LEN(1)
DCL VAR(&P32) TYPE(*CHAR) LEN(1)
DCL VAR(&P33) TYPE(*CHAR) LEN(1)
DCL VAR(&P34) TYPE(*CHAR) LEN(1)
DCL VAR(&P35) TYPE(*CHAR) LEN(1)
DCL VAR(&P36) TYPE(*CHAR) LEN(1)
DCL VAR(&P37) TYPE(*CHAR) LEN(1)
DCL VAR(&P38) TYPE(*CHAR) LEN(1)
DCL VAR(&P39) TYPE(*CHAR) LEN(1)
DCL VAR(&OUTQ) TYPE(*CHAR) LEN(10)
DCL VAR(&SPLUSR) TYPE(*CHAR) LEN(10)
DCL VAR(&USER) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
RTVJOBA JOB(&JOBNAME) USER(&USER) NBR(&JOBNBR)
CHGVAR &OUTQ %SST(&P8 1 10)
IF (%SST(&P3 1 1) *EQ '*') DO
CHGVAR &SPLUSR &USER
CHGVAR %SST(&P3 1 10) &JOBNAME
CHGVAR %SST(&P3 11 10) &USER
CHGVAR %SST(&P3 21 6) &JOBNBR
ENDDO
ELSE +
CHGVAR &SPLUSR %SST(&P3 11 10)
/* Check here your criteria. */
/* (f.e. Userprofile ... */
/* If a user is authorized based on your criteria, then */
/* RETURN. */
/* If he is not authorized then goto NOT_OK. */
/* In that case an escape message is send. */
/* USER QSECOFR, QSYSOPR UNLIMIT ACCESS SPOOLED FILE */
IF ((&USER *EQ 'QSECOFR') *OR +
(&USER *EQ 'QSYSOPR')) +
THEN(GOTO OK)
/* LIMIT ONLY SPOOLED CREATION USER CAN BROWSE OWN'S SPOOLED FILE */
IF COND(&USER *NE &SPLUSR) +
THEN(GOTO NOT_OK)
/* LIMIT OUTQ FOR SPECIFIED USER */
IF COND(&USER *EQ 'JOE' *AND &P8 *EQ 'MYOUTQ') +
THEN(GOTO NOT_OK)
OK:
RETURN
NOT_OK: SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) +
MSGDTA('0000' *CAT 'You are not +
authorized to output queue MYOUTQ') +
MSGTYPE(*DIAG)
SNDPGMMSG MSGID( CPF0002 ) +
MSGF( QSYS/QCPFMSG ) +
MSGTYPE( *ESCAPE )
END: ENDPGM
CPYSPLF 命令語法檢核程式 for V5R2
因為 CHGSPLFA 命令於 OS V5R2 中的參數個數增加至 42 個,而 CLP 的 PARM 參數僅能
接收 40 個參數,所以我改用 RPGLE 來撰寫命令語法檢核程式。
File : QRPGLESRC
Member: CHGSPLFAVR
Type : RPGLE
OS version: V5R2 以後
Usage : CRTBNDRPG mylib/CHGSPLFAVR
CHGCMD CMD(CHGSPLFA) VLDCKR(mylib/CHGSPLFAVR)
若執行有問題或不使用命令語法檢核程式時,執行
CHGCMD CMD(CHGSPLFA) VLDCKR(*NONE)
****************************************************************************************
* CHGSPLFA VCP for iSeries V5R2
*
/* * Validity Checking program for command CHGSPLFA
/*
/* * Example : protecting an SPOOL From a USER
/* *
/* * CHGCMD CMD(CHGSPLFA) VLDCKR(MYLIB/CHGSPLFAVR)
/* * To reset (in case you made errors) :
/* * CHGCMD CMD(CHGSPLFA) VLDCKR(*NONE)
****************************************************************************************
****************************************************************************************
* D E F I N I T I O N S P E C I F I C A T I O N *
****************************************************************
*
* Program Status Data Structure
*
D PGMDS SDS
D Pgmq## *PROC
D ErrorSts *STATUS
D PrvStatus 16 20S 0
D SrcLinNum 21 28
D Routine *ROUTINE
D NumParms *PARMS
D ExcpType 40 42
D ExcpNum 43 46
*
D PgmLib 81 90
D ExcpData 91 170
D ExcpId 171 174
D LastFile 201 208
D FileErr 209 243
D JobName 244 253
D User 254 263
D JobNumA 264 269
D JobNum 264 269S 0
D JobDate 270 275S 0
D RunDate 276 281S 0
D RunTime 282 287S 0
D PgmCrtDt 288 293
D PgmCrtTm 294 299
D CmplrLvl 300 303
D SrcFile 304 313
D SrcLib 314 323
D SrcMbr 324 333
D ProcPgm 334 343
D ProcMod 344 353
D cmd_str S 1024 INZ
D cmd_len S 15P 5 INZ(1024)
D msg_str S 256
D vApiErrDs ds
D vbytpv 10i 0 inz(%size(vApiErrDs)) bytes provided
D vbytav 10i 0 inz(0) bytes returned
D vmsgid 7a error msgid
D vresvd 1a reserved
D vrpldta 50a replacement data
D qmhsndpm PR ExtPgm('QMHSNDPM') SEND MESSAGES
D 7 const ID
D 20 const FILE
D 73 const TEXT
D 10i 0 const LENGTH
D 10 const TYPE
D 10 const QUEUE
D 10i 0 const STACK ENTRY
D 4 const KEY
Db like(vApiErrDS)
* QCMDEXC - Prototyped Call
D qcmdexc PR EXTPGM('QCMDEXC')
D cmd_str 1024 OPTIONS(*VARSIZE) CONST
D cmd_len 15P 5 CONST
C *entry Plist
C Parm P1 1
C Parm P2 10 File
C Parm P3 26 Job
C Parm P4 4 Splnbr
C Parm P5 8 Sysname
C Parm P6 6
C Parm P7 44
C Parm P8 10 Device
C Parm P9 1
C Parm P10 20
C Parm P11 1
C Parm P12 1
C Parm P13 1
C Parm P14 1
C Parm P15 1
C Parm P16 1
C Parm P17 1 Outq
C Parm P18 1
C Parm P19 1
C Parm P21 1
C Parm P22 1
C Parm P23 1
C Parm P24 1
C Parm P25 1
C Parm P26 1
C Parm P27 1
C Parm P28 1
C Parm P29 1
C Parm P30 1
C Parm P31 1
C Parm P32 1
C Parm P33 1
C Parm P34 1
C Parm P35 1
C Parm P36 1
C Parm P37 1
C Parm P38 1
C Parm P39 1
C Parm P40 1
C Parm P41 1
C Parm P42 1
C
C If %Subst(P3:1:1) = '*'
C Eval %Subst(P3: 1:10)= JobName
C Eval %Subst(P3:11:10)= User
C Eval %Subst(P3:21: 6)= JobNumA
C EndIf
* Exclude highest authority user
C If User <> 'QSECOFR' and
C User <> 'QSYSOPR'
* Limit user can chgsplfa on their own spooled
C If %Subst(P3:11:10)<> User
C Eval msg_str =
C '0000 You are not authorized to ' +
C 'spooled file ' + P2
* Send diag message
C callp QMHSNDPM(
C 'CPD0006':'QCPFMSG *LIBL ':
C msg_str:
C 256:'*DIAG ':'*CTLBDY ': 1:' ':
C vApiErrDS)
C
* Send Excape message
C callp QMHSNDPM(
C 'CPF0002':'QCPFMSG *LIBL ':
C ' ' :
C 0 :'*ESCAPE':'*CTLBDY ': 1:' ':
C vApiErrDS)
C EndIf
C EndIf
C
C Eval *InLr = *On
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期一, 11月 06, 2023
2003-01-06 報表安全系列五:如何限制指令 CHGSPLFA 的使用, 防止使用者更改其他人報表的屬性?
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言