
Mise en place, administration et exploitation du MFA intégré IBM i
Un mot de passe peut être volé, deviné, ou contourné sans que l'utilisateur légitime ne s'en aperçoive. Les techniques d'attaque sont nombreuses et bien documentées :
Dans tous ces cas, si le MFA avait été activé, l'attaque aurait échoué même en possession du mot de passe valide.
L'activation du MFA est aujourd'hui requise ou fortement recommandée par de nombreux référentiels :
| Année | RFC | Algorithme | Description | Exemples |
|---|---|---|---|---|
| 1997 | RFC 2104 | HMAC | Hashed Message Authentication Code | Base de tout |
| 2000 | RFC 2865 | RADIUS | Remote Authentication Dial-In User Service | RSA, Entrust, Duo |
| 2005 | RFC 4226 | HOTP | HMAC-based one-time password (compteur) | YubiKey, SafeNet |
| 2011 | RFC 6238 | TOTP | Time-based one-time password | Google Auth, MS Auth, Authy |
| 2012 | RFC 6733 | DIAMETER | Successeur de RADIUS |
IBM i 7.6 implémente RFC 6238 (TOTP). Tous ces algorithmes reposent sur un shared secret — aucune couverture réseau n'est nécessaire pour les tokens HOTP et TOTP.
Avant IBM i 7.6, les solutions MFA disponibles sur IBM i étaient fournies par des éditeurs tiers : elles s'appuyaient principalement sur des exit points IBM i pour intercepter les authentifications.
Limites :
IBM i 7.6 introduit un MFA intégré à l'OS, disponible sans achat de logiciel supplémentaire :

L'utilisateur saisit ce code lors de sa connexion. IBM i calcule de son côté le même code et les compare.
La clé TOTP est stockée dans le profil utilisateur (*USRPRF), avec le même niveau de protection que le mot de passe.
Protection technique :
En pratique : même un profil avec
*ALLOBJne peut pas lire directement la clé TOTP d'un autre utilisateur.
Toute application implémentant RFC 6238 est compatible :
| Application | Plateforme |
|---|---|
| IBM Verify | iOS, Android |
| Google Authenticator | iOS, Android |
| Microsoft Authenticator | iOS, Android |
| Okta Verify | iOS, Android |
| Duo Mobile | iOS, Android |
| Authy | iOS, Android, Desktop |
| 1Password | Multi-plateforme |
| YubiKey (OATH) | Token physique |
| Autres tokens OATH-TOTP | Tokens physiques |
Un des défis du MFA sur IBM i est que certaines interfaces (ACS, Navigator, DCM) établissent plusieurs connexions successives pour une même session utilisateur. Sans HCS, chaque connexion demanderait un code TOTP.
Avant HCS : chaque connexion à un serveur hôte (Database Server, Print Server, File Server...) nécessite une authentification distincte → l'utilisateur devrait entrer son code TOTP à chaque fois.
Avec HCS : le client s'authentifie une seule fois (avec User + Password + TOTP) auprès du Host Connection Server. Ce serveur transmet ensuite les nouvelles connexions aux autres serveurs hôtes sans ré-authentification.
ACS, IBM Navigator for i et Digital Certificate Manager (DCM) ont été mis à jour pour utiliser HCS.
La clé TOTP est la valeur secrète commune au profil utilisateur IBM i et à l'application d'authentification.
Caractéristiques :
*TOTP.Exemple d'affichage après CHGTOTPKEY :
TOTP key . . . . . . . : PGWG KZ6T 7RRY AZLG PPDJ MHFN CRYQ MDAF
Copy/paste version . . : PGWGKZ6T7RRYAZLGPPDJMHFNCRYQMDAF
Recovery key . . . . . : 47BB3CD184DC10789972AD8B601E98ED
2520AD706D6D6697C905BD6EC6DA8BCA
The TOTP key has been saved in your profile. It must also be entered into your
TOTP generator client application, without the blanks.
Save the recovery key for this TOTP key in a safe place.
Enter=Continue F9=Check TOTP
La clé de récupération est générée en même temps que la clé TOTP. Elle permet de se connecter à la place d'un code TOTP généré, dans les cas où l'utilisateur n'a plus accès à son application d'authentification.
Comportement :
| Situation | Comportement |
|---|---|
| Première utilisation | Démarre une fenêtre de 10 minutes |
| Pendant la fenêtre (10 min) | Peut être utiliséeplusieurs fois (utile car ACS 5250 peut demander plusieurs authentifications pour atteindre la ligne de commande) |
| Après 10 minutes | La clé de récupération estinvalidée |
| Si utilisée après 10 min | La clé TOTP estsupprimée du profil |
Procédure de secours si la fenêtre de 10 minutes est dépassée :
- L'utilisateur ne peut plus se connecter.
- L'administrateur supprime la méthode
*TOTPdu profil (CHGUSRPRF AUTHMTH(*NONE)).- L'utilisateur se reconnecte et génère une nouvelle clé TOTP (
CHGTOTPKEY).- L'administrateur remet la méthode
*TOTPsur le profil.
TOTPOPTITV)L'intervalle optionnel est la durée (en minutes) pendant laquelle un code TOTP n'est pas redemandé après une première authentification réussie.
*NONEUsage typique : configurer un intervalle pour les utilisateurs qui doivent utiliser des applications ne supportant pas le MFA (connexions SSH, ODBC, etc.) — ils s'authentifient une première fois via ACS ou Navigator, puis utilisent les autres interfaces durant l'intervalle sans saisir de code TOTP.
Cet attribut est le commutateur système du MFA. Il contrôle le comportement de l'ensemble du système.
Ses 4 effets lorsqu'il est activé :
password:facteur_additionnel pour les profils ayant une méthode autre que *NONE.*TOTP.QIBM_QSY_AUTH pour les profils avec méthode *REGFAC.Important n°1 : activer cet attribut ne force pas les utilisateurs à utiliser le MFA. Seuls les profils configurés avec
*TOTPou*REGFACseront contraints.
Important n°2 : cet attribut n'est pas sauvegardé ni restauré lors des sauvegardes système. Il doit être réactivé manuellement après une restauration complète du système. À intégrer dans la documentation de reprise d'activité.
Important n°3 : si l'attribut est désactivé ultérieurement, les profils ayant
*TOTPne seront plus contraints de saisir un TOTP. La clé TOTP et la méthode*TOTPrestent sur les profils. La réactivation de l'attribut réactive immédiatement l'obligation.
Chaque profil utilisateur dispose d'une liste de méthodes d'authentification. Les valeurs possibles sont :
| Méthode | Ce que l'utilisateur doit fournir | Exit program appelé |
|---|---|---|
*NONE |
User + Password seulement | Non |
*TOTP |
User + Password + Code TOTP | Non |
*REGFAC |
User + Password (+ facteur défini par le programme) | Oui |
*TOTP + *REGFAC |
User + Password + Code TOTP | Oui (facteur transmis = vide) |
*NONEest la valeur par défaut pour tous les profils, y compris ceux migrés depuis des releases antérieures.
password:facteur_additionnelPour les interfaces sans champ "facteur additionnel" (SSH, FTP, ODBC, certains clients tiers), l'utilisateur doit combiner son mot de passe et son code TOTP dans le champ mot de passe en utilisant : comme séparateur.
Exemple : Str0ngPassw#rd:358538
Règles importantes :
: séparateur se fait en partant de la fin de la chaîne (un : peut faire partie du mot de passe).: + facteur) ne peut pas dépasser 128 octets.*TOTP : le mot de passe ne devrait pas dépasser 121 octets (121 + 1 : + 6 chiffres = 128).*REGFAC uniquement : 128 - 1 - n octets, où n est la longueur du facteur attendu par le programme (1 à 64 octets).QSECURITYLe système doit être au niveau 40 ou supérieur.
DSPSECA /* Vérifier le niveau actuel */

Ou via Navigator

Si nécessaire :
CHGSYSVAL SYSVAL(QSECURITY) VALUE('40')
La plupart des systèmes en production sont déjà à 40 ou 50. Les systèmes encore à 20 ou 30 devront migrer avant d'activer le MFA. Voir la documentation IBM sur les impacts du changement de niveau de sécurité.
QPWDLVLLe système doit être au niveau de mot de passe 4.
DSPSYSVAL SYSVAL(QPWDLVL) /* Vérifier le niveau actuel */
Pour modifier :
CHGSYSVAL SYSVAL(QPWDLVL) VALUE('4')
Impacts à évaluer selon le niveau actuel :
- QPWDLVL 2 ou 3 → 4 : généralement sans impact, un test préalable est recommandé.
- QPWDLVL 0 ou 1 → 4 : changement significatif (longueur de mot de passe, règles de composition) — nécessite une planification et des tests approfondis.
Voir : Planning password level changes
QPWDLVL 3 → 4Le niveau 4 utilise un algorithme de chiffrement unidirectionnel différent des niveaux 2/3. C'est un changement de schéma cryptographique, pas seulement une règle de complexité.
Le changement ne prend effet qu'au prochain IPL (redémarrage du système).
Pour voir les valeurs courante et en attente :
DSPSECA
*NONEAu passage en niveau 4, tous les mots de passe niveau 0/1/2/3 sont effacés. Si un profil n'a pas encore de mot de passe niveau 4 généré, son mot de passe devient *NONE (connexion impossible).
Avant l'IPL, identifier les profils concernés :
SELECT * FROM QSYS2.USER_INFO WHERE PASSWORD_LEVEL_4 <> 'YES'
ou via PRTUSRPRF TYPE(*PWDLVL) / DSPAUTUSR.
Par exemple sur notre machine en QPWDLVL3, la plupart des profils ont un mot de passe encodé en niveau 4, sauf les profils qui n'ont pas changé de mot de passe depuis longtemps (avant migration en 7.6 et la possibiité d'encoder les mots de passe en niveau 4):

Pour forcer la génération d'un mot de passe niveau 4 sur ces profils : utiliser CHGPWD CHGUSRPRF... PASSWORD(xxx) ou faire signer l'utilisateur en texte clair (sans substitution de mot de passe).
Tout client qui n'envoie pas le mot de passe en clair (il envoie un hash) doit supporter le nouveau schéma de substitution du niveau 4, sinon les connexions échoueront.
Clients IBM officiellement supportés pour QPWDLVL 4 :
⚠️ Les middlewares tiers (ex. IBM Toolbox for Java intégré dans une application tierce) doivent être vérifiés : s'ils embarquent une version ancienne du middleware, ils ne fonctionneront plus.
SAVSECDTA /* ou SAVSYS */
Cela permettra de restaurer les mots de passe en cas de retour à un niveau inférieur.
CHGSYSVAL SYSVAL(QPWDLVL) VALUE(4)
Ou bien par Navigator :

Doit maintenant afficher :

Ou bien :

