Les 3 codes à analyser sur les dernières 24 heures
SELECT x.ENTRY_TIMESTAMP AS DATE_HEURE, x.JOURNAL_CODE AS code, x.JOURNAL_ENTRY_TYPE AS type, SUBSTR(VARCHAR(ENTRY_DATA, 5000), 2, 15) AS ADRESSE_SOURCE, SUBSTR(VARCHAR(ENTRY_DATA, 5000), 17, 5) AS PORT_SOURCE, SUBSTR(VARCHAR(ENTRY_DATA, 5000), 22, 15) AS ADRESSE_CIBLE, SUBSTR(VARCHAR(ENTRY_DATA, 5000), 37, 5) AS PORT_CIBLE FROM TABLE ( QSYS2.Display_Journal(‘QSYS’, ‘QAUDJRN’, — JOURNAL_ENTRY_TYPES => ‘SK’ , STARTING_TIMESTAMP => CURRENT TIMESTAMP – 24 HOURS ) ) AS x WHERE x.JOURNAL_ENTRY_TYPE IN (‘NC’, ‘NF’, ‘SK’)
A la différence du NETSTAT suivant qui vous donne à l’information à l’instant T
SELECT LOCAL_ADDRESS AS IP_LOCALE, LOCAL_PORT AS PORT_SOURCE, REMOTE_ADDRESS AS IP_DISTANTE, REMOTE_PORT AS PORT_CIBLE, CONNECTION_TYPE AS TYPE_CONNEXION FROM QSYS2.NETSTAT_INFO WHERE CONNECTION_TYPE = ‘IPV4’;
Remarque :
Il n’existe pas encore de service dans SYSTOOLS AUDIT_JOURNAL_SK() dommage
Vous pourrez cibler des ports, des adresses ou des plages etc.
Log du système
Vous pouvez également utiliser l’historique du système pour analyser certaines choses, par exemple connaitre les adresses ip.
Cette solution ne nécessite pas de paramétrage , et vous avez en principe 1 mois en ligne
— Toutes les connexions
SELECT MESSAGE_TIMESTAMP, MESSAGE_ID, REGEXP_SUBSTR(MESSAGE_TEXT, ‘(\D.)(\d*\.\d*\.\d*\.\d*)’, 1, 1, », 2) AS ADRESSE_IP, MESSAGE_TEXT FROM TABLE(QSYS2.HISTORY_LOG_INFO()) WHERE MESSAGE_ID LIKE(‘TCP%’) ORDER BY MESSAGE_TIMESTAMP DESC; — Les différentes adresses SELECT DISTINCT REGEXP_SUBSTR(MESSAGE_TEXT, ‘(\D.)(\d*\.\d*\.\d*\.\d*)’, 1, 1, », 2) AS ADRESSE_IP FROM TABLE(QSYS2.HISTORY_LOG_INFO()) WHERE MESSAGE_ID LIKE(‘TCP%’) order by REGEXP_SUBSTR(MESSAGE_TEXT, ‘(\D.)(\d*\.\d*\.\d*\.\d*)’, 1, 1, », 2) ;
Divers :
Vous pouvez également utilisez une commande TRCCNN et générer un fichier PCAP que vous pourrez analyser ensuite , avec Wireshark
Mais également installer utiliser le FW de l’ibmi en mode journalisation pour historiser vos connexions, vous devrez installer et configurer 5769FW1
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2025-11-27 17:38:402025-11-28 18:21:18Analyser le Trafic TCP/IP avec le journal d’audit
Les variables seront remplacés par les valeurs correspondantes
Vous devrez lui indiquer un nom
Les paramètres à remplir sont intuitifs , par exemple tous les messages avec réponse
.
Vous indiquerez ici votre commande de traitement
.
Programme exemple ALERTALL
le plus souvent, on aura qu’un seul moniteur ou plusieurs qui supervisent la même file généralement QSYSOPR et on aura des alertes adaptées en fonction des identifiants de messages les messages sont données à titre d’exemple
PGM PARM(&MON &EVENTTYPE &DATE &TIME +
&MSGID &MSGSEV &MSGTYPE &MSGCOUNT &MSGTEXT +
&FRMJOBNAME &FRMJOBNUMBER &FRMPROGRAM &FRMUSER +
&OWNER &VAL &TVAL &TDUR &INTVL &RVAL &RDUR)
/* Déclaration des paramètres généraux */
DCL VAR(&MON) TYPE(*CHAR) LEN(20) /* Nom du moniteur */
DCL VAR(&EVENTTYPE) TYPE(*CHAR) LEN(10) /* Type d’événement (TRIGGER, RESET, etc.) */
DCL VAR(&DATE) TYPE(*CHAR) LEN(10) /* Date (format système) */
DCL VAR(&TIME) TYPE(*CHAR) LEN(6) /* Heure HHMMSS */
/* Variables spécifiques aux moniteurs de messages */
DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) /* Identifiant du message */
DCL VAR(&MSGSEV) TYPE(*CHAR) LEN(2) /* Gravité */
DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) /* Type de message */
DCL VAR(&MSGCOUNT) TYPE(*CHAR) LEN(5) /* Nombre de messages */
DCL VAR(&MSGTEXT) TYPE(*CHAR) LEN(256) /* Texte du message */
DCL VAR(&FRMJOBNAME) TYPE(*CHAR) LEN(10) /* Nom du job émetteur */
DCL VAR(&FRMJOBNUMBER) TYPE(*CHAR) LEN(6) /* Numéro du job */
DCL VAR(&FRMPROGRAM) TYPE(*CHAR) LEN(10) /* Programme origine */
DCL VAR(&FRMUSER) TYPE(*CHAR) LEN(10) /* Utilisateur origine */
/* Variables spécifiques aux moniteurs systèmes */
DCL VAR(&OWNER) TYPE(*CHAR) LEN(10) /* Propriétaire du moniteur */
DCL VAR(&VAL) TYPE(*CHAR) LEN(20) /* Valeur mesurée */
DCL VAR(&TVAL) TYPE(*CHAR) LEN(20) /* Seuil déclencheur */
DCL VAR(&TDUR) TYPE(*CHAR) LEN(10) /* Durée de dépassement */
DCL VAR(&INTVL) TYPE(*CHAR) LEN(10) /* Intervalle de mesure */
DCL VAR(&RVAL) TYPE(*CHAR) LEN(20) /* Valeur de reset */
DCL VAR(&RDUR) TYPE(*CHAR) LEN(10) /* Durée de reset */
/* choix du traitement en fonction du message */
SELECT
/* Objet verrouillé */
WHEN COND(&MSGID *EQ ‘CPF3202’) DO
SUBR SUBR(T_CPF3202)
ENDDO
/* Fichier Plein */
WHEN COND(&MSGID *EQ ‘CPF5272’) DO
SUBR SUBR(T_CPF5272)
ENDDO
/*objet non trouvé */
WHEN COND(&MON *EQ ‘CPF9801’) DO
SUBR SUBR(T_CPF9801)
ENDDO
OTHERWISE DO
/* traitement par défaut */
/* Envoi d’un message à l’opérateur système */
SNDMSG MSG(‘ALERTE : Moniteur ‘ *CAT &MON *BCAT +
‘MSGID=’ *CAT &MSGID *BCAT +
‘VAL=’ *CAT &VAL *BCAT ‘TVAL=’ *CAT &TVAL) +
TOUSR(*SYSOPR)
ENDDO
RETURN
/* Sous programme traitement CPF3202 */
SUBR SUBR(T_CPF3202)
/* Traitement ici */
SUBRRTN
/* Sous programme traitement CPF5272 */
SUBR SUBR(T_CPF5272)
/* Traitement ici */
SUBRRTN
/* Sous programme traitement CPF9801 */
SUBR SUBR(T_CPF9801)
/* Traitement ici */
SUBRRTN
ENDPGM
Vous pouvez gérer leurs status de moniteurs
Arrêt / redémarrage des moniteurs
CALL PGM(QSYSDIR/QNAVMNSRV) PARM(‘*START’)
CALL PGM(QSYSDIR/QNAVMNSRV) PARM(‘*STOP’)
ils sont démarrés par défaut à l’IPL à l’identique des ce qui tournait avant l’arrêt
Conclusion :
C’est une solution simple si vous n’avez pas de solution de supervision
Mais il est conseillé de centralisé toute votre supervision en un point unique par exemple un Centreon / Nagios
Plutôt que de multiplier les solution hétéroclites, qui complexifie la vision globale
Remarque :
Comme solution IBMi, vous pouvez également utiliser les WATCHERs pour réaliser la même chose
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2025-09-28 10:54:342025-09-28 10:54:34Moniteur dans Navigator for i
Vous connaissez les fonctions usage qui vous permettent de sécuriser votre système IBMi
Exemple , accès au fichier
Elles sont organisées par famille
Voici les principales
Base operating system (5770SS1) TCP/IP connectivity utilities (5770TC1) Backup, Recovery, and Media Services (BRMS) (5770BR1 5770BR2) IBM i Access Client Solutions (ACS) (5770XJ1) IBM Navigator for i
Vous avez un site de référence qui va vous permettre de vous y retrouver c’est ici
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2025-01-20 20:23:012025-01-20 20:23:02Trouver la fonction usage que vous cherchez ?
La préconisation d’IBM et de faire IPL à chaque application de PTFs pour ne pas perdre le cache SQL par exemple
Mais, il y a quand même un point, pour vous inviter à en faire plus, c’est la mémoire qui est perdu sur certain travaux
Vous avez une vue QSYS2.SYSTMPSTG qui permet de voir les buckets
La vue SYSTMPSTG contient une ligne pour chaque espace de stockage temporaire qui contient une quantité de stockage temporaire sur le système. Le stockage temporaire est un stockage qui ne persiste pas lors d’un redémarrage du système d’exploitation. on parle de « BUCKET »
Voici une requête qui montre l’espace perdu par les jobs terminés
SELECT ‘Perdu’ as memoire , sum(BUCKET_CURRENT_SIZE) as taille FROM qsys2.SYSTMPSTG WHERE JOB_STATUS = ‘*ENDED’
le détail
SELECT JOB_NAME, JOB_USER_NAME, JOB_NUMBER , BUCKET_CURRENT_SIZE FROM qsys2.SYSTMPSTG WHERE JOB_STATUS = ‘*ENDED’ order by BUCKET_CURRENT_SIZE desc
Voici une requête qui donne la taille totale
SELECT ‘Total’ as memoire , sum(BUCKET_CURRENT_SIZE) as taille FROM qsys2.SYSTMPSTG ;
Vous pouvez faire un ratio et si il est important 10 % par exemple
Vous devrez faire une IPL, pour récupérer cette mémoire
Vue dans Navigator For I
Ps: A ce jour il n’y a pas d’autres solutions pour récupérer cette mémoire
pour en savoir plus : https://www.ibm.com/support/pages/how-often-ipl-should-be-performed
Une des nouveautés de la dernière TR est de pouvoir analyser et exporter les analyses de journaux d’audit à partir d’un interface graphique dans navigator for i.
le menu
Vous avez la nouvelle option, gérer les magasins d’audit
vous devez commencer par en créer un
Attention la bibliothèque doit existée
Une fois les données agrégées vous avez une liste de vos magasins
vous avez un menu qui vous permet de voir le détail du contenu du magasin
Vous avez le détail de votre magasin que vous pouvez consulter ou exporter par exemple
le menu action
Conclusion
Ca facilite grandement l’utilisation et la restitution des informations d’audit
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2024-06-14 20:21:082024-06-14 20:21:09Gérer les magasins de datas
Pour rappel, les listes de validation sont des objets sur IBMi, de type VLDL.
Par ligne de commande, on peut seulement créer une liste ou la supprimer.
L’utilisation classique des listes d’autorisation est la sécurisation de vos serveurs IWS par authentification basique. Celles-ci permettent l’utilisation d’un profil qui n’est pas un réel utilisateur IBM i.
La gestion, de ces listes, se passe dans navigator for i, dans le HTTPAdmin :
Onglet « Advanced »
Ce que vous pouvez faire :
Ajouter une entrée dans la liste, si la liste de validation n’existe pas, elle sera créé pour l’occasion. A minima, il faut renseigner la liste de validation, un profil et un mot de passe
Changer le mot de passe d’une entrée
Supprimer une entrée
Lister les entrées d’une liste
Ce que vous ne pouvez pas faire :
Consulter le mot de passe en cours d’une entrée, un classique en terme de sécurité.
Supprimer une liste de validation, il faut utiliser la commande 5250 DLTVLDL
Pour mettre en place la sécurisation d’un serveur via ces listes, il faut, toujours depuis le HTTPAdmin, au niveau de la gestion des sécurités de votre serveur HTTP*, sélectionner l’option liste de validation :
Avantage :
Ne pas créer de réel utilisateur IBMi pour l’authentification.
Permettre à des tiers extérieurs d’avoir un login ne pouvant servir que dans le cadre d’appel HTTP à un serveur protéger par la liste d’autorisation dont est issu le login
Encryption de la liste au niveau OS. Pas de possibilité d’accès aux données de la liste de façon simple.
En cas d’appel depuis l’extérieur du réseau de confiance, ça semble une bonne option.
Inconvénient :
Il faut connaître en amont le client qui va se connecter, et donc avoir une gestion de demande /création de compte
L’interface de gestion n’est pas compatible avec un grand nombre d’entrées dans la liste. Dans ce cas il faudra, soit trouver une autre solution pour sécuriser son serveur, soit utiliser les API misent à disposition par IBM
* Sur les versions récentes, la sécurité peut aussi être gérée au niveau du serveur applicatif. A vous de voir, si vous voulez un duo de serveurs HTTP/applicatif ou seulement un serveur applicatif, mais c’est un autre sujet…
IBM nous fournit des API pour gérer les listes de validation. On retrouve les actions possibles dans Navigator for i…. Et d’autres !
En regardant de plus près ces API, on constate sur la création d’une entrée de la présence d’un attribut permettant ou non de décrypter un mot de passe :
Navigator for i utilisant les valeurs par défaut, lorsqu’on crée une entrée par ce biais, le mot de passe n’est pas décryptable. Par contre, si on crée une entrée par l’API correspondante, avec cet attribut positionné à QSY_VFY_FIND (1), on peut par la suite récupérer le mot de passe via l’API C QsyFindValidationLstEntry() ou son équivalent QSYFDVLE
Prenons des exemples :
Je crée dans une liste de validation, dédié à l’article, DTFORM/DEMOBLOG, un profil MdpnonVIsible avec l’attribut de décryptage à ‘0’, et un profil MdpVisible avec l’attribut de décryptage à ‘1’.
Première remarque : l’appel d’api d’ajout d’une entrée dans une liste de validation renvoie un erreur si la liste n’existe pas. Il faut la créer au préalable par la commande CRTVLDL.
En regardant dans Navigator for i, les deux entrées apparaissent sans distinction :
Lors du décryptage, si on tente un appel de l’API find avec une erreur, mauvais nom de liste, profil inexistant, …, le retour est en erreur, comme pour toutes les API : -1. On peut récupérer le message détaillé de l’erreur, on reste sur de la gestion standard :
Si on lance l’API Find avec pour le profil MdpnonVisible :
L’API renvoie un code retour ok, mais pas de mot de passe, normal, il n’est pas décryptable.
Avec le profil décryptable, on récupère bien le mot de passe initial :
Par cette méthode, vous pouvez donc récupérer des mots de passe stockés dans une liste de validation, à la condition que l’entrée ait été créée avec le top de décryptage à ‘1‘.
Pour compléter la sécurité sur le décryptage des mots de passe, vous pouvez mettre :
Sur la liste de validation
Un profil technique comme propriétaire
Aucun droit sur aucun autre profil .
Avoir un programme dédié au décryptage avec :
Comme propriétaire le même que celui de la liste de validation
Compilé pour faire de l’adoption de droit.
Et si on veut aller plus loin, en cas de debug possible en prod, protéger les sources, du programme de décryptage et ses appelants, par mot de passe.
Bien entendu cette stratégie n’est valable que si la gestion des droits utilisateurs est rigoureuse… Pas de *allobj sur les profils par exemple !
Conclusion :
Vous pouvez utiliser les listes de validation pour stocker des profils/mot de passe, sans les stocker en clair sur la machine. Mais on peut très bien imaginer utiliser ces listes pour stocker toutes les données sensibles permettant les échanges inter-applications ou autre :
URL d’invocation de WS
IP ou nom DNS pour FTP / SFTP
…
Et pour cela de se créer une liste par usage, liste pour URL, liste pour IP/DNS, …, de mettre dans le profil, un code application, et dans le mot de passe la valeur que l’on veut récupérer, avec la limitation de 600 caractères pour le mot de passe, à part pour des URL très spécifique, ça ne devrait pas être limitatif.
Les listes de validation restent des objets très peu connu, mais qui mérite de l’être !
/wp-content/uploads/2017/05/logogaia.png00Damien Trijasson/wp-content/uploads/2017/05/logogaia.pngDamien Trijasson2024-02-05 14:16:002025-03-19 10:40:31Utiliser les listes de validation comme coffre fort de mot de passe
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2024-01-18 16:59:252024-01-30 17:00:12Requêtes SQL dans ACS extraites de Navigator for i
Il existe 2 solutions pour gérer vos spools sans passer par un écran 5250, je vais vous les présenter.
La première solution est ACS
Vous devez avoir le java bundle sur votre PC.
Vous cliquez sur Sortie imprimante
Vous avez une grande possibilité de filtres par défaut vous voyez les spools de votre utilisateur.
En faisant un clic droit vous avez un menu qui va vous permettre de gérer vos spools, vous pouvez facilement
télécharger votre spool , il sera converti au format PDF.
La deuxième solution est Navigator for i
Se service d’administration doit être démarré
Vous devez choisir « Mes sorties imprimante »
Vous arrivez sur les spools de votre utilisateurs
Vous pouvez Convertir en PDF Si vous choisissez exporter, le fichier obtenu sera au format TXT en choisissant avancé, vous pouvez gérer votre imprimante
Conclusion :
Les principales différences sont ACS Plus de filtres NFI Possibilité de convertir en txt Possibilité de gérer l’imprimante
Dans la dernière TR est apparue une nouveauté très intéressante « API RSE », c’est un ensemble d’API REST fournies avec votre système d’exploitation au travers du serveur ADMIN5.
Ces APIs sont utilisables depuis le web et permettent de lancer des commandes, accéder à l’IFS, de lancer de requêtes SQL…
Ce service ne fonctionne qu’en TLS vous devrez donc le sécuriser par l’administration http ://Votre_systeme:2001/HTTPAdmin
Vous devez ensuite le démarrer s’il ne l’est pas c’est le serveur ADMIN5
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-06-27 07:16:592023-06-27 07:17:00Débuter avec API RSE
Nous utilisons de plus en plus de certificats pour crypter nos communications. Leur gestion via DCM sur l’IBM i devient donc de plus en plus nécessaire et « subtile ».
Les outils standards
Interface web de DCM (Digital Certificate Manager)
Beaucoup plus pratique et réactive depuis sa réécriture, elle comprend l’ensemble des fonctions (presque en réalité) : création des autorités, création des certificats, gestion des applications (au sens DCM), affectation, renouvellement, importation et exportation :
C’est propre, pratique.
Pour rappel, le principe : DCM permet de gérer les certificats (stocker, renouveler etc …), mais également de les affecter à une ou plusieurs applications IBM i. La notion d’application dans DCM est proche d’une notion de service : serveur telnet, serveur http, serveur ou client FTP et bien d’autres.
Ainsi un certificat peut être assigné à aucune, une ou plusieurs applications :
Et chaque application dispose de ses propres attributs, permettant par exemple de choisir les niveaux de protocoles :
A priori, on a pas de raison d’aller modifier ces attributs très souvent, l’interface web est parfaite pour ces actions
Services SQL
Pour plus de facilité, et de capacité d’automatisation, IBM délivre une fonction table (UTDF) : qsys2.certificate_info
Grâce à Jesse Gorzinski (M. Open Source chez IBM), vous disposez également de commandes shell pour effectuer les principales actions de DCM : création, affectation de certificats, liste …
Il faut absolument l’installer, cela vous permet d’automatiser de nombreuses actions courantes.
Exemple :
Les applications ?
« Houston, nous avons un problème ! ». Pas si grave non plus …
Il est facile de déterminer quels sont les certificats expirés ou qui vont expirer. Donc ceux à renouveler (création par DM ou importation). Par contre, seul l’interface web de DCM permet de voir les applications assignées, et donc les impacts de la péremption du certificat !
La connaissance des applications est primordiale : certaines nécessitent un arrêt/redémarrage du service (donc une interruption pour les utilisateurs), d’autres non.
Si aucune application n’est liée, on ne va peut être rien faire. Sinon, on va anticiper (sisi).
DCM permet de voir les applications, mais il vous faut aller sur le certificat et voir le détail par l’interface graphique. Donc humainement sur chacune de vos partitions.
API -> fonction table (UDTF)
Cette information est accessible par les APIs de DCM.
Pour plus de faciliter, nous vous proposons une fonction table SQL : listedcmapplication
L’objectif est de lister les applications ET les certificats associés :
Les deux paramètres permettent de sélectionner les applications avec ou sans certificat, les applications serveur ou client.
Vous pouvez également facilement utiliser les informations conjointes de qsys2.certificate_info. Par exemple, quels certificats vont expirer dans le mois et quelles sont les applications impactées :
Le code est open source, il est perfectible, n’hésitez pas à participer !
Quelques idées : agrégation des informations de différentes partitions, service correspondant actif ou non …
https://www.gaia.fr/wp-content/uploads/2023/02/dcm.png268618Nathanaël Bonnet/wp-content/uploads/2017/05/logogaia.pngNathanaël Bonnet2023-02-14 08:33:362023-02-14 08:35:31Gérer vos certificats par DCM