顯示具有 SystemValue 標籤的文章。 顯示所有文章
顯示具有 SystemValue 標籤的文章。 顯示所有文章

星期三, 11月 08, 2023

2008-10-20 如何記錄 Command CHGSYSVAL 的使用?


如何記錄 Command CHGSYSVAL 的使用?

原則上系統已經提供稽核日誌 (Audit journal)方式記錄任何更改系統值的行為。但那是要啟動稽核功能才有效,
況且啟動稽核功能也會對系統效能有些許影響。那要如何在不啟動稽核功能下,記錄Command CHGSYSVAL 的使用。

當使用 CHGSYSVAL 更改任何系統值,系統會寫一筆 MSGID CPF1806 訊系至 QHST History log,但是卻未寫入 QSYSOPR,
這使得要找是誰更改了系統值,都必須使用 DSPLOG MSGID(CPF1806)查詢,所以要如何將使用 CHGSYSVAL 的紀錄寫入 
QSYSOPR中?使用 Command Exit Point QIBM_QCA_CHG_COMMAND 指定程式記錄指令 CHGSYSVAL 的使用。
下述範例會將 CHGSYSVAL 指令執行字串送至 QSYSOPR。


File  : QCLSRC
Member: CHGCMDEXIT
Type  : CLP
Usage : CRTCLPGM PGM(your-lib/CHGCMDEXIT)
        ADDEXITPGM EXITPNT(QIBM_QCA_CHG_COMMAND) FORMAT(CHGC0100)   
                   PGMNBR(*LOW) PGM(your-library/CHGCMDEXIT)        
                   PGMDTA(*JOB 20 'CHGSYSVAL QSYS      ')           
        使用 CHGSYSVAL 更改系統值,DSPMSG QSYSOPR 會看到類似下述 Change system value 訊息:
        *** Change system value : 732619/VENGOAL/QPADEV001T CHGSYSVAL SYSVAL(QPFRADJ) VALUE('1'). 
        
        若欲移除設定執行:
        WRKREGINF
        
                              Work with Registration Information                       
                                                                               
Type options, press Enter.                                                     
  5=Display exit point   8=Work with exit programs                             
                                                                               
                           Exit                                                
     Exit                  Point                                               
Opt  Point                 Format    Registered  Text                          
 8   QIBM_QCA_CHG_COMMAND  CHGC0100     *YES     Change command exit programs  
     QIBM_QCA_RTV_COMMAND  RTVC0100     *YES     Retrieve command exit program 
     QIBM_QDB_OPEN         DBOP0100     *YES     Open Database File Exit Progr 
     QIBM_QHQ_DTAQ         DTAQ0100     *YES     Original Data Queue Server    
     QIBM_QIMG_TRANSFORMS  XFRM0100     *YES                                   
     QIBM_QJO_DLT_JRNRCV   DRCV0100     *YES     Delete Journal Receiver       
     QIBM_QLZP_LICENSE     LICM0100     *YES     Original License Mgmt Server  
     QIBM_QMF_MESSAGE      MESS0100     *YES     Original Message Server       
     QIBM_QMH_REPLY_INQ    RPYI0100     *YES     Handle reply to inquiry messa 
     QIBM_QNPS_ENTRY       ENTR0100     *YES     Network Print Server - entry  
     QIBM_QNPS_SPLF        SPLF0100     *YES     Network Print Server - spool  
                                                                       More... 
Command                                                                        
===>                                                                           
F3=Exit   F4=Prompt   F9=Retrieve   F12=Cancel                                 

                           Work with Exit Programs                             
                                                                               
Exit point:   QIBM_QCA_CHG_COMMAND     Format:   CHGC0100                      
                                                                               
Type options, press Enter.                                                     
  1=Add   4=Remove   5=Display   10=Replace                                    
                                                                               
              Exit                                                             
            Program     Exit                                                   
Opt          Number     Program        Library                                 
                                                                               
4                 1     CHGCMDEXIT     EXITPGM                                 
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                        Bottom 
Command                                                                        
===>                                                                           
F3=Exit   F4=Prompt   F5=Refresh   F9=Retrieve   F12=Cancel                    


或執行        RMVEXITPGM EXITPNT(QIBM_QCA_CHG_COMMAND) FORMAT(CHGC0100) PGMNBR(1)                       

/******************************************************************/
/*  Use the following CL command to create the CHGCMDEXIT pgm     */
/*  in a library of your choice.                                  */
/*                                                                */
/*    CRTCLPGM PGM(your-library/CHGCMDEXIT)                       */
/*             SRCFILE(your-library/source-file)                  */
/*                                                                */
/*  Use the following CL command to cause the CHGCMDEXIT pgm      */
/*  to be called each time anyone uses the CRTRPGPGM CL command.  */
/*                                                                */
/*    ADDEXITPGM EXITPNT(QIBM_QCA_CHG_COMMAND) FORMAT(CHGC0100)   */
/*               PGMNBR(*LOW) PGM(your-library/CHGCMDEXIT)        */
/*               PGMDTA(*JOB 20 'CHGSYSVAL QSYS      ')           */
/*                                                                */
/******************************************************************/
             PGM        PARM(&EXITINFO &RPLCMD &RPLLEN)
             DCL        &EXITINFO *CHAR 4000
             DCL        &RPLCMD   *CHAR 3950
             DCL        &RPLLEN   *CHAR 4
             DCL        &ALWCHG  *CHAR 1 /* change allowed ? */
             DCL        &OFFSET  *DEC (6 0) /* offset to command */
             DCL        &CMDLEN  *DEC (6 0) /* length of command */
             DCL        &CHGSYSVAL *CHAR 9 'CHGSYSVAL'
             DCL        &MSGTXT    *CHAR 256
             DCL        &JOB       *CHAR 10
             DCL        &JOBUSR    *CHAR 10
             DCL        &JOBNBR    *CHAR  6

             CHGVAR     VAR(%BIN(&RPLLEN)) VALUE(0) /* set return +
                          parameter to indicate the command has +
                          not been changed yet */

      /*  Extract values from the input parameter structure.     */
             CHGVAR     VAR(&ALWCHG) VALUE(%SST(&EXITINFO 49 1)) +
                          /* get command is allowed to be +
                          changed indicator */
             CHGVAR     VAR(&OFFSET) VALUE(%BIN(&EXITINFO 53 4)) +
                          /* get offset to command string */
             CHGVAR     VAR(&OFFSET) VALUE(&OFFSET + 1) /* add +
                          1 because CL offset start at 1 +
                          instead of 0 */
             CHGVAR     VAR(&CMDLEN) VALUE(%BIN(&EXITINFO 57 4)) +
                          /* get length of command string */

             IF         COND(&CMDLEN > 3930) THEN(RETURN) /* exit +
                          if the command is too big to fit in +
                          the return variable */

             CHGVAR     VAR(&RPLCMD) VALUE(%SST(&EXITINFO &OFFSET +
                          &CMDLEN)) /* copy input command to +
                          output parameter */

             IF         (&CMDLEN > 9 *AND  +
                         %SST(&RPLCMD 1 9) *EQ &CHGSYSVAL) DO
             RTVJOBA    JOB(&JOB) USER(&JOBUSR) NBR(&JOBNBR)
                         CHGVAR &MSGTXT +
                               ('*** Change system value :' *BCAT +
          &JOBNBR *CAT '/' *CAT &JOBUSR *TCAT '/' *CAT &JOB *BCAT +
                                 %SST(&RPLCMD 1 &CMDLEN))
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(&MSGTXT) +
                          TOUSR(*SYSOPR)
             ENDDO



             ENDPGM




星期四, 11月 02, 2023

2002-09-19 iSeries(AS/400) 的安全控管稽核重點


iSeries(AS/400) 的安全控管稽核重點


	


iSeries(AS/400) 的安全控管稽核重點
Contributed 05/18/2002 By Vengoal Chang

目標

AS/400 的安全控管稽核重點主要提供 AS/400 使用者關於 AS/400 安全控管的
主要項目資訊及控管後所產生影響結果。安全控管方式的選擇及導入應該配合公司的安全政策,
有效執行而不會被中斷,並且容易管理。

安全控管的層次及控管方式的選擇及導入均應視所在位置的處理環境(例如:網路連結方式,使
用者的數目及他們的需求,應用程式的設計方式,資訊部門人員編制大小等)

小型處理環境 - 結合安全控管的層次 30 或 40 的日誌(log),選項畫面安全設定(Menu Security)
                 ,系統及使用者設定檔的設定能夠控制使用者去執行某些批次作業或特殊的 AS/400
                  指令或工具。由於資訊部門的人員編制小,所以資訊部門人員一般擁有存取 AS/400
                  資源的所有權限,故安全控管方式需以使用者控制及系統稽核日誌追蹤加以強化補充。

中型極大行處理環境 - 結合安全控管的層次 30 或 40 的日誌(log),選項畫面安全設定
                        (Menu Security),資源安全設定(Resource Seurity),系統及使用者設定檔
                        的設定,能夠有效的導入系統及資料安全。在如此的環境中,資訊人員存取系
                        統及資料都應該被評估及被授權至該資訊人員所應知道的基礎上,亦即限制某
                        些人依安全控管方式,取得被授權的系統資源及資料。

適當的規劃及導入一個有效且對使用者親切的安全環境是很重要的關鍵。

IBM 所提供的 AS/400 操作系統包含許多安全控管特性,用來防止未經授權的人進入系統及存取未經授權
的資訊,AS/400 所提供的安全控管特性說明如下:

 "AS/400 所提供安全控管特性能減少使用者無意間更改或刪除資源的機會,你的安全控管要有效
       ,那你的資源控管就要結合實體安全及權責分明的界線。如果沒有使用這些控管,那你的系統就有
        可能暴露,且未經授權的人有可能存取你的系統。"

使用者能依照系統所在環境(硬體及軟體,機房,電力等)及所需的控管範圍啟動及更改安全設定。IBM 
所提供主要 AS/400 的安全控管特性用來確保系統及資訊安全表列如下。

AS/400 安全控管特性可分成幾組簡單描述如下:

 相關安全控管的系統值

 使用者設定檔的安全設定

 控制存取的工具

 實體及硬體的控制

IBM 出售 AS/400 時,系統預設的的安全層級一般設定在安全層級 30。

所必須考慮的安全控管特性:

相關安全控管的系統值

AS/400 提供許多相關安全控管的系統值,允許使用者規劃及設定符合他自己環境所需的安全控管方式。
在 AS/400 上,這些廣義的系統值用於控制進入系統、密碼、區域及網路的作業。

相關安全控管的系統值又可分成:

 進入系統(Sign-On)
 密碼(Password)
 區域及網路(Local and Network)

一般 AS/400 安全控管特性,可藉由系統層次的廣義系統值或導入依個人層次的使用者設定檔參數選項來建立。

A.  進入系統的安全控管系統值

1.  QSECURITY (Security Level)

AS/400 提供廣義的安全系統值稱為"QSECURITY",此系統值啟動系統所需安全控管層次。在AS/400 
上有四種安全控管層次可供使用,系統一次只能選擇一個安全控管層次,五種安全控管層次如下:

- 安全控管層次 10 -
 在此安全控管層次任何人不用正確的使用者代碼及密碼均能進入系統及存取所有系統資源,
        能讀取、更改、刪除系統上所有的物件。

所需考慮採取的安全控管方式:

這個安全控管層次應該提升至安全控管層次 30.

- 安全控管層次 20 -
 在這個安全控管層次,使用者需要使用者代碼及密碼才能進入系統,但進入系統後仍然預設
        其權限可以存取或刪除任何物件(例如:所有檔案、資料庫、程式、使用者設定檔等)。

所需考慮採取的安全控管方式:

在這個安全控管層次通常是個過度階段,最少應該盡快採用安全控管層次 30 及適當的稽核層次(QAUDLVL)。

- 安全控管層次 30 -
 在這個安全控管層次,使用者需有系統管理員為其建立一個使用者設定檔及密碼才能進入系
        統存取系統資源,在安全控管層次 30,使用者藉由 "Public" 公共權限存取其他物件,若有
        物件將公共權限排除在外,那使用者就需得到額外授權才能存取該物件。

所需考慮採取的安全控管方式:

這個安全控管層次需加上及適當的稽核層次(QAUDLVL)。


- 安全控管層次 40 -

 在這個安全控管層次,已包含安全控管層次 30 所提供的一切安全控管方式,也包含設定稽核
        層次(QAUDLVL)及啟動稽核日誌,同時也提供作業系統的完整性檢核,限制系統指令等。

所需考慮採取的安全控管方式:

在採用安全控管層次 40 前,應該先採用安全控管層次 30,加上稽核層次(QAUDLVL 設定為 *AUTFAIL 
及 *PGMFAIL),若違反安全控管層次 40 所規範的授權規範,系統就會將授權失敗紀錄(失敗原因代碼為
 "AF")於稽核日誌(QAUDJRN)中,檢視稽核日誌將所有相關違反安全控管層次 40的規則或錯誤,授與應用
軟體、相關資料庫及使用者適當的權限及防止程式授權失敗後,再導入安全控管層次 40,對於有複雜的
非 IBM 系統介面、網路連結或處理公司外部磁帶,建議採用這個安全控管層次。

- 安全控管層次 50 -

 在這個安全控管層次,已包含安全控管層次 40 所提供的一切安全控管方式,並符合美國國防部
        的安全 C2 標準 。由於此層級強化系統層級安全控管,對於系統運作績效有很大的影響,使用前
        請先評估。

2.  QMAXSIGN (Maximum Sign-On Attempts)

這個廣義的安全系統值稱為"QMAXSIGN",系統用來控制使用者所允許進入系統時所發生的錯誤次數(例如密
碼錯誤、使用者代碼輸入錯誤或使用未被授權的工作站),當錯誤次數達到系統值所允許的次數時,系統會
依照另一系統值 QMAXSGNACN 的設定採取對應的處理,並傳送一個訊息至 QSYSOPR 訊息佇列(及如果 
QSYSMSG 存在於 QSYS 中時,也傳送同一個訊息至 QSYSMSG)。

如果於 QSYS 程式館建立 QSYSMSG 訊息佇列,系統會自動將重要的訊息送至 QSYSMSG,以防止重要訊息淹沒
於有大量訊息的 QSYSOPR 訊息佇列中。

為了防止駭客入傾,這個系統值最好設定低且合理的值,一般的容許錯誤次數是 3 到 5。

2.1 QMAXSGNACN (Action When Sign-On Attempts Reached)

這個系統值用於決定當進入系統的錯誤次數達到系統值 QMAXSIGN 所設定的錯誤次數時應採取的處理動作。

應採取的處理動作可分為:
 3:將使用者設定檔及工作站設為失效。
 1:將工作站設為失效。
 2:將使用者設定檔設為失效。

QMAXSGNACN 建議值為 3。


3.  QRMTSIGN (Remote Sign-On Control)

這個廣義的安全系統值稱為"QRMTSIGN",是系統用來控制遠端進入系統的需求,例如從另一 AS/400 系統透
過 Pass-through、Client Access 5250 工作站及 Telnet 來的遠端進入系統的需求。

這個安全系統值"QRMTSIGN"應該設定為 *FRCSIGNON ,讓所有的遠端進入系統需求使用正常的進入系統程序。


4. QAUDCTL
系統值 “QAUDCTL” ,是系統用來決定是否啟動稽核日誌功能。有三類稽核方式可供選擇(可多選):
   *AUDLVL  
          依照 QAUDLVL 稽核層級統值的定義

   *OBJAUD
          經過指令個別指定的物件才會針對該物件啟動稽核功能
             Change Object Auditing (CHGOBJAUD)
             Change DLO Auditing (CHGDLOAUD) 
          經過指令個別指定的使用者才會針對該使用者啟動稽核功能
             Change User Audit (CHGUSRAUD) command

   *NOQTEMP
          Library QTEMP 中的物件不做稽核日誌,因為 QTEMP 中均是暫存物件。

   *NONE – 不啟動稽核日誌功能


4.1  QAUDLVL (Auditing Level)

這個廣義的安全系統值稱為"QAUDLVL"稽核層級,是系統用來控制哪些安全控管的事件需要被紀錄於安全
稽核日誌(QAUDJRN)中。

這個安全系統值 "QAUDLVL" 最少應該設定為 *AUTFAIL(系統紀錄所有授權失敗的事件),*SECUTITY
(紀錄所有更改安全控管系統值的事件)。若再加上 *SAVRST(紀錄 Restored 時所有相關安全的事件)

在選擇 "QAUDLVL" 選項前,要做系統績效及系統資源的評估,因為作紀錄的動作會影響系統運作績效及
硬碟空間的使用。

在使用 "QAUDLVL" 前,系統值 "QAUDCTL" 需包含 "*AUDLVL"。 


5.   QLMTSECOFR (Limit Security Officer)

限制具有 *ALLOBJ 或 *SERVICE 的使用者是否僅能從 System Console 進入系統.

1: 是
但仍能夠使用Grant Object Authority (GRTOBJAUT) 指令授權使用者可以從其他工作站進入系統.

0: 否
防止高權限使用者權限被誤用



5.1  QLMTDEVSSN (Limit Device Sessions)

這個廣義的安全系統值稱為"QLMTDEVSSN",用來控制使用者是否能同時從多台工作站進入系統。
建議值為 '1',限定使用者再任何時間僅能從一台工作站進入系統,除非使用者結束原有的工作站
作業退系統,回到進入系統畫面(SignOn Screen),才能從另外一台工作站進入系統。

