星期一, 11月 06, 2023

2003-01-06 報表安全系列五:如何限制指令 CHGSPLFA 的使用, 防止使用者更改其他人報表的屬性?


報表安全系列五:如何限制指令 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





沒有留言: