Aller au contenu

Recette SQL IBM i (AS/400) · Sécurité

Les profils utilisateurs inutilisés depuis plus de 90 jours

Les profils utilisateurs actifs qui n'ont pas servi depuis plus de 90 jours : la première liste à produire pour un audit de sécurité IBM i.

Le besoin

Un compte inutilisé mais toujours actif est une porte ouverte : ancien salarié, prestataire parti, compte de test. Les auditeurs demandent cette liste en premier.

La requête

SELECT AUTHORIZATION_NAME, STATUS, USER_CLASS_NAME, LAST_USED_TIMESTAMP, PREVIOUS_SIGNON,
       DAYS(CURRENT DATE) - DAYS(LAST_USED_TIMESTAMP) AS JOURS_SANS_UTILISATION
FROM QSYS2.USER_INFO
WHERE STATUS = '*ENABLED'
  AND AUTHORIZATION_NAME NOT LIKE 'Q%'
  AND LAST_USED_TIMESTAMP < CURRENT TIMESTAMP - 90 DAYS
ORDER BY LAST_USED_TIMESTAMP
FETCH FIRST 10 ROWS ONLY

QSYS2.USER_INFO donne une ligne par profil. LAST_USED_TIMESTAMP est la dernière utilisation du profil (connexion, travail soumis…). Les profils IBM (en Q) sont exclus.

Le résultat sur un IBM i 7.5

Ce que l'IBM i a renvoyé le 01/10/2026 (5 lignes au plus) :

AUTHORIZATION_NAME Profil utilisateur STATUS Statut USER_CLASS_NAME Classe d'utilisateur LAST_USED_TIMESTAMP Horodatage de dernière utilisation PREVIOUS_SIGNON Horodatage de la connexion précédente JOURS_SANS_UTILISATION Jours sans utilisation
PETIT *ENABLED *PGMR 2026-01-23 00:00:00.000000 2025-11-13 15:39:43.000000 251
UTIL186 *ENABLED *PGMR 2026-01-25 00:00:00.000000 2026-01-25 14:47:06.000000 249
UTIL180 *ENABLED *PGMR 2026-02-06 00:00:00.000000 2026-02-06 16:31:02.000000 237
BONNET *ENABLED *PGMR 2026-03-02 00:00:00.000000 2026-03-02 09:04:21.000000 213
UTIL158 *ENABLED *USER 2026-03-04 00:00:00.000000 2026-03-04 14:31:00.000000 211

Chez nous, des profils d'apprenants n'ont pas servi depuis plus de 230 jours : exactement ce que la requête doit faire ressortir.

Données anonymisées : les noms de système, de profils, de bibliothèques, de postes et les adresses IP ont été remplacés.

L'adapter à votre système

Pour les désactiver, générez les commandes : 'CHGUSRPRF USRPRF(' CONCAT AUTHORIZATION_NAME CONCAT ') STATUS(*DISABLED)', à relire avant de les lancer. USER_INFO_BASIC est plus rapide si vous n'avez besoin que des colonnes principales.