限制工作站功能也可以從使用者設定檔中,針對個人設定。

使用這個安全系統值 "QLMTDEVSSN" 可減少多人共用同一個使用者代碼及密碼。但若有一群人共用因
業務需要而共用同一個使用者代碼及密碼,而公司政策又話,那又是另一個議題了。


6.  QINACTITV (Inactive Job Time-Out Interval)

這個廣義的安全系統值稱為"QINACTITV",是系統用來控制允許一台工作站持續沒有任何動作的時間
(例如使用者離開座位),當沒有任何動作的時間達到 "QINACTTITV" 所指定的時間時,依照系統值
 "QINACTMSGQ" 的設定採取對應的處理動作。這個系統值的設定減少未經授權的人存取系統的機會。

設定這個系統值 "QINACTITV" 時,要考慮使用者的作業環境,如製造業現場工單流程,客戶服務中心
等。這個系統值應該設定實際且有效的值,一般的設定為 60 分鐘。

這個系統值只針對 5250 終端工作站、Client Access 5250 終端模擬及 Telnet (V4R3 以後)有效。
Telnet 在 V4R2 以前,需使用 CHGTELNA 指令。
這個系統值並不適用於 FTP Server,使用 CHGFTPA 設定 INACTTIMO 參數。

6.1 QINTACTMSGQ (Inactive Job Time-Out Message Queue)

這個系統值 "QINACTMSGQ" 用以決定當系統值 "QINACTITV" 所設定的時間達到時所應採取的對應動作。
建議值為 *ENDJOB 結束該工作。
若值為 *DSCJOB, 則 QDSCJOBITV 可指定暫時中斷幾分鐘後結束作業。


7.  QAUTOVRT (Automatic Configuration of Virtual Devices)

這個廣義的安全系統值稱為"QAUTOVRT",是系統用來控制 AS/400 是否能自動建立虛擬工作站,以回應
遠端工作站進入系統的需求。

允許你的系統自動建立虛擬工作站,會給駭客更多的入傾機會,例如 QMAXSIGN 進入系統錯誤的次數設
為 3,且 QAUTOVRT 允許建立的虛擬工作站的數目設定為 500,駭客的入傾次數機會高達 1500 次。不
可不慎重。

建議值設定為 0。

8.  QDSPSGNINF (Display Sign-On Information)

這個廣義的安全系統值稱為"QDSPSGNINF",是系統用來決定是否顯示進入系統的相關資訊,例如上次進入
系統的時間,此次進入系統錯誤的次數,幾天後密碼過期(如果密碼到期日小於等於 7 天才會顯示)。

建議值為 "1",讓使用者知道自己的密碼是否快過期。此系統值也可針對個人設定於使用者設定檔中。


B.  相關密碼安全控管的系統值

1.  QPWDEXPITV (Password Expiration Interval)

這個廣義的安全系統值稱為"QPWDEXPITV",是系統用來指定一個密碼的有效期限,當有效期限到期時,
系統會強迫使用者更改密碼。此系統值也可針對個人設定於使用者設定檔中。

建議值一般為 90 天,較重要的使用者為 30 天。


2.  QPWDRQDDIF (Required Difference in Passwords)

這個廣義的安全系統值稱為"QPWDRQDDIF",是系統用來控制密碼是否能與先前幾次使用過的密碼相同。

建議值為 "5",不得與前 10 次密碼相同。


3.  QPWDLMTREP (Restriction of Repeated Characters for Passwords)

這個廣義的安全系統值稱為 "QPWDLMTREP" ,是系統用來限制密碼字元可否重覆,若系統值 "QPWDLVL" 
設為 2 或 3,密碼字元分大小寫是不同的字元,如 a 與 A 是不同的字元。

建議值為 "1",密碼中不得有重複的字元。


4.  QPWDMINLEN (Minimum Length of Passwords)

這個廣義的安全系統值稱為 "QPWDMINLEN",是系統用來控制組成密碼的最小長度,用以忽略較容易猜的密碼。

建議值為 6 到 8。
當系統值 "QPWDLVL" 為 "1" 時,這密碼的長度可藉於 1 到 10 間。
當系統值 "QPWDLVL" 為 "2" 或 "3" 時,這密碼的長度可藉於 1 到 128 間。


C.  網路相關安全控管系統值

1.  PCSACC

AS/400 提供一個 PC Support Access 的網路安全控管的系統值 PCSACC,是系統用來控制 PC 可否
存取哪些系統服務,如 5250 終端連線模擬,檔案下載及上傳等服務。

如果需要 PC Support 的功能,那 "PCSACC" 的網路參數屬性應該設定為 *OBJAUT。設定 *OBJAUT 
這個值接受 PC Support 所有的功能,然而這些服務需求仍需遵循正常的 AS/400 物件權限確認程序。

若要依照個別功能設定權限,可自行撰寫 Exit Program,使用 CHGNETA 指定 PCSACC 的參數為 Exit Program.

V3R1 以後可以使用 *REGFAC 參數選項,WRKREGINF 指定個別功能的 Exit Program.

如果不需要 PC Support 的功能,"PCSACC" 就應設定為 *REJECT,拒絕遠端 PC 所有的服務需求。


2.  DDMACC

AS/400 同時提供另一個網路參數屬性 "DDMACC"(distributed data management 分散式資料管理),
用來控制及確認遠端 AS/400 系統所提出的處理需求。

如果需要分散式資料管理的功能,那 "DDMACC" 的網路參數屬性應該設定為 *OBJAUT。設定 *OBJAUT 
這個值接受所有分散式資料管理的功能,然而這些服務需求仍需遵循正常的 AS/400 物件權限確認程序。
如果不需要分散式資料管理的功能,"DDMACC" 就應設定為 *REJECT,拒絕所有分散式存取服務需求。