| Action | Commande / méthode |
|---|---|
| Sauvegarder les données de sécurité | SAVSECDTA |
| Identifier les profils sans mot de passe niveau 4 | SELECT * FROM QSYS2.USER_INFO WHERE PASSWORD_LEVEL_4 <> 'YES' |
| Forcer la création du mot de passe niveau 4 | CHGUSRPRF ou connexion en texte clair |
| Vérifier les clients tiers | Audit des middlewares |
| Vérifier la valeur en attente | DSPSECA |
Si votre organisation utilise un écran de connexion 5250 personnalisé, il doit être recréé à partir du format QDSIGNON3 pour inclure le champ "Facteur additionnel".
Cette modification doit être effectuée avant l'IPL qui active le MFA. Si l'IPL est effectué avant la mise à jour de l'écran, les utilisateurs verront le nouvel écran IBM par défaut (avec le champ facteur), mais pas votre écran personnalisé.
Voir : Signon screen display file
A ce stade, après IPL, la zone TOTP n'apparait pas encore à l'écran de connexion, tant que le facteur connexion additionnel n'est pas activé :

Le source est fourni ici QSYS/QAWTSSRC(QDSIGNON3). Vous pouvez le copier et l'éditer.

Le TOTP est basé sur l'heure UTC. L'heure du système IBM i et celle de l'application d'authentification doivent être synchronisées.
Une dérive mineure est tolérée par l'algorithme RFC 6238, mais l'activation du client NTP est fortement recommandée.
DSPSYSVAL QTIMADJ /* Vérifier la configuration de synchronisation */
Valeur QTIMADJ |
État |
|---|---|
QIBM_OS400_NTP |
Client NTP actif ✓ |
QIBM_OS400_SNTP |
Client SNTP actif (moins précis) |
*NONE |
Aucune synchronisation automatique ✗ |
NTP (Network Time Protocol) et SNTP (Simple Network Time Protocol) reposent sur le même protocole réseau (RFC 5905), mais diffèrent dans leur implémentation. NTP est capable de pondèrer des sources multiples, de calculer et corriger la dérive en ajustant progressivement l'horloge. SNTP fait des sauts dans la correction et est moins précis.
Configuration NTP via Navigator :
Réseau -> Serveurs -> Serveurs TCP/IP -> SNTP -> Propriétés
Démarrer avec TCP/IP :

Indiquer un ou plusieurs serveurs NTP :

Et les réglages de seuil :


Démarrer manuellement :


Vous retrouvez la configuration et les logs ici : /QIBM/UserData/OS400/TCPIP/NTP

Si vous avez plusieurs interfaces réseau, assurez vous que la communication se réalise sur une interface capable de communiquer avec le serveurNTP. Ajouter la directive suivante dans votre fichier /QIBM/USERDATA/OS400/TCPIP/NTP/ntp.conf :
interface listen 172.30.14.7
Puis arrêter et redéamrrer le client NTP.
Avant d'activer le MFA, il est fortement conseillé de s'assurer que les connexions aux host servers, Navigator for i et ACS sont chiffrées via TLS.
Sans TLS, le code TOTP (et le mot de passe) transitent en clair sur le réseau — ce qui réduit considérablement l'intérêt du MFA.
Via Access Client Solutions :

Ou Navigator


Pour remédier :

Installe l'autorité de certification das le "IBM i Magasin Web Trust" :

Que vous pouvez gèrer ensuite :

┌──────────────────────────────────────────────────────────────────┐
│ ÉTAPES ADMINISTRATEUR │
│ │
│ Étape 1 : Vérifier prérequis (QSECURITY, QPWDLVL) │
│ ↓ │
│ Étape 2 : Adapter l'écran de connexion si personnalisé │
│ ↓ │
│ Étape 3 : Activer l'attribut "facteur de connexion additionnel" │
│ ↓ │
│ Étape 4 : IPL du système │
│ ↓ │
│ Étape 5 (optionnel) : Configurer NTP │
│ ↓ │
│ Étape 6 (optionnel) : Enregistrer l'exit program *REGFAC │
└──────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ ÉTAPES UTILISATEUR │
│ │
│ Étape 1 : Générer sa clé TOTP (CHGTOTPKEY) │
│ ↓ │
│ Étape 2 : Sauvegarder la clé de récupération │
│ ↓ │
│ Étape 3 : Configurer l'application + valider (CHKTOTP) │
│ Notifier l'administrateur │
└──────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ ÉTAPES ADMINISTRATEUR / PROFILS │
│ │
│ Étape 1 : Vérifier que l'utilisateur a une clé TOTP │
│ Activer *TOTP / *REGFAC sur le profil │
│ Configurer l'intervalle optionnel │
└──────────────────────────────────────────────────────────────────┘
DSPSECA
Via IBM Navigator for i : Security > MFA Configuration > Security Configuration Information

