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

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

Le premier réflexe 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 ça 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.

Ça 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 soit encore ouvert chez vous, c’est le port 512.
Voici une solution pour connaitre qui se connecte en REXEC sur votre partition 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, ce sont des traitements qui se déclenchent pour traiter des entrées d’une pile et qui ne renvoient pas de résultats directs au proccess émetteur

Il existe des produits spécifiques pour faire ça, 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ées, 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éception, on peut indiquer un temps négatif souvent -1, et le 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 instruction
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 bib/votre programme) +
CALLWCHPGM(WCHEVT) WCHMSG((ALL))
WCHMSGQ((Votre bib/votre msgq))

votre programme reçoit 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éfinies 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 certaines 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énements 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 éviter 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

  • Indiquer les applications qui seront protégées par ce service

  • 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’IBMi 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 IBMi 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 IBMi, FTP par exemple .

3) Mise en place d’un programme de validation

Si les règles de contrôle 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 peu 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 et 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 IBMi, PHP, NODEJS, Autres qui fera cette demande
Il est conseillé malgré tout de bien 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 ça sur l’IBMi, 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 sensibles 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éé (CRTSSTUSR) et votre profil IBMi devra avoir le droit *SERVICE
vous pouvez ensuite lancer une session SST par STRSST

2) Mot de passe iNetServer


iNetServer 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

Certains utilisateurs ne servent pas à se 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

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

Voici quelques informations concernant la gestion des mot de passe sur IBM i

1) Le niveau de mot de passe

Vous pouvez indiquer un niveau de mot de passe par la valeur Système QPWDLVL

1 et 2, vous avez un mot de passe sur 10 sans diférentiation de CAST
3 et 4, vous avez un mot de passe à 128 sensible à la cast.

le passage au niveau 3 ou 4 impose un IPL pas de gros risque pensez juste si vous avez des mires customizée à ajuster la taille de la zone PWD.
ce qu’il est conseillé, c’est de modifier le sous système CHGSBSD … SGNDSPF(*QDSIGNON) avant l’ipl et de faire vos modifications après en changeant à nouveau la valeur après avoir mis à niveau le fichier ècran.

2) Régle de validation des mots de passe

les principales valeurs systèmes

QPWDCHGBLK *SEC Bloquer la modification du mot de passe
QPWDEXPITV *SEC Durée de validité d’un mot de passe
QPWDEXPWRN *SEC Avertissement d’expiration de mot de passe
QPWDLMTAJC *SEC Limiter chiffres adjacents dans un mot de passe
QPWDLMTCHR *SEC Limiter certains caractères dans un mot de passe
QPWDLMTREP *SEC Limiter nb caractères identiques dans mot de pass
QPWDMAXLEN *SEC Longueur maximale du mot de passe
QPWDMINLEN *SEC Longueur minimale du mot de passe
QPWDPOSDIF *SEC Limiter positions des caractères dans mot de pass
QPWDRQDDGT *SEC Chiffre obligatoire dans un mot de passe
QPWDRQDDIF *SEC Mot de passe différent des précédents

QPWDRULES *SEC Règles mot de passe
les valeurs possibles sont :
*PWDSYSVAL prendre les valeurs sysval QPWD
*ALLCRTCHG règle de composition de mot de passe appliquées au chgusrprf et crtusrprf
*CHRLMTAJC
*CHRLMTREP
*DGTLMTAJC
*DGTLMTFST
*DGTLMTLST
*DGTMAXn
*DGTMINn
*LMTSAMPOS
*LMTPRFNAME
*LTRLMTAJC
*LTRLMTFST
*LTRLMTLST
*LTRMAXn
*LTRMINn
*MAXLENnnn
*MINLENnn
*MIXCASEn
*REQANY3
*SPCCHRLMTAJC
*SPCCHRLMTFST
*SPCCHRLMTLST
*SPCCHRMAXn
*SPCCHRMINn
plus d’informations ici
https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/rzarl/rzarlpwdrules.htm

3) Comment modifier un mot de passe ?

il y a 3 méthodes pour modifier un mot de passe
-la commande chgpwd
-l’API QSYCHGPW
-la commande chgusrprf (elle nécessite le droit *SECADM)

4) La validité d’un mot de passe et les actions associées

La durée de validité d’un mot de passe est exprimé en jours dans le paramètre du profil PWDEXPITV, par défaut on peut indiquer *SYSVAL il se baser alors sur la valeur système QPWDEXPITV
la règle d’usage est fixée par la valeurs système QMAXSIGN qui indique le nombre de tentatives
QMAXSGNACN indique l’action à réaliser en cas de débordement on peut désactiver le profil ou le profil est l’écran associé

5) Pour connaitre les profils désactivés

Voici une requête

select AUTHORIZATION_NAME as Profil_IBMi,
PREVIOUS_SIGNON as derniere_signature,
STATUS as status,
PASSWORD_CHANGE_DATE as date_changement,
DATE_PASSWORD_EXPIRES as date_expiration,
USER_DEFAULT_PASSWORD as PWD_egal_USRPRF,
LAST_USED_TIMESTAMP AS derniere_utilisation
from QSYS2.USER_INFO
where status = ‘*DISABLED’

Conclusion

Il est important d’avoir une bonne gestion des mots de passe sur votre ibm i.
La stratégie doit être adaptée au niveau requis par l’activité de l’entreprise
Elle doit être le plus possible globale au niveau des logins utilisés pour les différentes applications
Il n’y a pas de solution miracle ….