若要依照個別功能設定權限,可自行撰寫 Exit Program,使用 CHGNETA 指定 DDMACC 的參數為 Exit Program.

V3R1 以後可以使用 *REGFAC 參數選項,WRKREGINF 指定個別功能的 Exit Program.

使用者設定檔的安全設定 (User Profiles Security)

在 AS/400 上,使用者需要事先授與適當的權限,包含系統層級特殊權限或針對單一物件(例如:
指令、資料庫檔案、工作站印表機設備等)。

使用者設定檔用來定義使用者及他們的權限範圍,且提供許多參數設定,可參照系統值或針對個別
使用者設定。例如:系統值 "QPWDEXPITV" 密碼有效期間,可藉由設定使用者設定檔參數
"Password Expiration Interval" 取代系統值。

使用者設定檔的安全參數屬性需要針對個人作業適當的評估,授與個人作業範圍內應有的權限。

1.  特殊權限 (Special Authorities)

AS/400 為了一般安全控管及系統工作需要而提供使用者特殊權限,共有六種:

*ALLOBJ - 幾乎擁有無限的權限,系統允許使用者定義、更改、刪除及存取所有資源,
          且不受個別物件所指定的權限設定限制,但並沒有新增及更改使用者設定檔的權限,

*SECADM - 允許管理 AS/400 使用者設定檔,這是 AS/400 安全管理員的特殊權限,這授權使用
          者有新增、修改、刪除其他使用者設定檔的權。

*SAVSYS - 允許使用者儲存、回復系統及資料,

*JOBCTL - 授與使用者管理工作(Job)及輸出佇列(Output queue)的權限,如一般工作的暫停、更
          改、釋放及終止,子系統啟動與終止,印表機的啟動與終止,及 IPL(開機)。

*SERVICE - 允許使用者處理服務性工作,例如:Disk 等硬體資源的維護。
 
*SPLCTL - 允許使用者對於所有報表有全部的權限,縱然輸出佇列指定 OPRCTL(*NO) 也無法阻止
          有 *SPLCTL 特殊權限的使用者,檢視非他自己的報表。