CHGSECA ADLSGNFAC(*ENABLED)
Si la politique SST bloque la modification (message d'erreur) :

CHGSSTSECA CHGADLSGN(*YES)
Vous pouvez contrôler par DSPSSTSECA.

Puis relancer :
CHGSECA ADLSGNFAC(*ENABLED)
Via IBM Navigator for i :
Pour verrouiller l'attribut après configuration et empêcher toute modification ultérieure via OS (nécessite alors de passer par SST) :
CHGSSTSECA CHGADLSGN(*NO)
Avant IPL, vous devez avoir :

Le passage de *DISABLED à *ENABLED nécessite un IPL pour prendre effet. Tant que l'IPL n'a pas eu lieu, la valeur est en attente (pending).
Après l'IPL, les écrans de connexion afficheront un champ "Facteur additionnel".
Après IPL, la saisie du facteur optionnel est disponible dans les différentes interfaces :


Si vous souhaitez utiliser la méthode *REGFAC pour appeler un programme de validation supplémentaire :
ADDEXITPGM EXITPNT(QIBM_QSY_AUTH) FORMAT(AUTH0100) PGMNBR(1) +
PGM(ma_bib/mon_pgm_exit) REPLACE(*YES) CRTEXITPNT(*NO) +
PGMDTA(*JOB *CALC 20)
Le délai d'attente par défaut de l'exit program est 10 secondes. Le paramètre
PGMDTA(*JOB *CALC 20)le passe à 20 secondes dans l'exemple ci-dessus.
Via IBM Navigator for i :
On en parle plus en détail ensuite.
Rappel fondamental : l'administrateur ne peut pas générer la clé TOTP à la place de l'utilisateur. Chaque utilisateur doit générer la sienne en étant connecté avec son propre profil.
L'utilisateur se connecte avec son profil, puis exécute :
CHGTOTPKEY TOTPKEY(*GEN)
L'écran affiche :


Avec F9 vous pouvez saisir le code TOTP renvoyé par votre application après configuration manuelle :


Une clé peut aussi être spécifiée manuellement (si elle provient d'un autre système) :
CHGTOTPKEY TOTPKEY('PGWGKZ6T7RRYAZLGPPDJMHFNCRYQMDAF')
Deux cas selon les droits de l'utilisateur :
Utilisateur sans accès à QIBM_NAV_ALL_FUNCTION :
Utilisateur avec QIBM_NAV_ALL_FUNCTION :
Procédure :
QIBM_NAV_ALL_FUNCTION

L'affichage suivant présente votre clé à insérer dans votre application (ou via QRCode). N'oubliez pas la clé de récupèration à stocker dans un endroit sécurisé.
Une fois votre application configurée, saisissez votre mot de passe et code TOTP et valider pour confirmer la configuration.

QIBM_NAV_ALL_FUNCTIONL'application doit être configurée avec la clé TOTP :
Une fois configurée, l'application génère un nouveau code à 6 chiffres toutes les 30 secondes.
CHKTOTP
L'utilisateur saisit le code généré par son application. Si la validation réussit, la configuration est correcte.
Depuis l'écran
CHGTOTPKEY, appuyer sur F9=Check TOTP pour accéder directement àCHKTOTP.
DSPUSRPRF USRPRF(NB)
Chercher le champ :
La clé TOTP existe . . . . . . . . . . . . : Oui
Date de la dernière modification de la clé
TOTP . . . . . . . . . . . . . . . . . . : 20/07/26 13:53:29
Méthodes d'authentification . . . . . . . : *NONE
Intervalle facultatif du TOTP . . . . . . : *NONE
Pour voir tous les profils et leurs attributs MFA :
DSPAUTUSR
Appuyer F11 deux fois pour afficher la vue "Additional Authentication Info".
Exemple de sortie DSPAUTUSR :
Afficher les utilisateurs autorisés
La Dernière Intervalle Minutes
clé modif facultatif restantes
Profil Profil Méth TOTP clé du TOTP
utilisat groupe auth existe TOTP TOTP facultatif
JL *NONE Non 0 0
JL2 *NONE Non 0 0
NB *NONE Oui 20/07/26 0 0
PLB *NONE Non 0 0
Via IBM Navigator for i :

CHGUSRPRF USRPRF(NOM_PROFIL) AUTHMTH(*TOTP)
Via IBM Navigator for i :

Après quoi :

L'utilisateur doit désormais s'authentifier via mot de passe + TOTP (sinon CPF1120) :

Si l'intervalle n'est pas configuré, vous pouvez obtenir ce genre de message :

Modifiez par :
CHGUSRPRF USRPRF(NOM_PROFIL) AUTHMTH(*TOTP) TOTPOPTITV(60)
Ou :


| Valeur | Comportement |
|---|---|
*NONE |
Code TOTP requis à chaque authentification |
1 à 720 |
Code TOTP requis uniquement après expiration de l'intervalle (minutes) |
Via IBM Navigator for i :
Si l'utilisateur s'est déjà connecté avec TOTP et que le délai d'expiration n'est pas atteint : vous pouvez mettre n'importe quelle valeur dans le facteur optionnel, ce dernier ne semble pas testé.
CHGUSRPRF USRPRF(NOM_PROFIL) AUTHMTH(*REGFAC)
Via IBM Navigator for i :
CHGUSRPRF USRPRF(NOM_PROFIL) AUTHMTH(*TOTP *REGFAC) TOTPOPTITV(*NONE)
DSPUSRPRF USRPRF(NOM_PROFIL)
DSPAUTUSR /* F11 deux fois pour la vue MFA */
Via Navigator for i :

La méthode *REGFAC permet d'appeler un programme exit personnalisé après chaque authentification réussie. Ce programme peut effectuer n'importe quelle vérification supplémentaire et retourner succès ou échec.
Cas d'usage typiques :
Note critique : si
*REGFACest la seule méthode et que le programme exit ne fait rien de particulier, cela ne constitue pas une protection MFA. Le programme est seul responsable de la vérification additionnelle.
L'exit program est appelé pour :
Pour les API Get Profile Handle : l'authentification a lieu lors de l'appel get. Si le programme exit valide la création du handle, les appels set ultérieurs avec ce handle sont autorisés.
Comportement
ADDEXITPGM EXITPNT(QIBM_QSY_AUTH) FORMAT(AUTH0100) PGMNBR(1)
PGM(USEREXIT/AUTHEXIT) REPLACE(*YES) CRTEXITPNT(*NO) PGMDTA(*JOB *CALC 20)
profil utilisateur pour les interactifs, QUSER_NC pour QZBSCNNSRV (Host connection server), QSECOFR_NC pour QP0ZSPWT (PASE)...Notre programme est fait pour les tests, certains choix sont ici pour permettre de matérialiser des informations.
Options de compilation

Format du point d'exit

Interface du programme

Quelques variables

Les règles de contrôle

Récupèration du facteur additionnel si transmis

On loggue

La table

On voit que le programme est déclenché dans le travail :

Dans notre fichier de log :

Votre programme n'est appelé que si le profil est configuré pour *REGFAC.
Votre programme ne reçoit la valeur du facteur supplémentaire uniquement si *TOTP n'est pas configuré poru le profil.
Certains outils qui lancent plusieurs connexions (ie VSCode) : vous pouvez désactiver votre profil en 1 fois !
| API originale | API avec paramètres supplémentaires |
|---|---|
QSYGETPH |
QSYGETPH avec tous les paramètres optionnels |
QsyGetProfileHandle |
QsyGetProfileHandle2 |
QsyGetProfileHandleNoPwd |
QsyGetProfileHandleNoPwd2 |
QSYGENPT |
QSYGENPT avec tous les paramètres optionnels |
QsyGenPrfTkn |
QsyGenPrfTkn2 |
QsyGenPrfTknE |
QsyGenPrfTknE2 |
Même avec le MFA activé, un utilisateur disposant de *ALLOBJ peut se substituer à un autre profil sans connaître son mot de passe, en utilisant des valeurs spéciales (*NOPWD, *NOPWDCHK) sur des APIs comme QSYGETPH ou la commande SBMJOB USER(xxx).
Cette possibilité contredit les principes du MFA : pourquoi forcer un utilisateur à s'authentifier avec TOTP si quelqu'un d'autre peut "devenir" cet utilisateur sans aucune authentification ?
La fonction ID QIBM_RUN_UNDER_USER_NO_AUTH permet de protéger un profil contre cette usurpation.
*ALLOWED (usurpation autorisée, pour la compatibilité ascendante).*DENIED fait échouer toute opération tentant d'utiliser ce profil comme cible sans authentification préalable.*DENIED dont les actions sont restreintes — c'est les autres profils qui ne peuvent plus l'usurper.Note importante :
QIBM_RUN_UNDER_USER_NO_AUTHn'exige pas que le MFA soit activé sur le système. Tout profil interactif peut être protégé, indépendamment du MFA.
Via commande CL :
CHGFCNUSG FCNID(QIBM_RUN_UNDER_USER_NO_AUTH) USER(NOM_PROFIL) USAGE(*DENIED)
Via IBM Navigator for i :
Exemple 1 — QSYGETPH avec NOPWD
Notre programme de test pour appel de l'API :

NB est en *ALLOWED sur QIBM_RUN_UNDER_USER_NO_AUTH.
QSECOFR (avec *ALLOBJ) exécute :
CALL USURP
Profile handle: █v¾%q█cNÃ ExceptionID: BytesAvailable: 0
→ OK
On passe maintenant NB en *DENIED sur QIBM_RUN_UNDER_USER_NO_AUTH.
CHGFCNUSG FCNID(QIBM_RUN_UNDER_USER_NO_AUTH) USER(NB) USAGE(*DENIED)
Puis :
CALL USURP
Profile handle: ExceptionID: CPF4AF1 BytesAvailable: 26
→ Échec : CPF4AF1 — Opération non autorisée pour le profil utilisateur &1.
Le texte de 2nd niveau indique clairement :
Texte de message formaté
Système: ITEST10
ID message . . . . . . . . . : CPF4AF1
Fichier de messages . . . . : QCPFMSG
Bibliothèque . . . . . . . : QSYS
Message . . . . : Opération non autorisée pour le profil utilisateur &1.
Cause . . . . . : Le profil utilisateur &1 n'a pas accès à l'ID
d'utilisation de fonction QIBM_RUN_UNDER_USER_NO_AUTH. Il ne peut pas être
l'utilisateur cible pour l'opération demandée.
Que faire . . . : Utilisez une autre opération qui ne nécessite pas d'accès
à l'ID d'utilisation de fonction ou retirez le profil utilisateur de la
liste d'utilisation de fonction QIBM_RUN_UNDER_USER_NO_AUTH, puis réessayez.
Exemple 2 — SBMJOB USER
NB est en *ALLOWED sur QIBM_RUN_UNDER_USER_NO_AUTH.
QSECOFR exécute :
SBMJOB CMD(SNDMSG MSG('OK !') TOUSR(QSECOFR)) JOB(NOTIFNB) USER(NB)
→ OK
On passe maintenant NB en *DENIED sur QIBM_RUN_UNDER_USER_NO_AUTH.N
CHGFCNUSG FCNID(QIBM_RUN_UNDER_USER_NO_AUTH) USER(NB) USAGE(*DENIED)
QSECOFR exécute :
SBMJOB CMD(SNDMSG MSG('OK !') TOUSR(QSECOFR)) JOB(NOTIFNB) USER(NB)
Opération non autorisée pour le profil utilisateur NB.
Non autorisé au profil utilisateur NB.
Erreurs dans la commande SBMJOB.
→ Échec : CPF4AF1 — Opération non autorisée pour le profil utilisateur &1.
Vrai également pour les tâches planifiées !
_NCIBM fournit des profils avec le suffixe _NC ("not changeable") : QSECOFR_NC, QPGMR_NC, QSYSOPR_NC, QUSER_NC.
Ces profils :
_NC.*DENIED sur QIBM_RUN_UNDER_USER_NO_AUTH.*DENIED.Les profils
QSECOFR,QPGMR,QSYSOPRetQUSERsont désormais les vôtres.
Avant de mettre un profil en *DENIED, il est prudent d'activer l'audit d'avertissement pour vérifier quelles opérations seraient bloquées.
/* Vérifier que QAUDCTL contient *AUDLVL */
CHGSECAUD QAUDLVL(*AUTFAIL) /* ou via CHGSYSVAL SYSVAL(QAUDCTL) VALUE('*AUDLVL') */
Via Navigator : Security > Audit journal > Audit journal configuration → cocher Enable action auditing (*AUDLVL)

CHGUSRAUD USRPRF(NOM_PROFIL) AUDLVL(*AUTWARN)
Via Navigator : Users and Groups > Users → clic droit → Properties > Capabilities > Auditing → cocher Authorization failure warnings

Les enregistrements d'audit de type GR, sous-type F, avec *USAGEWARN dans le champ 1 sont générés lorsque le profil serait bloqué s'il était en *DENIED.
select *
from table (
SYSTOOLS.AUDIT_JOURNAL_GR(STARTING_TIMESTAMP => current timestamp - 2 hours, USER_NAME => 'NB') ) gr
where gr.entry_type = 'F'
Opérations journalisées dans le champ 3 :
| Code | Opération |
|---|---|
SBMJOB |
Job soumis sous un autre profil utilisateur |
GETPH |
API Get Profile Handle avec valeur spéciale de mot de passe |
GENPT |
API Generate Profile Token avec valeur spéciale |
SETUID |
API Set User ID avec le profil comme cible |
NFS |
Accès Network File System mappé vers ce profil |

Via Navigator avec la gestion des magasins de données (journal d'audit) :

Observer ces enregistrements pendant quelques jours/semaines avant de basculer en
*DENIED. Si des opérations légitimes apparaissent, les corriger (utiliser les profils_NC, adapter les applications) avant d'activer la restriction.
Un token de profil peut être transmis à d'autres processus pour qu'ils exécutent des actions au nom de l'utilisateur authentifié. Les tokens améliorés ajoutent une couche de protection.
Ces valeurs ne peuvent pas être extraites du token, mais sont transmises à QIBM_QSY_AUTH avant la génération si le profil a *REGFAC.
Les tokens améliorés protègent contre les attaques de replay et pre-play.
| API originale | API avec paramètres améliorés |
|---|---|
QSYGENPT |
QSYGENPT avec tous les paramètres optionnels |
QsyGenPrfTkn |
QsyGenPrfTkn2 |
QsyGenPrfTknE |
QsyGenPrfTknE2 |
QSYGENFT |
QSYGENFT avec les mêmes valeurs que le token original |
QsyGenPrfTknFromPrfTkn |
QsyGenPrfTknFromPrfTkn2 |
QSYSETPT |
QSYSETPT avec les mêmes valeurs que la génération |
QsySetToPrfTkn |
QsySetToPrfTkn2 |
La génération d'un token de profil de type multiple-use, regenerable nécessite des valeurs de token amélioré dans certaines configurations. Voir l'API
QSYGENPTpour les détails.
Dans les environnements multi-systèmes (HA, DR, développement/production), il peut être nécessaire de répliquer la clé TOTP d'un utilisateur d'un système à un autre pour qu'il puisse utiliser la même clé TOTP partout.
Retrieve TOTP Key (QSYRTVK)
*ALLOBJ + *SECADMQSYSETK/* Documentation : */
/* https://www.ibm.com/docs/api/v1/content/ssw_ibm_i_76/apis/qsyrtvk.htm */
Set TOTP Key (QSYSETK)
*ALLOBJ + *SECADMQSYRTVK*NONE si *TOTP est la méthode d'authentification/* Documentation : */
/* https://www.ibm.com/docs/api/v1/content/ssw_ibm_i_76/apis/qsysetk.htm */
Check TOTP Key (QSYCHKK) — PTF 5770SS1 V7R6M0 SJ05455
QSYRTVK/* Documentation : */
/* https://www.ibm.com/docs/api/v1/content/ssw_ibm_i_76/apis/qsychkk.htm */
Il existe 12 combinaisons courantes selon la méthode d'authentification, l'intervalle optionnel et l'accès à QIBM_RUN_UNDER_USER_NO_AUTH.
QIBM_RUN_UNDER_USER_NO_AUTH *ALLOWED:Les tentatives d'exécution sous ces profils via une interface ne nécessitant pas de mot de passe (SBMJOB USER=xxx, QSYGETPH avec NOPWD...) sont autorisées.
QIBM_RUN_UNDER_USER_NO_AUTH *DENIED: Les tentatives d'exécution sous ces profils sans authentification préalable échouent avec CPF4AF1.
| Profil | Méthode | Intervalle TOTP | QIBM_RUN_UNDER_USER_NO_AUTH | Description |
|---|---|---|---|---|
| Habib | *NONE |
*NONE |
*ALLOWED |
Aucun TOTP requis. Configuration par défaut de tous les profils (migrés ou nouveaux). |
| David | *NONE |
*NONE |
*DENIED |
Aucun TOTP. Toute tentative d'usurpation du profil (Kerberos, SSH key, SBMJOB USER=DAVID sans password, QSYGETPH avec *NOPWD) échoue. |
| Nicolas | *TOTP |
*NONE |
*ALLOWED |
TOTP requis à chaque authentification par mot de passe. |
| Laurent | *TOTP |
*NONE |
*DENIED |
TOTP requis à chaque authentification. Usurpation impossible. |
| Pierre-Louis | *TOTP |
10 min | *ALLOWED |
TOTP requis lors de la première authentification. Pendant les 10 min suivantes, seul le mot de passe est requis. Un TOTP valide fourni pendant l'intervalle réinitialise le compteur à 10 min. |
| Habib | *TOTP |
10 min | *DENIED |
TOTP requis initialement, puis intervalle de 10 min. Usurpation impossible. |
| Nathanael | *REGFAC |
N/A | *ALLOWED |
Aucun TOTP. L'exit program QIBM_QSY_AUTH est appelé après chaque authentification réussie. C'est le programme qui décide du facteur additionnel. |
| Julien | *REGFAC |
N/A | *DENIED |
Exit program appelé. Kerberos/SSH key échouent. Usurpation impossible. |
| Robert | *TOTP + *REGFAC |
*NONE |
*ALLOWED |
TOTP requis à chaque authentification. L'exit program est également appelé. Le facteur transmis au programme est vide. |
| Fadhila ¹ | *TOTP + *REGFAC |
*NONE |
*DENIED |
Configuration la plus sécurisée possible si le programme exit demande une authentification hors bande. TOTP + exit program + anti-usurpation. |
| Iliana | *TOTP + *REGFAC |
5 min | *ALLOWED |
TOTP requis lors de la première authentification, puis intervalle de 20 min. L'exit program est appelé à chaque authentification. |
| Damien | *TOTP + *REGFAC |
5 min | *DENIED |
TOTP + exit program + anti-usurpation, avec intervalle de 5 min. |
¹ Fadhila représente le profil le plus sécurisé possible, sous réserve que l'exit program exige une authentification hors bande (push notification + biométrie par exemple).
*ALLOBJ, *SECADM, *JOBCTL) : configurer au minimum *TOTP + QIBM_RUN_UNDER_USER_NO_AUTH *DENIED.*TOTP avec un intervalle raisonnable (30-60 min).*TOTP (les jobs batch ne peuvent pas saisir un code TOTP). Ne pas mettre ces profils en *DENIED sur QIBM_RUN_UNDER_USER_NO_AUTH.Ces applications utilisent le Host Connection Server et gèrent nativement le MFA :
| Application | Comportement |
|---|---|
| IBM i Access Client Solutions (ACS) | Champ "Additional factor" affiché. Connexion via HCS : une seule authentification TOTP. |
| IBM Navigator for i | Idem ACS. |
| Digital Certificate Manager (DCM) | Idem ACS. |
Ces trois applications utilisent la substitution de mot de passe (hash unidirectionnel) : le format
password:TOTPne fonctionne pas. Il faut impérativement utiliser le champ "Additional factor".
*TOTP, il faut spécifier le facteur additionnel sur l'objet Java utilisé avant connexion :// La classe AS400 dispose de constructeurs acceptant un facteur additionnel
AS400 system = new AS400("monsysteme", "monuser", "monmotdepasse", "123456");
*TOTP. Elles doivent être modifiées pour obtenir et définir la valeur TOTP sur l'objet AS400.com.ibm.as400.access.AS400.useEnhancedProfileTokens=false.Si ACS est exécuté directement sur IBM i (interactivement ou en batch) et que le job courant a *TOTP, une erreur d'authentification se produit dans ces conditions :
*NONE.→ En job interactif : ACS invite l'utilisateur à saisir ses credentials + TOTP. → En job batch : le job reste en attente indéfiniment.
Ces applications stockent le mot de passe et s'authentifient silencieusement en arrière-plan. Elles échouent avec le MFA en mode absolu (TOTPOPTITV(*NONE)) car le code TOTP a expiré.
Stratégie recommandée : configurer un intervalle optionnel suffisant pour couvrir la durée d'utilisation de l'application.
CHGUSRPRF USRPRF(NOM_PROFIL) TOTPOPTITV(60)
L'utilisateur s'authentifie une première fois (via ACS ou Navigator), puis l'application peut fonctionner pendant 60 minutes.
password:TOTP — Interfaces sans champ dédiéPour les interfaces qui n'ont pas de champ "Additional factor" :
| Interface | Méthode |
|---|---|
| SSH (Putty, OpenSSH...) | Saisir monmotdepasse:123456 dans le champ passwordSi vous utilisez une connexion par fichier de clé : pas de TOTP demandé |
| FTP | Idem |
| ODBC (si non géré via ACS) | Idem |
| Clients 5250 sans champ facteur | Idem |
Éduquer les utilisateurs : l'invite SSH affiche simplement "password" sans indication du format attendu. Les utilisateurs doivent être informés qu'ils doivent ajouter
:+ code TOTP.
Pour FTP par exemple, voici un script .bat permettant de tester :

On obtient dans ftp.log :
Connect‚ … itest10.gaia.lan.
220-QTCP at ITEST10.GAIA.LAN.
220 Connection will close if idle more than 5 minutes.
501 OPTS unsuccessful; specified subcommand not recognized.
331 Enter password.
530 Log on attempt by user NB rejected.
221 QUIT subcommand received.
Avec l'ajout du TOTP :

Et la log indique :
Connect‚ … itest10.gaia.lan.
220-QTCP at ITEST10.GAIA.LAN.
220 Connection will close if idle more than 5 minutes.
501 OPTS unsuccessful; specified subcommand not recognized.
331 Enter password.
230 NB logged on.
200 Representation type is ASCII nonprint.
250-NAMEFMT set to 1.
250 "/home/NB" is current directory.
200 PORT subcommand request successful.
150 Retrieving file /home/NB/curl.log
226 File transfer completed successfully.
ftp : 2756 octets reçus en 0.
00 secondes … 2756.00 Ko/s.
221 QUIT subcommand received.
Si vous activez MFA sur votre profil développeur, il est conseillé de se connecter avec une clé SSH.
Lors de nos tests, Code for IBM i a refusé notre clé au format PPK, fonctionnelle sur le même système avec d'autres outils.
La connexion a réussi avec un export de la clé privée au format openSSH vie PuttyGen :

Code for IBM i tente ensuite de se connecter à plusieurs services. Vous pouvez donc avoir ce genre de message :

C'est dû au règlage d'intervalle pour le profil :

Mettez une valeur raisonnable.
Avant de pouvoir se connecter à Code for IBM i : se connecter via une interface qui supporte le TOTP de façon explicite (telnet par exemple), afin que l'authentification soit mise en cache pour l'intervalle configuré.
Ces applications ne fonctionnent pas si l'intervalle optionnel de l'utilisateur a expiré :
password:totp)Interfaces définitivement incompatibles :
*TOTP pour les web services qu'il protège directement. Solution : utiliser IBM HTTP Server en frontal, qui supporte le format password:totp.*TOTP ou *REGFAC.*TOTP.Fix Central :

System Service Tools (SST) et Dedicated Service Tools (DST) disposent d'une implémentation MFA indépendante du MFA OS.
Points clés :
Ne nécessite aucun accès internet.
L'horloge doit être synchronisée.
| Caractéristique | MFA OS | MFA SST |
|---|---|---|
| Intervalle optionnel TOTP | Configurable (1-720 min ou*NONE) | Non disponible — toujours requis |
| Méthodes disponibles | *TOTP, *REGFAC |
*TOTP uniquement |
| Exit program | Oui (QIBM_QSY_AUTH) |
Non |
| Lien avec profil OS | Non | Non (indépendant) |
Un profil SST dispose de ces nouveaux attributs :
TOTP ou NONE (défaut).
| Commande | Description |
|---|---|
DSPSSTSECA |
Afficher les attributs de sécurité SST |
CHGSSTSECA |
Modifier les attributs de sécurité SST |
DSPSSTUSR |
Afficher les attributs d'un utilisateur SST |
CRTSSTUSR |
Créer un utilisateur SST |
CHGSSTUSR |
Modifier un utilisateur SST (dont la méthode d'authentification) |
DLTSSTUSR |
Supprimer un utilisateur SST |
L'administrateur SST active le TOTP sur la connexion SST.
STRSST puis option 8. Work with Service Tools Server Security and Devices puis option 5. Work with service tools security options

A partir de maintenant :

L'utilisateur SST génère sa clé TOTP.
Soit par la commande CHGSSTKEY

Affiche :

Soit depuis les menus SST


Il configure son application d'authentification.
Il sauvegarde la clé de récupération.
SST force la vérification du facteur TOTP avant de sauvegarder la clé.

L'administrateur SST active le TOTP sur le profil SST de l'utilisateur.
Soit depuis les menus SST :

Soit par la commande CHGSSTUSR :

À partir de ce moment, le code TOTP est requis à chaque authentification SST.

| Commande | Paramètres clés | Description |
|---|---|---|
DSPSECA |
Afficher les attributs de sécurité (QSECURITY, QPWDLVL, Additional sign-on factor) | |
CHGSECA |
ADLSGNFAC(*ENABLED/*DISABLED) |
Activer/désactiver le facteur de connexion additionnel |
CHGSSTSECA |
CHGADLSGN(*YES/*NO) |
Autoriser/interdire la modification de l'attribut depuis l'OS |
DSPSYSVAL |
SYSVAL(QPWDLVL) |
Afficher le niveau de mot de passe |
CHGSYSVAL |
SYSVAL(QPWDLVL) VALUE('4') |
Modifier le niveau de mot de passe |
DSPSYSVAL |
SYSVAL(QSECURITY) |
Afficher le niveau de sécurité |
CHGSYSVAL |
SYSVAL(QSECURITY) VALUE('40') |
Modifier le niveau de sécurité |
STRTCPSVR |
SERVER(*NTP) |
Démarrer le client NTP |
DSPSYSVAL |
SYSVAL(QTIMADJ) |
Vérifier la synchronisation de l'heure |
CHGTOTPKEY |
TOTPKEY(*GEN) |
Générer et stocker une clé TOTP (exécuté par l'utilisateur) |
CHKTOTP |
Valider le fonctionnement de la clé TOTP (exécuté par l'utilisateur) | |
DSPUSRPRF |
USRPRF(xxx) |
Afficher le profil utilisateur et ses attributs MFA |
DSPAUTUSR |
(F11 deux fois) | Lister tous les profils avec attributs MFA |
CHGUSRPRF |
USRPRF(xxx) AUTHMTH(*TOTP) TOTPOPTITV(60) |
Activer *TOTP avec intervalle optionnel |
CHGUSRPRF |
USRPRF(xxx) AUTHMTH(*REGFAC) |
Activer la méthode exit program |
CHGUSRPRF |
USRPRF(xxx) AUTHMTH(*TOTP *REGFAC) |
Combiner *TOTP et *REGFAC |
CHGFCNUSG |
FCNID(QIBM_RUN_UNDER_USER_NO_AUTH) USER(xxx) USAGE(*DENIED) |
Protéger un profil contre l'usurpation |
CHGUSRAUD |
USRPRF(xxx) AUDLVL(*AUTWARN) |
Activer l'audit d'avertissement sur un profil |
ADDEXITPGM |
EXITPNT(QIBM_QSY_AUTH) FORMAT(AUTH0100) ... |
Enregistrer l'exit program *REGFAC |
DSPSSTSECA |
Afficher les attributs de sécurité SST | |
CHGSSTSECA |
Modifier les attributs de sécurité SST | |
CHGSSTUSR |
Modifier un utilisateur SST (dont TOTP) |
| API | Autorisation requise | Description |
|---|---|---|
QSYRTVK |
*ALLOBJ + *SECADM |
Récupérer la clé TOTP (protégée) d'un profil |
QSYSETK |
*ALLOBJ + *SECADM |
Définir la clé TOTP d'un profil (mirroring) |
QSYCHKK |
— | Vérifier si une clé TOTP correspond (mirroring) — PTF SJ05455 |
QSYGETPH |
— | Get Profile Handle (avec paramètre facteur additionnel) |
QsyGetProfileHandle2 |
— | Version améliorée de QsyGetProfileHandle |
QSYGENPT |
— | Generate Profile Token (avec paramètres améliorés) |
QsyGenPrfTkn2 |
— | Version améliorée de QsyGenPrfTkn |