, Utiliser SNMP pour superviser votre IBM i.

Sur votre partition SNMP agent est disponible et sa mise en œuvre est très simple
(tout du moins en version snmp1) , Si vous décidez de continuer avec cette solution il est recommandé de passer en SNMP3

SNMP (Simple Network Management Protocol) RFC 1157

C’est un protocole simple qui permet de superviser vos éléments réseaux

https://www.commentcamarche.net/contents/537-le-protocole-snmp

Il y a trois éléments à connaitre (oui je sais 4, je ne parlerai pas ici de la communauté)
L’agent c’est celui qui va collecter les informations à mettre à dispo
La MIB (Management Information Base) c’est la description des informations extraites
Un manager de type console de supervision par exemple CENTREON, ou un logiciel de supervision réseau type ,PRTG (Paessler Router Traffic Grapher), c’est celui qui va interpréter les informations reçues et les consolider

Pour faire la mise en oeuvre

Vous devez démarrer snmp sur votre partition , par navigator for i , ou par STRTCPSVR *SNMP

Dans navigator for i

en 5250

Vous devez avoir ensuite un manager , si vous n’en avez pas déjà un disponible (Centreon par exemple)

par exemple check_mk disponible ici https://checkmk.com , l’installation se fait en NEXT, NEXT

Vous devez ensuite paramétrer votre IBM i

Et voila le résultat, vous avez les principales informations comme la taille disque occupée par exemple

Quelques liens

https://www.ibm.com/support/pages/ibm-i-snmp-overview

https://www.ibm.com/support/pages/configuring-snmpv3-ibm-i

, 5 contrôles rapides par SQL

SQL service vous simplifie l’administration au quotidien, voici quelques contrôles que vous pouvez automatiser pour être proactif

1) Les logiciels en erreurs

SELECT PRODUCT_ID , PRODUCT_OPTION, TEXT_DESCRIPTION, LOAD_ERROR, SYMBOLIC_LOAD_STATE, COMPATIBLE, SUPPORTED
FROM QSYS2.SOFTWARE_PRODUCT_INFO
WHERE LOAD_ERROR = ‘YES’
or SYMBOLIC_LOAD_STATE = ‘DAMAGED’
or (COMPATIBLE = ‘NO’ and SUPPORTED = ‘NO’)

Compatible et supported ne sont pas forcément bloquants

2) Les logiciels qui expirent dans un mois

SELECT ‘Expire dans un mois’ AS STAtUS, PRODUCT_ID , PRODUCT_TEXT FROM QSYS2.LICENSE_INFO
WHERE LICENSE_EXPIRATION between (CURRENT DATE + 1 month) and current date
union
SELECT ‘Expiré’ AS STAtUS, PRODUCT_ID , PRODUCT_TEXT FROM QSYS2.LICENSE_INFO
WHERE LICENSE_EXPIRATION < CURRENT DATE ;

3) Les PTFs en erreur

SELECT PTF_PRODUCT_ID, PTF_IDENTIFIER
FROM QSYS2.PTF_INFO A
WHERE PTF_LOADED_STATUS = ‘DAMAGED’

4) Les certificats qui expirent dans 1 mois

Vous devez connaitre le mot de passe de votre magasin
ensuite il vous faudra le passer à votre requete

le choix ici est d’utiliser une variable globale (attention à sécuriser)

CREATE VARIABLE VOTRBIB/PASSWORD_CERTIF VARCHAR(32);
SET VOTRBIB/PASSWORD_CERTIF = ‘votre mot de passe’;

SELECT ‘Expire avant un mois’ as status, CERTIFICATE_LABEL, VALIDITY_END FROM TABLE(QSYS2/CERTIFICATE_INFO(CERTIFICATE_STORE_PASSWORD=> VOTRBIB/PASSWORD_CERTIF))
WHERE VALIDITY_END between (CURRENT DATE + 1 MONTH) and current date
union
SELECT ‘Expiré’ as status, CERTIFICATE_LABEL, VALIDITY_END FROM TABLE(QSYS2/CERTIFICATE_INFO(CERTIFICATE_STORE_PASSWORD=> VOTRBIB/PASSWORD_CERTIF))
WHERE VALIDITY_END < CURRENT DATE ;

5) Les Problèmes en cours


C’est la liste des incidents ouverts par le système sur vos partitions, il n’y a pas encore de vue SQL , vous devez générer la table

