Il peut être pénalisant pour certaines activités, de se retouver avec des profils désactivés, la tentation est alors forte de mettre en place un rendu automatique. Pourquoi pas, mais attention il va falloir fixer 2 règles :

– d’abord la liste des profils qu’on ne peut pas réactiver, QSECOFR et vos profils d’administrateur, par exemple

– ensuite le nombre de fois que l’on pourra tenter de se connecter, souvent 3 en effet une personne qui s’est trompée 9 (si vous avez 3 dans QMAXSIGN) fois on peut considérer que au mieux l’individu n’arrivera pas se connecter, au pire que c’est une attaque délibérée.

La technologie dans notre exemple se base sur un WATCHERS qui analyse la file de message QSYSOPR. dans l’ordre :

– Vous créez un fichier pour les utilisateurs à ne pas réactiver

CREATE TABLE BLACKLISTE (

BLKUSR CHAR(10) CCSID 1147 DEFAULT NULL ,

BLKDAT DATE NOT NULL WITH DEFAULT,

BLKTIM TIME NOT NULL WITH DEFAULT )

– Vous créez un fichier historique des réactivations de profil

CREATE OR REPLACE TABLE HSTLISTE (

HSTUSR CHAR(10) CCSID 1147 DEFAULT NULL ,

HSTAPP CHAR(10) CCSID 1147 DEFAULT NULL ,

HSTIP CHAR(30) CCSID 1147 DEFAULT NULL ,

HSTDAT DATE NOT NULL WITH DEFAULT,

HSTTIM TIME NOT NULL WITH DEFAULT )

– Il vous faut ensuite écrire le programme associé au WATCHER

PGM PARM(&WCHOPTION &SESSIONID &ERROR &EVTDATA) /—————————————————————–/

/* Ce programme est un watch il traite les profils désactivé dans */

/* la log système */ /* lancer par un STRWCH */ /*—————————————————————–*/

/* Paramètres reçus */

DCL VAR(&WCHOPTION) TYPE(CHAR) LEN(10)

DCL VAR(&SESSIONID) TYPE(CHAR) LEN(10)

DCL VAR(&ERROR) TYPE(CHAR) LEN(10)

DCL VAR(&EVTDATA) TYPE(CHAR) LEN(1024)

/* Variables de travail */

DCL VAR(&MSG) TYPE(CHAR) LEN(173)

DCL VAR(&rep) TYPE(CHAR) LEN(1)

DCL VAR(&sujet) TYPE(CHAR) LEN(132)

DCL VAR(&reponse) TYPE(CHAR) LEN(1)

DCL VAR(&sysname) TYPE(CHAR) LEN(8)

DCL VAR(&user ) TYPE(CHAR) LEN(10)

DCL VAR(&app ) TYPE(CHAR) LEN(10)

DCL VAR(&ip ) TYPE(CHAR) LEN(30)

DCL VAR(&act ) TYPE(CHAR) LEN(1)

DCL VAR(&dev ) TYPE(CHAR) LEN(10)

DCL VAR(&nbr ) TYPE(dec ) LEN(10)

DCL VAR(&lib ) TYPE(*char) LEN(10) VALUE(‘votrebib’)

dcl ¬e *char 500

dcl &status *char 10

dcl &date *char 6

dcl &time *char 6

dcl &wmsgdta *char 100

dcl &send char 80

DCL VAR(&RQSVAR) TYPE(CHAR) LEN(14)

DCL VAR(&RQSLEN) TYPE(INT) VALUE(14)

DCL VAR(&JOB) TYPE(CHAR) STG(DEFINED) LEN(10) DEFVAR(&SEND)

/* Découpage de EVTDATA */

DCL VAR(&wMSGID) TYPE(CHAR) STG(DEFINED) LEN(7) DEFVAR(&EVTDATA 5)

DCL VAR(&wMSGQ) TYPE(CHAR) STG(DEFINED) LEN(10) DEFVAR(&EVTDATA 13)

DCL VAR(&wMSGQLIB) TYPE(CHAR) STG(DEFINED) LEN(10) DEFVAR(&EVTDATA 23)

DCL VAR(&wMSGKEY) TYPE(CHAR) STG(*DEFINED) LEN(4) DEFVAR(&EVTDATA 387)

dcl &cpt *int

ADDLIBLE &lib

monmsg cpf0000

RCVMSG MSGQ(&WMSGQLIB/&WMSGQ) MSGKEY(&WMSGKEY) +

RMV(NO) MSG(&MSG) MSGDTA(&WMSGDTA) +

MSGID(&WMSGID) SENDER(&SEND)

/* extraction des infos */

chgvar &user (%sst(&wmsgdta 11 10))