2.  IBM 內建的使用者代碼 (IBM-Supplied ID's)

AS/400 為了系統作業需要而內建了一些使用者代碼(如:QSECOFR, QPGMR, QUSER, QSRV, QSRVBAS,
QSYSOPR, QUSER等),應該將這些使用者的密碼設為 *NONE,讓使用者無法以這些使用者代碼進入系統。


3.  使用者的等級 (User Classes)

AS/400 提供 5 種使用者等級建議的特殊權限如下表:
          
特殊權限    使用者等級
       =============================================== 
       *SECOFR *SECADM   *PGMR     *SYSOPR   *USER
=========  ======= ========  ========  ========  ========
*ALLOBJ    Yes     NO        No        No        No
*SECADM    Yes     Yes       No        No        No
*JOBCTL    Yes     Yes       Yes       Yes       No
*SPLCTL    Yes     No        No        Yes       No
*SAVSYS    Yes     Yes       Yes       Yes       No
*SERVICE   Yes     No        No        No        No
*AUDIT     Yes     Yes       No        No        No
*IOSYSCFG  Yes     Yes       No        No        No

- *SECOFR - 最高安全使用者等級(Security Officer class)
            具有最高權限可存取系統所有資源。

- *SECADM - 安全管理員(Security Administration class)

- *PGMR   - 程式員等級(Programmer class)

- *SYSOPR - 系統操作員(System Operator class)

- *USER   - 一般使用者


控制存取系統資源的工具

AS/400 支援多種控制存取系統資源的工具,AS/400 允許結合這些工具以符合個別作業環境的需求,
這些工具可分為以下四類:

菜單式(Menu Security)

物件資源存取(Resource Security)

繼承程式擁有者權限(Program Adoption)

授權表列(Authorization Lists)

1.  菜單式(Menu Security)

菜單式是系統強迫使用者進入系統時,依照事先定義的菜單,限制使用者只能執行菜單上的選項作業
,如果是當的設定菜單權限,使用者是無法突破這個系統控制的環境。
要使用菜單式安全控管方式,可以藉由使用者設定檔的三個參數
初始程式(Initial Program)
初始畫面(Initial Menu)
限制執行指令(Limited Capability)

- 初始程式(Initial Program)
 當使用者進系統時,首先執行初始程式,強迫使用者進入事先定義的應用程式畫面,或執行
        事先定義的程式,或其他某些控制功能。

- 初始畫面(Initial Menu)
 當使用者進系統時,強迫使用者進入指定的菜單選項畫面。

- 限制執行指令(Limited Capability)
 限制執行指令用於限制使用者是否可以藉由命令列執行指令,例如 SIGNOFF,SNDMSG,DSPMSG
        或 DSPLOG 等。

結合使用初始程式及初始畫面可強迫使用者執行指定的程式或其他的菜單作業。如果你想要限制使用者
只能執行初始程式,就也需設定參數 Initial menu 值為 *SIGNOFF,這個值會於使用者退出初始化程式
時,自動將使用者退出系統。

為了限制使用者只能執行菜單上的選項作業,就也需設定參數 Limited Capability 限制執行指令為 *YES。

TCP/IP 應用軟體 FTP  Server(檔案傳輸伺服器)的指令 RCMD 同樣使用者設定檔上參數
Limited Capability 限制執行指令來控管。

事實上,菜單式的安全控管方式是不夠的,還需加上物件資源安全控管,以加強資源的存取控管。


2.  物件資源存取(Resource Security)

物件資源存取 (Resource Security) 藉由個別物件授權給個別使用者或群組的方式,來達到控制使用者
存取物件的權限,或定義一個 public 的公共權限,讓系統上所有使用者都能利用公共權限所授與的權限
來存取該物件。

使用者需要授與適當的物件資源權限(Object Authority)及資料權限(Data Authority)才能順利的存取
物件資源或資料。

關於物件資源權限及資料權限詳細資料請參閱 AS/400 Security Concepts and Planning Guide - Chapter 4。

物件資源存取(Resource Security)可分為二種層次:

"library level" 或 object level  例如:

- 程式館層次(Library Level Resource Security)

 Library 層次主要針對整個 Library 作控管,並不涉及 Library 內的物件及資料權限,當一個
        使用者被授與對某個 Library 有存取的權限,哪這個使用者幾乎就能存取該 Library 所有的物件及資料。

 Library 層次主要架構在 *PUBLIC 公共權限上,藉由 Library 層次的保護,這個受保護的 Library
        可以放置重要敏感性的資料,並限制一般使用者的使用。

- 物件層次(Object Level Resource Security)

 物件層次針對單一物件設定每一個使用者的存取權限,系統管理員或物件擁有者需要維護哪些使用
        者可以存取該物件(例如:新的使用者加入或使用者換職務等),這對系統管理員帶來很大的工作
        負擔,但可藉由群組使用者做適當的授權,便可減輕系統管理員的負擔。


3.  使用程式擁有者權限(Program Adoption)

使用程式擁有者權限(Program Adoption)允許使用者在沒有被授權特殊權限的情況下存取一個物件
(正常可能需要全部權限或某些特殊權限才能存取),當使用程式擁有者權限時,當執行程式時,
執行程式的使用者除了使用本身的權限外,還會自動繼承程式擁有者的所有權限,這提供執行程式
的使用者額外的存取物件權限,但只限於執行該程式時才有額外的存取物件權限,一但程式結束,
系統會將程式擁有者的權限移除。

在產生程式(CRTxxxPGM)時,系統的預設值是 USER(*USER),也就是不採用繼承程式擁有者權限。
若要採用繼承程式擁有者權限就設定為 USER(*OWNER)。

4.  授權表列(Authorization List)

物件資源授權若針對單一物件授權個別使用者權限,是一向沉重的負擔,所以系統提供授權表列的
方式來簡化個別物件的授權,將多個使用者或群組依照個別權限需求,可組成授權表列,再將授權
表列設定於被授權物件的 Authorization list name,授權表列包含所有使用此授權表列的物件及
藉由此授權表列存取物件的所有使用者。

建立授權表列
CRTAUTL AUTL(AUTL1) AUT(*EXCLUDE) TEXT("Sample Authorization List")

將使用者加入授權表列,並設定使用者權限
ADDAUTLE AUTL(AUTL1) USER(xxx) AUT(xxxx)

設定物件使用授權表列權限
GRTOBJAUT OBJ(object) OBJTYPE(type) AUTL(AUTL1)

Authority to the Authorization List
         ┌───────────────────────────────────┐
         │Authorization list name:AUTL1      │
         │Owner:KARENS                       │
         │Public authority:*EXCLUDE          │
         │                                   │
         │User    Authority                  │
         │KARENS  *ALL *AUTLMGT              │
         │TERRY   *USE                       │
         │JUDY    *CHANGE                    │
         │SCOTT   *ALL                       │
         │MARY    *CHANGE *AUTLM             │
         └────────┬──────────────────────────┘
                  │
                  │Objects secured by
                  │authorization list
                  │          ┌───────────────┐
                  │     ┌────│File A         │
                  │     │    └───────────────┘
                  │     │    ┌───────────────┐
                  │     ├────│Program B      │
                  └─────┤    └───────────────┘
                        │    ┌───────────────┐
                        ├────│File C         │
                        │    └───────────────┘
                        │    ┌───────────────┐
                        └────│Library D      │
                             └───────────────┘


實體及硬體的控制(Physical Security and Hardware Controls)

1.  實體的安全管制(Physical Security)

為了保護 AS/400 系統防止遭受損害或未經授權的存取,AS/400 應放在一個安全的機房,
也就是要有適當的安全控管,控制人員的進出,並要有防火,溫控,防水保護等功能。


2.  AS/400 Keylock Switch

某些 AS/400 配有鎖,以防止未經授權的人直接操作 AS/400 主機面板上的功能。

參考書目:
Security Reference Version 5  SC41-5302-05
An Implementation Guide for AS/400 Security and Auditing GG24-4200-00

            



2002-07-19 如何啟動 AS400 作業系統 V5R1 於 Library list 中支援 250 個 Library?


如何啟動 AS400 作業系統 V5R1 於 Library list 中支援 250 個 Library?

AS400 作業系統的 Library list 即是系統搜尋程式或資料庫或其他物件的路徑,類似 PC 
的 PATH,Library list 於V4R5以前只能支援 25 個 Library, V5R1 以後,系統已可以支
援 250 個 Library。

於 V5R1 中,如果 dataarea QUSRSYS/QLILMTLIBL 存在,表示系統只允許 library list 容
納 25 個 Library,若你要啟動系統支援 library list 容納 250 個 library,就需要刪除
dataarea QUSRSYS/QLILMTLIBL 即可啟動。

使用指令判斷 dataarea QUSRSYS/QLILMTLIBL 是否存在:
WRKOBJ OBJ(QUSRSYS/QLILMTLIBL) OBJTYPE(*DTAARA)
畫面如下:
                               Work with Objects                                
                                                                                
 Type options, press Enter.                                                     
   2=Edit authority        3=Copy   4=Delete   5=Display authority   7=Rename   
   8=Display description   13=Change description                                
                                                                                
 Opt  Object      Type      Library     Attribute   Text                        
      QLILMTLIBL  *DTAARA   QUSRSYS                 LIMIT USER LIBRARY LIST TO  
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                         Bottom 
 Parameters for options 5, 7 and 13 or command                                  
 ===>                                                                           
 F3=Exit   F4=Prompt   F5=Refresh   F9=Retrieve   F11=Display names and types   
 F12=Cancel   F16=Repeat position to   F17=Position to                          


若你要回複系統僅支援 25 個時,執行下列指令:

 Selection or command                                                           
 ===> CRTDTAARA DTAARA(QUSRSYS/QLILMTLIBL) TYPE(*CHAR) LEN(2000) VALUE(' ') TEXT
('LIMIT USER LIBRARY LIST TO 25')                                         

為了於 Library list 中使用 250 個 Library,每個使用到 *LIBL 的程式或 API 均要修改,
如 RTVJOBA USRLIBL(&LIBL) 或 CHGLIBL 均要修改能容納 250 個 Library list 的參數如下:

DCL &LIBL *CHAR 2750

若你啟動後,相關程式沒有更改,程式執行時就會當掉。


V5R1 預設是 dataarea QUSRSYS/QLILMTLIBL 存在的,表示系統預設 library list 仍是使用
25 個 library,即當使用者從早期版本升級至 V5R1 時,不必修改有使用到 *LIBL 的程式,
而交由使用者自行決定是否啟動支援 250 個,使用者也需要更改受影響的程式。

但是 V5R2 後系統預設是 250 個,切記! 您就需要更改有使用 RTVJOBA USRLIBL(&LIBL) 或 
CHGLIBL 指令或 某些 library list API 的舊有程式,該程式才能正常運作,否則程式會當掉。



星期三, 11月 01, 2023

2002-01-03 如何查知誰更改了系統值 ?


如何查知誰更改了系統值 ?

當某人更改了系統值,系統會送出一個訊息"System value &1 changed from &2 to &3. "
至 System Log, 所以可以藉由指令 


DSPLOG OUTPUT(*PRINT) MSGID(CPF1805 CPF1806 CPF1815)

DSPSPLF FILE(QPDSPLOG) SPLNBR(*LAST) 

檢視報表即可查知誰於何時改了系統值。



星期三, 10月 04, 2023

Get IFS file stat() epoch to RPG timestamps

 STATPGM.RPGLE

000001160318     /* THE INFORMATION CONTAINED IN THIS DOCUMENT HAS NOT BEEN SUBMITTE D   */
000002160318     /* TO ANY FORMAL TESTS AND IS DISTRIBUTED ON AN 'AS IS' BASIS           */
000003160318     /* WITHOUT ANY WARRANTY EITHER EXPRESSED OR IMPLIED. THE USE OF THI S   */
000004160318     /* INFORMATION OR THE IMPLEMENTATION OF ANY OF THESE TECHNIQUES IS A    */
000005160318     /* CUSTOMER RESPONSIBILITY AND DEPENDS ON THE CUSTOMER'S ABILITY TO     */
000006160318     /* EVALUATE AND INTEGRATE THEM INTO THE CUSTOMER'S OPERATION            */
000007160318     /* ENVIRONMENT. WHILE EACH ITEM MAY HAVE BEEN REVIEWED BY IBM           */
000008160318     /* FOR ACCURACY IN A SPECIFIC SITUATION, THERE IS NO GUARANTEE THAT THE */
000009160318     /* SAME OR SIMILAR RESULTS WILL BE OBTAINED ELSEWHERE. CUSTOMERS        */
000010160318     /* ATTEMPTING TO ADAPT THESE TECHNIQUES TO THEIR ENVIRONMENTS DO SO     */
000011160318     /* AT THEIR OWN RISK.                                                   */
000012160317       // ----------------------------------------------------------------------
000100160317       Ctl-Opt DFTACTGRP(*NO) ACTGRP(*NEW);
000101160317       // *********************************************************************
000102160317       //  File Information Structure (stat)
000103160317       //
000104160317       //  struct stat {
000105160317       //   mode_t         st_mode;       /* File mode                       */
000106160317       //   ino_t          st_ino;        /* File serial number              */
000107160317       //   nlink_t        st_nlink;      /* Number of links                 */
000108160317       //   uid_t          st_uid;        /* User ID of the owner of file    */
000109160317       //   gid_t          st_gid;        /* Group ID of the group of file   */
000110160317       //   off_t          st_size;       /* For regular files, the file
000111160317       //                                  * size in bytes                   */
000112160317       //   time_t         st_atime;      /* Time of last access             */
000113160317       //   time_t         st_mtime;      /* Time of last data modification  */
000114160317       //   time_t         st_ctime;      /* Time of last file status change */
000115160317       //   dev_t          st_dev;        /* ID of device containing file    */
000116160317       //   size_t         st_blksize;    /* Size of a block of the file     */
000117160317       //   unsigned long  st_allocsize;  /* Allocation size of the file     */
000118160317       //   qp0l_objtype_t st_objtype;    /* AS/400 object type              */
000119160317       //   unsigned short st_codepage;   /* Object data codepage            */
000120160317       //   char           st_reserved1[66]; /* Reserved                     */
000121160317       //  };
000122160317       //
000123160317       Dcl-S p_statds        Pointer;
000124160317       Dcl-Ds statds BASED(p_statds);
000125160317         st_mode         Uns(10);
000126160317         st_ino          Uns(10);
000127160317         st_nlink        Uns(5);
000128160317         st_pad          Char(2);
000129160317         st_uid          Uns(10);
000130160317         st_gid          Uns(10);
000131160317         st_size         Int(10);
000132160317         st_atime        Int(10);
000133160317         st_mtime        Int(10);
000134160317         st_ctime        Int(10);
000135160317         st_dev          Uns(10);
000136160317         st_blksize      Uns(10);
000137160317         st_alctize      Uns(10);
000138160317         st_objtype      Char(12);
000139160317         st_codepag      Uns(5);
000140160317         st_resv11       Char(62);
000141160317         st_ino_gen_id   Uns(10);
000142160317       End-Ds;
000143160317
000144160317       // --------------------------------------------------------------------
000145160317       //  Get File Information
000146160317       //
000147160317       //  int stat(const char *path, struct stat *buf)
000148160317       // --------------------------------------------------------------------
000149160317       Dcl-Pr stat Int(10) ExtProc('stat');
000150160317         path            Pointer         value options(*string);
000151160317         buf             Pointer         value;
000152160317       End-Pr;
000153160317
000154160317       Dcl-Pr GetTimeZone Char(5) End-Pr;
000155160317
000156160317       Dcl-Ds timezone;
000157160317         tzDir           Char(1);
000158160317         tzHour          Zoned(2:0);
000159160317         tzFrac          Zoned(2:0);
000160160317       End-Ds;
000161160317
000162160317
000163160317       Dcl-S statsize        Int(10);
000164160317       Dcl-S Msg             Char(50);
000165160317       Dcl-S AccessTime      TimeStamp;
000166160317       Dcl-S ModifyTime      TimeStamp;
000167160317       Dcl-S ChgStsTime      TimeStamp;
000168160317       Dcl-S charTS          Char(26);
000169160317       Dcl-S Epoch           TimeStamp       INZ(z'1970-01-01-00.00.00');
000170160317       // Prototype for QWCRSVAL
000171160317       Dcl-Pr Pgm_QWCRSVAL ExtPgm('QWCRSVAL');
000172160317         peRcvVar        Char(1)         Dim(100);
000173160317         peRVarLen       Int(10);
000174160317         peNumVals       Int(10);
000175160317         peSysValNm      Char(10);
000176160317         dsErrCode       Char(256);
000177160317       End-Pr;
000178160317
000179160317      *inlr = *on;
000180160317
000181160317       statsize = %size(statds);
000182160317       p_statds = %Alloc(statsize);
000183160317
000184160317       If stat('/temp/jt400.jar': p_statds) < 0;
000185160317         Msg = 'stat() failed?  Check errno!';
000186160317       // ...-->                    dsply                   Msg
000187160317     c                   dsply                   Msg
000188160317         Return;
000189160317       EndIf;
000190160317
000191160317       // * times in statds are seconds from the "epoch" (Jan 1, 1970)
000192160317       // *   and are in GMT (Greenwich Mean Time)...
000193160317       // * Hey!  Lets convert them to RPG timestamps!
000194160317       AccessTime = Epoch + %Seconds(st_atime);
000195160317       ModifyTime = Epoch + %Seconds(st_mtime);
000196160317       ChgStsTime = Epoch + %Seconds(st_ctime);
000197160317
000198160317       // * adjust timestamps for timezone:
000199160317       timezone = GetTimeZone;
000200160317       If tzDir = '-';
000201160317         AccessTime -= %Hours(tzHour);
000202160317         ModifyTime -= %Hours(tzHour);
000203160317         ChgStsTime -= %Hours(tzHour);
000204160317       Else;
000205160317         AccessTime += %Hours(tzHour);
000206160317         ModifyTime += %Hours(tzHour);
000207160317         ChgStsTime += %Hours(tzHour);
000208160317       EndIf;
000209160317
000210160317       //  display the relevant times:
000211160317       charTS = %Char(AccessTime);
000212160317       Msg = 'Last Access ' + charTS;
000213160317       // ...-->                    dsply                   Msg
000214160317     c                   dsply                   Msg
000215160317
000216160317       charTS = %Char(ModifyTime);
000217160317       Msg = 'Last Modified ' + charTS;
000218160317       // ...-->                    dsply                   Msg
000219160317     c                   dsply                   Msg
000220160317
000221160317       charTS = %Char(ChgStsTime);
000222160317       Msg = 'Status Changed ' + charTS;
000223160317       // ...-->                    dsply                   Msg
000224160317     c                   dsply                   Msg
000225160317
000226160317       DeAlloc p_statds;
000227160317       *inlr = *on;
000228160317
000229160317
000230160317       // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
000231160317       //   This gets the offset from Universal Coordinated Time (UTC)
000232160317       //     from the system value QUTCOFFSET
000233160317       // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
000234160317       Dcl-Proc GetTimeZone;
000235160317         Dcl-Pi GetTimeZone Char(5) End-Pi;
000236160317         Dcl-S peRcvVar        Char(1)         DIM(100);
000237160317         Dcl-S peRVarLen       Int(10);
000238160317         Dcl-S peNumVals       Int(10);
000239160317         Dcl-S peSysValNm      Char(10);
000240160317         Dcl-S p_Offset        Pointer;
000241160317         Dcl-S wkOffset        Int(10)         BASED(p_Offset);
000242160317         Dcl-S p_SV            Pointer;
000243160317         Dcl-Ds dsSV BASED(p_SV);
000244160317           dsSVSysVal      Char(10);
000245160317           dsSVDtaTyp      Char(1);
000246160317           dsSVDtaSts      Char(1);
000247160317           dsSVDtaLen      Int(10);
000248160317           dsSVData        Char(5);
000249160317         End-Ds;
000250160317         Dcl-Ds dsErrCode;
000251160317           dsBytesPrv      BinDec(9:0)     Pos(1) INZ(256);
000252160317           dsBytesAvl      BinDec(9:0)     Pos(5) INZ(0);
000253160317           dsExcpID        Char(7)         Pos(9);
000254160317           dsReserved      Char(1)         Pos(16);
000255160317           dsExcpData      Char(240)       Pos(17);
000256160317         End-Ds;
000257160317         peRVarLen = 100;
000258160317         peNumVals = 1;
000259160317         peSysValNm = 'QUTCOFFSET';
000260160317         CallP(e) Pgm_QWCRSVAL(peRcvVar : peRVarLen :
000261160317               peNumVals : peSysValNm : dsErrCode);
000262160317         *In99 = %Error;
000263160317         If dsBytesAvl > 0  or  *IN99 = *On;
000264160317           Return *blanks;
000265160317         EndIf;
000266160317         p_Offset = %addr(peRcvVar(5));
000267160317         p_SV = %addr(peRcvVar(wkOffset+1));
000268160317         Return dsSVData;
000269160317       End-Proc;