cl: DSPPRB OUTPUT(*OUTFILE) OUTFILE(QTEMP/LSTPRB) ;
SELECT PBID, PBSEV, PBSTAT, PBDESC, PBDATO, PBTIMO FROM lstprb

Il existe bien d’autres contrôles que vous pouvez automatiser et que vous pourrez automatiser, les TR apportant de nouvelles informations à chaque fois !

, Téléchargement d’un fichier en HTTP

Vous voulez télécharger sur votre IBMi un fichier à partir du web.

Le premier reflexe est de passer par les HTTPAPI de Scott Klement, (on ne dira jamais assez ce que Scott a apporté à la plateforme) .

Mais aujourd’hui il y a plus simple grâce à l’open source, vous avez des produits qui permettent de faire ca simplement.

par exemple wget permet de faire cette opération :

Une documentation pour avoir les principales options de cet outil

https://doc.ubuntu-fr.org/wget

Vous avez l’adresse de votre page

vous lancer QP2TERM

wget
Si votre site est en HTTPS sauf si vous avez le certificat sur votre machine vous devrez utiliser l’option –no-check-certificate

exemple :

wget https://www.ibm.com/support/pages/node/1116645/ –no-check-certificate

Remarques

Idéal pour récupérer les produits sous licence, par exemple.

Ca ne marche pas avec QSH
Vous devez avoir accès au site avec le port http ou https ouvert, possibilité de mettre un PROXY

Ci joint
un exemple dans un programme CLLE, une commande RCVHTTPFIL pour vous simplifier la vie.

https://github.com/Plberthoin/PLB/tree/master/GTOOLS/CMD

Une vidéo pour télécharger un produit sur notre chaine youtube


https://www.youtube.com/watch?v=kFZ5_eQVZ5s

et puis un lien pour vous aider dans la mise au point d’un shell

https://www.ibm.com/support/pages/how-trace-qshell

, Tracer les connexions REXEC sur votre IBMi

Le REXEC est un protocole qui a été déclassifié pour des questions de sécurité depuis plusieurs années et qui ne devrait plus être utilisés mais il est possible qu’ils soient encore ouvert chez c’est le port 512
Voici une solution pour connaitre qui se connecte en REXEC sur votre prtition IBM

1) Création d’une table pour la log des tentatives de REXEC

CREATE TABLE GTOOLS/CTLREXEC (REXIP CHAR ( 15) NOT NULL WITH
DEFAULT, REXUSR CHAR ( 10) NOT NULL WITH DEFAULT, REXDAT DATE NOT
NULL WITH DEFAULT, REXTIM TIME NOT NULL WITH DEFAULT)

2) Création d’un Programme CLP

//
/* / / Exemple REXEC Server Logon exit program. / / PGM CTLREXEC / / / /*/

TSTLOGCL: PGM PARM(&APPIDIN &USRIN &USRLENIN &AUTIN &AUTLENIN &IPADDRIN &IPLENIN +
&RETCDOUT &USRPRFOUT &PASSWDOUT &CURLIBOUT)

/* Declare input parameters */

DCL VAR(&APPIDIN) TYPE(CHAR) LEN(4)

/* Application identifier */ /* 1 FTP server program */ /* 2 REXEC server program */

DCL VAR(&USRIN) TYPE(CHAR) LEN(999)

/* User ID */

DCL VAR(&USRLENIN) TYPE(CHAR) LEN(4)

/* Length of user ID */

DCL VAR(&AUTIN) TYPE(CHAR) LEN(999)

/* Authentication string */

DCL VAR(&AUTLENIN) TYPE(CHAR) LEN(4)

/* Length of auth. string */

DCL VAR(&IPADDRIN) TYPE(CHAR) LEN(15)

/* Client IP address */

DCL VAR(&IPLENIN) TYPE(CHAR) LEN(4)

/* IP address length */

DCL VAR(&RETCDOUT) TYPE(CHAR) LEN(4)

/* return code (out) / / 1 OK / / 0 KO */

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

/* user profile (out) */

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

/* password (out) */

       DCL        VAR(&CURLIBOUT)  TYPE(*CHAR) LEN(10) /* current library (out)   */

/* Declare local copies of parameters (in format usable by CL) */

DCL VAR(&APPID) TYPE(DEC) LEN(1 0)
DCL VAR(&USRLEN) TYPE(DEC) LEN(5 0)

DCL VAR(&AUTLEN) TYPE(DEC) LEN(5 0)
DCL VAR(&IPLEN) TYPE(*DEC) LEN(5 0)
MONMSG CPF0000 exec(goto fin)
addlible gtools
monmsg CPF2103
CHGJOB LOG(4 0 *SECLVL) LOGCLPGM(YES)