chgvar &dev (%sst(&wmsgdta 21 10))

chgvar &ip (%sst(&wmsgdta 31 30))

/*—————————————————————–*/

/* Contrôle si profil dans la black liste*/ /*——————————————————————*/

RUNSQL SQL(‘drop table QTEMP/wback’) COMMIT(NONE) MONMSG MSGID(SQL9010)

RUNSQL SQL(‘create table QTEMP/wback as ( SELECT * +

FROM BLACKLISTE WHERE BLKUSR =  »’ *TCAT +

&USER *TCAT  »’ ) with data ‘) COMMIT(NONE)

monmsg (sql0000 SQ20000 SQ30000) exec(do)

enddo

RTVMBRD FILE(QTEMP/WBACK) NBRCURRCD(&NBR)

if cond(&nbr > 0) then(do)

SNDUSRMSG MSG(‘Profil non réactivable’) MSGTYPE(INFO)

return

enddo

/*——————————————————————*/

/* Contrôle si nombre de fois atteint / /*——————————————————————*/

RUNSQL SQL(‘drop table QTEMP/wliste’) COMMIT(NONE)

MONMSG MSGID(SQL9010)

RUNSQL SQL(‘create table QTEMP/wliste as ( SELECT * +

FROM HSTLISTE WHERE HSTUSR =  »’ *TCAT +

&USER *TCAT  »’ ) with data ‘) COMMIT(NONE)

monmsg (sql0000 SQ20000 SQ30000) exec(do)

enddo

RTVMBRD FILE(QTEMP/WLISTE) NBRCURRCD(&NBR)

if cond(&nbr > 3) then(do)

SNDUSRMSG MSG(‘Nombre max de tentatives atteintes’) +

MSGTYPE(INFO)

return

enddo

/*——————————————————————*/

/* Réactivation et écriture */

/*——————————————————————*/

ELSE CMD(DO)

/* si profil*/

if cond(&WMSGID = ‘CPF1393’) then(do)

CHGVAR VAR(&APP) VALUE(‘USRPRF’)

CHGUSRPRF USRPRF(&USER) STATUS(ENABLED)

rtvsysval QMAXSGNACN &act

/* si désactivation unité */

if cond(&act = ‘3’) then(do)

VRYCFG CFGOBJ(&DEV) CFGTYPE(DEV) STATUS(ON)

monmsg cpf0000

enddo

enddo 

/* si netserver */

if cond(&WMSGID = ‘CPIB682’) then(do)

CHGVAR VAR(&APP) VALUE(‘NETSERVER’)

CHGVAR VAR(&RQSVAR) VALUE(‘ ‘ CAT &USER)

CHGVAR VAR(%BINARY(&RQSVAR 1 4)) VALUE(&RQSLEN)

CALL QSYS/QZLSCHSI PARM(&RQSVAR &RQSLEN ZLSS0200 X’00000000’)

enddo

enddo

/*——————————————————————*/

/* Ecriture dans l’Historique */

/*——————————————————————*/

RUNSQL SQL(‘INSERT INTO HSTLISTE VALUES( »’ *TCAT +

&USER *TCAT  »’,  »’ *TCAT &APP *TCAT +

 »’,  »’ *TCAT &IP TCAT  »’, current +

date, current time)’) COMMIT(NONE)

/* */

ENDPGM

Remarque :

Ce programme réactive également les utilisateurs NETSERVER, les unités –si vous les désactivez– et il enregistre également les adresses IP qui en cas de problème peuvent vous donner une précieuse indication.

Vous aurez intérêt à remplacer les messages de refus par des mails.

Le programme doit être compilé en adoption de droits par rapport à QSECOFR ou équivalent.

Renseigner les profils à ne pas réactiver exemple pour qsecofr :

INSERT INTO GMONITOR/BLACKLISTE VALUES(‘QSECOFR’, current date, current time).

Voila, vous pouvez démarrer

STRWCH SSNID(nom du watch)

WCHPGM(votre bib/votre programme) +

CALLWCHPGM(*WCHEVT) WCHMSG((CPF1393)

(CPIB682)) WCHMSGQ((QSYS/QSYSOPR))

Vous pouvez arrêter

ENDWCH SSNID(nom du watch)

ENDWCH SSNID(ANAWCH1).

N’oubliez pas de regarder dans le fichier hstliste pour effacer si vous êtes arrivé au nombre max par exemple :

historique

SELECT * FROM HSTLISTE ORDER BY HSTDAT desc, HSTTIM desc

Ou les profils qui vont atteindre le nombre max de rendus

SELECT count(*) , hstusr FROM gmonitor/HSTLISTE GROUP BY hstusr HAVING count(*) >= 2