/* Assign input parameters to local copies * /

CHGVAR VAR(&APPID) VALUE(%BINARY(&APPIDIN))

CHGVAR VAR(&USRLEN) VALUE(%BINARY(&USRLENIN))

CHGVAR VAR(&AUTLEN) VALUE(%BINARY(&AUTLENIN))

CHGVAR VAR(&IPLEN) VALUE(%BINARY(&IPLENIN))

/* Renvoyer OK */

CHGVAR VAR(%BINARY(&RETCDOUT)) VALUE(1)

/* Loguer les informations */

         RUNSQL     SQL('INSERT INTO CTLREXEC VALUES(''' *TCAT +  
                    %SST(&IPADDRIN 1 &iplen) *TCAT ''', ''' +   
                    *TCAT %SST(&USRIN 1 &USRLEN) *TCAT ''', +   
                    current date, current time)') COMMIT(*NONE) 
         monmsg sql0000 exec(do)
         sndusrmsg  msg(&IPADDRIN *bcat %sst(&USRIN 1 10)) msgtype(*info)
         enddo
         goto       end

fin:
CHGVAR VAR(%BINARY(&RETCDOUT)) VALUE(1)
END: ENDPGM

3) Compiler le programme en adoption de droit par rapport à QSECOFR

4) Associer au programme d’exit QIBM_QTMX_SVR_LOGON

ENDTCPSVR *REXEC

ADDEXITPGM EXITPNT(QIBM_QTMX_SVR_LOGON) +
FORMAT(TCPL0100) PGMNBR(1) +
PGM(gtools/ctlrexec)

STRTCPSVR *REXEC

5) Pour le suivi

select * from gtools/ctlrexec

REXIP REXUSR REXDAT REXTIM
10.10.10.10 GAIA 2021-03-29 21:39:11
10.2.0.8 PLB 2021-03-29 22:06:36
10.2.0.8 PLB 2021-03-30 06:38:02
10.2.0.8 PLB 2021-03-30 06:40:47
10.2.0.8 QSECOFR 2021-03-30 06:42:40

, 5 actions pour remplacer efficacement SNA

Vous le savez SNA ne sera pas éternel , et il vous faudra trouver des solutions pour le remplacer, ces solutions sont en plus souvent plus performantes

Exemple : en remplaçant les fichiers de /qdls par des fichiers de l’ifs natif !

Il y a plusieurs solutions:

Vous pouvez par exemple analyser vos sources, cette méthode pose 2 problèmes.

  • Vous allez analyser de nombreux sources qui ne sont plus utilisés
  • A contrario , vous n’avez pas forcément tous les sources

Voici une méthode plus efficace et facile à mettre en œuvre, elle est basé sur la traçabilité des commandes !

1) Démarrer le contrôle d’audit

Vous devez démarrer l’audit de journal si ce n’est pas encore le cas
la valeur QAUDCTL doit avoir *OBJAUD

2) Démarrer l’analyse des commandes

Le but est de trouvé les traitements qui utilisent les commandes du monde SNA
et ensuite de mettre une solution de remplacement.

Pour avoir une idée précise, vous devez laisser tourner au moins 15 jours …

PGM
/* démarrer l’analyse sur les commandes SNA * /

CHGOBJAUD OBJ(SNDDST) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(SAVRSTLIB) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(SAVRSTOBJ) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(SAVRST) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(SAVRSTCHG) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(SNDNETF) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(SNDNETMSG) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(SNDNETSPLF) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(CPYTOPCD) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(CPYFRMPCD) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(STRPASTHR) OBJTYPE(*CMD) OBJAUD(*ALL)
CHGOBJAUD OBJ(ADDDIRE) OBJTYPE(*CMD) OBJAUD(*ALL)

CHGOBJAUD OBJ(QY2FTML) OBJTYPE(*PGM) OBJAUD(*ALL)


ENDPGM

3) Analyse des commandes

DSPJRN JRN(QAUDJRN) JRNCDE((T)) ENTTYP(CD)

Si voulez avoir un fichier mieux présenté pour les fichiers type CD

CRTDUPOBJ OBJ(QASYCDJ5)
FROMLIB(QSYS)
OBJTYPE(*FILE) TOLIB(GTOOLS) NEWOBJ(ANALYSE) CST(*NO)
TRG(*NO)

puis

DSPJRN JRN(QAUDJRN)
JRNCDE((T))
ENTTYP(CD)
OUTPUT(*OUTFILE) OUTFILFMT(TYPE5)
OUTFILE(GTOOLS/ANALYSE)
OUTMBR(*FIRST *ADD)

4) Arrêt de l’audit

PGM
/* arrêt de l’analyse sur les commandes SNA */

CHGOBJAUD OBJ(SNDDST) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(SAVRSTLIB) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(SAVRSTOBJ) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(SAVRST) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(SAVRSTCHG) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(SNDNETF) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(SNDNETMSG) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(SNDNETSPLF) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(CPYTOPCD) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(CPYFRMPCD) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(STRPASTHR) OBJTYPE(*CMD) OBJAUD(*NONE)
CHGOBJAUD OBJ(ADDDIRE) OBJTYPE(*CMD) OBJAUD(*NONE)

CHGOBJAUD OBJ(QY2FTML) OBJTYPE(*PGM) OBJAUD(*NONE)
ENDPGM

5) Supprimer les commandes incriminées

Les solutions de remplacement

SNDDST par SNDMSG ou SNDSMTPEMM
SAVRSTLIB en V7R4 par un passage en IP ou solution à base de FTP
SAVRSTOBJ  »
SAVRST  »
SAVRSTCHG  »
SNDNETF par SNDSMTPEMM ou solution à base de FTP
SNDNETMSG par SNDMSG ou SNDSMTPEMM
CPYTOPCD par CPYTOSTMSF ou CPYTOIMPF
CPYFRMPCD par CPYFRMSTMF ou CPYFRMIMPF
STRPASTHR par TELNET
ADDDIRE par ADDSMTPLE pour les envois de mail

CALL QY2FTML par FTP ou SAVRSTOBJ en IP

Et les cas particuliers

Vous n’avez pas les sources, par exemple sur un progiciel de production
Il faudra faire preuve de plus d’imagination
par exemple une commande avec le même nom et des paramètres identiques à la commande d’origine placées avant dans la liste de bibliothèque, et qui remplace l’action souhaitée par une action similaire à déterminer !

80 % des problèmes sont sur le SNDDST

, , , Les traitements asynchrones sur IBMi


Une définition simple, C’est des traitements qui se déclenchent pour traiter des entrées d’une pile et qui ne renvoi de résultats directs au proccess émetteur

Il existe des produits spécifique pour faire ca, sur l’ibmi le plus connu est bien sur mqseries .
Mais il est maintenant possible d’installer des produits open source comme RabbitMQ , etc…

il existe également des solutions natives de la plateforme.

Parmi ces solutions il y a 2 méthodes

Cyclique ( toutes les 30 secondes)
A l’événement qui ne se déclencheront qu’en cas de nécessité (exemple triggers)
On ne présentera ici que les secondes

Les triggers

Ce sont des programmes qu’on va enregistrer au niveau de la base de donnée, ils vont se déclencher sur un update, insert ou delete avant ou après l’action

On peut les déclarer par commande ADDPFTRG ou par l’instruction SQL CREATE TRIGGER, on peut être plus précis sur l’exécution en SQL (Niveau zone modifiée par exemple)

Les DTAQs

Ce sont des files d’attentes que l’on crée par CRTDTAQ , on peut écrire dedans par API (QSNDDTAQ, QRCVDTAQ) ou par SQL QSYS2.SEND_DATA_QUEUE() et QSYS2.RECEIVE_DATA_QUEUE()

Pour la réceptions, on peut indiquer un temps négatif souvent -1, et la traitement se déclenchera quand il y aura un entrée dans la file !

soit dans le programme de traitement
CALL PGM(QRCVDTAQ) PARM(&DTAQNOM &DTAQBIB &DTAQLEN
&DATA &WAIT)
/* &wait = -1 */

Les msgqs en wait

historiquement, souvent utilisé, par exemple pour superviser la msgq qsysopr

dans le programme de traitement qui boucle sur cette instrcuction
RCVMSG … WAIT(*MAX)

Les fichiers à fin retardée

le principe est le suivant, votre programme attendra un enregistrement quand il aura fini de lire les enregistrements trouvés

Avant le programme RPGLE
OVRDBF FILE(VOTREFIC) EOFDLY(99999)

dans le programme RPGLE

dou %eof() ;
….
read VOTREFIC ;

endif ;

Les watchers


Permettent d’analyser en temps réels des messages qui arrive dans les joblog, les historiques de log voir une autre file de message (MSGQ) .
Pour démarrer un watcher, on utilise la commande STRWCH
STRWCH SSNID(ANAWCH) WCHPGM(votre bi/votre programme) +
CALLWCHPGM(WCHEVT) WCHMSG((ALL))
WCHMSGQ((Votre bib/votre msgq))

votre programme recoit 4 paramètres
L’option, la session, l’erreur et la donnée du message

exemple

/* 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)

Les programmes d’exits

C’est des actions système enregistrées que vous pouvez voir par la commande WRKREGINF, et seules les actions définis dans cette liste sont utilisables

Pour ajouter un programme c’est soit la commande addexitpgm ou l’option 8 dans wrkreginf

Le principe , on reçoit un buffer avec les données en cours et on renvoie status pour dire ok ou ko, vous pouvez dire OK systématiquement et traiter ou faire un contrôle d’autorisation applicatif

Exemple sur FTP

PGM PARM (& APPID & OPID & USRPRF & REMOTEIP & REMOTELEN & OPINFO & OPLEN & OK)
DCL & APPID * CHAR 4 /* ID D’APPLICATION, NUM BINAIRE */
DCL & OPID * CHAR 4 /* ID D’OPERATION, NUMERO BINAIRE */
DCL & OPNUM * 4 /* OPERATION ID, UTILISABLE DANS CL */
DCL & USRPRF * CHAR 10 /* PROFIL UTILISATEUR UTILISANT FTP */
DCL & REMOTEIP * CHAR 251 /* ADRESSE IP */
DCL & REMOTELEN * CHAR 4 /* LONGUEUR DU PARAMETRE PRECEDENT */
DCL & OPINFO * CHAR 251 /* INFORMATIONS SPECIFIQUES OP */
DCL & OPLEN * CHAR 4 /* LONGUEUR DU PARAMETRE PRECEDENT */
DCL & OK * CHAR 4 /* SIGNAL DE CONFIRMATION / / seulement utilisateur FTPUSR */
if cond(&USRPRF *ne ‘FTPUSR’) then(do)
chgvar &ok (X’00000001′)
enddo
ENDPGM

pour l’ajouter

ADDEXITPGM EXITPNT(QIBM_QTMF_SVR_LOGON)
FORMAT(TCPL0100) PGMNBR(1) PGM(VOTRELIB/VOTREPGM)

Vous devez arrêter le service FTP pour que cela soit pris en compte
ENDTCPSVR *FTP puis STRTCPSVR

Conclusions

Vous avez plusieurs solutions dans certains cas , et ceratines sont plus à jour

les 4 à utiliser aujourd’hui sont
Les triggers pour la base de données, si possible en SQL
Les watchers pour les événnements de log systémes
Les progammes d’exit pour les actions Système, par exemple pour les connexions ODBC
Les dtaq pour gérer des piles de données applicatives

Tous ces programmes sont appelés souvent, ils doivent être donc optimisés et ils ne doivent pas planter pour éviter de bloquer la file !

, Faire une sauvegarde complète de votre système.

On parle souvent de Sauvegarde 21 à cause de l’option du menu qui servait à le lancer historiquement

Cette sauvegarde nécessite d’être en mode restreint

Voici comment passer dans ce mode sans vous signer sur la console

On peut passer en mode restreint grâce au paramètre BCHTIMLMT de la commande ENDSBS

Pour passer en mode restreint, vous devez indiquer la durée en minutes avant redémarrage !

ENDSBS SBS(ALL) OPTION(IMMED) BCHTIMLMT(240)

Ici au bout de 3 Heures , le système se relancera de lui même en interrompant votre sauvegarde si besoin.

Par contre si votre sauvegarde se termine votre système redémarrera de suite grâce à la commande STRSBS SBSD(QCTL)
Si votre sous système de contrôle est qctl

Pour estimer votre temps de sauvegarde regarder la sauvegarde précédente.
Si vous n’avez pas de référence mettez 480 soit 8 heures lancer votre sauvegarde un weekend ajustez ensuite le temps avec les chiffres constatés, prenez toujours un peu de marge !

Pour la liste des éléments à sauvegarder voir le schéma ci dessous extrait de la documentation IBM

Quelle est la bonne fréquence pour faire une sav21

Si vous pouvez en faire une tous les soirs faites le !

Sinon un fois par mois semble être le minimum , même si vous avez du backup !

Ci joint un exemple à améliorer en ajoutant des contrôles d’erreur par exemple !

PGM parm(&dev &time)
dcl &dev *char 10
dcl &time *char 3
/**/
dcl &timn *dec 3
ENDHOSTSVR *ALL
ENDTCPSVR *ALL
DLYJOB DLY(300)
ENDTCP
ENDSBS SBS(ALL) OPTION(IMMED) BCHTIMLMT(&timn)
DLYJOB DLY(180)
SAVSYS DEV(&DEV) DTACPR(YES) MONMSG MSGID(CPF0000) EXEC(DO) SNDUSRMSG MSG(‘Probléme pendant le SAVSYS’) + MSGTYPE(INFO)
return
enddo
SAVLIB LIB(NONSYS) DEV(&DEV) ACCPTH(YES) +
SPLFDTA(ALL) QDTA(DTAQ) PVTAUT(YES) + DTACPR(YES)
MONMSG MSGID(CPF0000) EXEC(DO)
SNDUSRMSG MSG(‘Probléme pendant le SAVLIB’) +
MSGTYPE(INFO) return enddo SAVDLO DLO(ALL) DEV(&DEV) DTACPR(YES) MONMSG MSGID(CPF0000) EXEC(DO) SNDUSRMSG MSG(‘Probléme pendant le SAVDLO’) + MSGTYPE(INFO)
return
enddo
SAV DEV((‘/QSYS.LIB/’ *TCAT &DEV *TCAT ‘.DEVD’)) +
OBJ((‘/*’) (‘/QSYS.LIB’ *OMIT) (‘/QDLS’ +
OMIT)) UPDHST(YES) DTACPR(YES) MONMSG MSGID(CPF0000) EXEC(DO) SNDUSRMSG MSG(‘Probléme pendant le SAVIFS’) + MSGTYPE(INFO)
return
enddo
STRSBS SBSD(QCTL)
ENPPGM

Remarque :


Votre programme devra être placé dans le sous système QCTL
Si vous utilisez BRMS la procédure diffère un peu , surtout pour la restauration

, 5 Choses (expertes) sur la gestion des mots de passe

1) Crypter le mot de passe

Voici quelques informations complémentaires sur la gestion de vos mots de passe qui sont un peu plus compliquer à mettre en œuvre mais qui peuvent vous évitez des problèmes et vous faciliter la gestion .


Par défaut les mots de passe circulent en clair sur votre réseau et avec TRCCNN sur L’IBMi ou en utilisant un outil réseau par exemple, wireshark vous pouvez voir le mot passe.
La solution est donc de passer en ssl
Voici les étapes à réaliser
Vous devez créer un certificat autosigné en utilisant DCM , puis indiquer les applications qui seront protégées par ce service
Vous devez indiquer sur le client que la connexion se fait en TLS, la première connexion vous demandera d’accepter d’échanger avec le site distant est par la suite tous vos échanges seront cryptés

2) Supprimer les mots de passe


La volonté est de plus pour éviter la prolifération des mots de passe d’aller vers du SSO, ce qui simplifierait la gestion des mots de passe utilisateurs.
Sur l’ibm la solution à mettre en œuvre c’est Kerberos qui s’appuiera sur votre AD Windows, pour en savoir plus regardez ici https://blog.devensys.com/kerberos-principe-de-fonctionnement/
Vous devrez alors gérer un annuaire sur votre IBM i qui s’appelle EIM pour en savoir plus, regardez ici https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzalv/rzalvmst.htm
dans cette annuaire vous aurez toutes les correspondances entre vos logins IBM i et Windows, vous pouvez également utiliser kerberos pour sécuriser vos accès entre partitions Ibm i, FTP par exemple .

3) Mise en d’un programme de validation

Si les régles de controle de mot de passe ne suffisent pas vous pouvez indiquer un programme complémentaire
Si vous êtes en niveau de mot de passe 1 ou 0 valeur systéme QPWDLVL vous pouvez indiquer un programme dans la valeurs système QPWDVLDPGM voici un exemple

PGM (&NEWPWD &OLDPWD &sts &usrprf)
DCLPRCOPT USRPRF(OWNER) / Programme de controle de mot de passe / / Il est déclaré par la valeur système QPWDVLDPGM / / PWDLVL Doit être à Zéro ou à 1 / DCL VAR(&NEWPWD) TYPE(CHAR) LEN(10)
DCL VAR(&OLDPWD) TYPE(*CHAR) LEN(10)
dcl &sts *char 1 /* résultat du controle / / 0 ok / / 1 pas ok / DCL VAR(&USRPRF) TYPE(CHAR) LEN(10)
/* Renvoyer ‘0’ si ok dans tous les cas */
chgvar &sts ‘0’
endpgm

Si le niveau de mot de passe est 2 ou 3 Vous devrez utiliser un programme exit QIBM_QSY_CHK_PASSWRD , ou QIBM_QSY_VLD_PASSWRD vous pouvez ajouter votre programme par WRKREGINF puis option 8

d/INCLUDE QSYSINC/QRPGLESRC,ECHKPWD1
dcl-s old ucs2(128) based(oldPtr) ;
dcl-s new ucs2(128) based(newPtr) ;
dcl-s old2 ucs2(128) based(oldPtr) ;
dcl-s new2 ucs2(128) based(newPtr) ;

dcl-pi *N ;
P_Buffer char(1024) ;
P_status char(1) ;
end-pi ;

ECHQCPI00 = P_Buffer;

oldPtr = %addr( P_Buffer ) + ECHOTOP ;
newPtr = %addr( P_Buffer ) + ECHOTNP ;
old2 = %subst( old : 1 : ECHLOOP * 2 ) ;
new2 = %subst( new : 1 : ECHLONP * 2 ) ;
// Votre contrôle
// si ok on renvoit ‘0’ si Ko on renvoit KO
P_status = ‘0’ ;
*inlr = *on ;

attention les mots de passe sont en UCS2, et le mot de passe old est toujours à *NOPWD

Le programme ne se déclenchera que si les règles de contrôle de mot de passe sont vérifiés avant

Ces programmes devront être compiler en adoption de droit par rapport à qsecofr

4) Mettre en place un rendu de mot de passe automatique


Il peut être important de faciliter le rendu de mot de passe un peut comme sur internet avec le bouton mot de passe oublié.
le principe est le suivant
il faudra avoir un fichier qui comporte à minima l’utilisateur IBMi est le mail pour faire le lien

vous devrez avoir un programme en clle par exemple
/* 1 récupération du mail* /

call pgm(rtvmail &usr &mail )

/* 2 calcul du mot de passe */

chgvar &PWD …….

/* 3 modification du mot de passe * /

CHGUSRPRF USRPRF(&USR ) PASSWORD(&PWD ) + PWDEXP(YES) STATUS(ENABLED)

/*6 envoi du nouveau mot de passe */
CHGVAR VAR(&NOTE) VALUE(‘Votre nouveau mot de passe +
est, ‘ *BCAT &PWD *BCAT ‘, vous devrez le +
changer à la première utilisation’)
SNDSMTPEMM RCP((&MAIL)) SUBJECT(‘Mot de passe perdu’) +
NOTE(&NOTE)

/* 5 log de l’information */
SNDMSG MSG(‘Mot de passe pour l »utilisateur’ *BCAT +
&USR *BCAT ‘réinitialiser par’ *BCAT +
&USRE) TOMSGQ(*HSTLOG)

Ce programmes devra être compiler en adoption de droit par rapport à qsecofr

Attention,
vous pouvez en fonction de votre organisation, envoyer un mail au responsable , etc…
vous pouvez lancer ce programme par un autre utilisateur qui fera la demande
vous pouvez et c’est le mieux faire une page web sur votre ibm i , PHP, NODEJS, Autres qui fera cette demande
Il est conseillé malgré tout de bine suivre ces opérations de rendu de mot de passe

5) Auditer les violations de mot de passe


Vous pouvez tracer les erreurs de mot de passe, pour faire ca sur l’ibm i , vous devez mettre en place l’audit
C’est la valeurs système QAUDLVL vous devez au moins indiquer *AUTFAIL
C’est les codes PW qui vont indiquer une erreur de mot de passe
Vous pouvez avoir un suivi en analysant les postes de journaux exemple
DSPJRN JRN(QAUDJRN) JRNCDE((T)) ENTTYP(PW)
Vous pouvez être proactif en mettant en place une solution IDS
En utilisant un programme d’exit de journal par exemple :

RCVJRNE JRN(QAUDJRN) EXITPGM(VOTREBIB/VOTREPGM) RCVRNG(*CURCHAIN) +
FROMENTLRG(poste de début) +
JRNCDE((T)) ENTTYP(‘PW’)

Attention à soumettre votre traitement pour pouvoir l’arrêter proprement

Conclusions

Une bonne politique de mots de passe est une des pierres angulaires de la stratégie de sécurité

, 5 Choses (avancées) sur la gestion des mots de passe

Voici quelques informations, un peu plus sensible sur la gestion des mots de passe.

1) Mot de passe SST


Pour accéder aux outils de maintenance système (SST), vous devez avoir un profil crée (CRTSSTUSR) et votre profil IBMi devra avoir le droit *SERVICE
vous pouvez ensuite lancer une session SST par STRSST

2) Mot de passe i netserver


I netserver gère son propre contrôle de mot de passe identique pour accéder à vos partages.
vous avez sans doute déjà reçu des messages CPIB682 qui indiquent que l’utilisateur est désactivé pour Netserver
pour le réactiver vous pouvez passer par Navigator For i ou utiliser l’API QZLSCHSI
exemple ici

https://www.ibm.com/support/pages/node/684479

3) Contrôler un mot de passe


Par la commande CHKPWD sur le profil en cours , monmsg CPF2300 à traiter
Par API QSYGETPH, plus d’information, sur le site https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/apis/QSYGETPH.htm
exemple
PGM PARM(&userid &passwrd &STS)
/* Paramètres*/

DCL VAR(&USERID) TYPE(CHAR) LEN(10) /* input */

DCL VAR(&PASSWRD) TYPE(CHAR) LEN(10) /* input */
DCL &STS *CHAR 01 /* output */

/* Variables de travail / DCL VAR(&ERRORCODE) TYPE(CHAR) LEN(272)
DCL VAR(&MSGID) TYPE(CHAR) STG(DEFINED) LEN(7) DEFVAR(&ERRORCODE 9)
DCL VAR(&HANDLE) TYPE(CHAR) LEN(12)

/* Récupère le handle */

CHGVAR VAR(&ERRORCODE) VALUE(X’0110′) CALL QSYGETPH (&USERID &PASSWRD &HANDLE &ERRORCODE X’0000000A’ X’FFFFFFFF’) /* test message d’erreur */
If (&MSGID *ne ‘ ‘) THEN(Do)
CHGVAR VAR(&STS) VALUE(‘1’)
SNDPGMMSG MSGID(CPF9897) MSGF(*LIBL/QCPFMSG) +
MSGDTA(&MSGID *BCAT ‘Erreur contrôle de +
mot de passe’) MSGTYPE(ESCAPE) ENDDO ELSE CMD(DO) CHGVAR &STS VALUE(‘0’) SNDPGMMSG MSGID(CPF9897) MSGF(LIBL/QCPFMSG) +
MSGDTA(‘Mot de passe correct pour le +
profil ‘ !! &USERID) MSGTYPE(*COMP)
ENDDO
ENDPGM

4) Supprimer le mot de passe
Certain utilsateurs ne servent pas à ce connecter et il peut être important de leurs enlever celui c’est le cas des profils de QSRV et QSRVBAS par exemple !
pour réaliser cette opération vous devez faire un chgusrprf en indiquant le paramètre PASSWORD(*NONE)

5) Rendre un mot de passe utilisateur sans être *SECADM


par défaut un utilisateur ne peut modifier que son mot de passe
pour qu’un utilisateur puisse rendre un mot de passe, on peut faire un programme en adoption de droit par rapport à un profil qui lui a *SECADM
exemple
commande
CMD PROMPT(‘Changement PWD Utilisateur’)
PARM KWD(USRPRF) TYPE(NAME) LEN(10) MIN(1) + PROMPT(‘Profil utilisateur’)

programme

PGM PARM(&USR)

DCLPRCOPT USRPRF(OWNER)
/* paramètres */
dcl &usr *char 10
/* variables de travail */
dcl &usre *char 10
CHKOBJ OBJ(&USR) OBJTYPE(*USRPRF)
monmsg cpf9801 exec(do)
SNDUSRMSG MSG(‘Profil,’ *BCAT &USR BCAT ‘inexistant’) + MSGTYPE(INFO)
RETURN
enddo
RTVJOBA USER(&USrE)
CHGUSRPRF USRPRF(&USR ) PASSWORD(&USR ) +
PWDEXP(YES) STATUS(ENABLED)
monmsg cpf0000 exec(do)
SNDMSG MSG(‘Modification de passe impossible pour +
l »utilisateur’ *BCAT &USR *BCAT ‘demandée +
par’ BCAT &USRE) TOMSGQ(HSTLOG)
RETURN
enddo
SNDMSG MSG(‘Mot de passe pour l »utilisateur’ *BCAT +
&USR *BCAT ‘réinitialisé par’ BCAT + &USRE) TOMSGQ(HSTLOG)
endpgm