, , Les tentatives de connexion échouées

Si vous avez mis en œuvre le journal vous pouvez et même devez analyser les refus de connexion.
Le plus souvent c’est un mauvais mot de passe mais ca peut être aussi une attaque, ou un comportement douteux

Voici une requête simple qui permet cette analyse rapide

SELECT JOB_NAME, USER_NAME, FUNCTION, MESSAGE_ID, MESSAGE_TIMESTAMP
FROM TABLE(QSYS2.DISPLAY_JOURNAL(‘QSYS’, ‘QAUDJRN’))
WHERE MESSAGE_ID IN (‘CPF2234’, ‘CPF1107’, ‘CPF1393’)
ORDER BY MESSAGE_TIMESTAMP DESC;

Les messages traités ici
CPF2234 Tentative de connexion échouée.
CPF1107 Mot de passe incorrect.
CPF1393 Accès refusé.

Remarque :
Vous pouvez ajouter des filtres (plage horaire, autres messages de refus , etc …)
Vous devrez découper vous même la zone entry data, vous pouvez également utiliser les fonctions table QSYS2.DISPLAY_JOURNALxx spécialiser par TYPE

Plus d’information ici https://www.ibm.com/support/pages/qsys2displayjournal

, Synchronisez votre partition avec QSNTP

On a de plus en plus besoin d’avoir des machines synchronisées, pour la validation des transactions, des informations de sécurité etc…

il existe un protocole qui permet de synchroniser l’horloge de votre partition c’est le protocole SNTP

On va voir ici comment le mettre en œuvre en tant que client, en sachant que vous pourriez également utiliser votre IBMI comme un serveur

Votre serveur peut être interne ou externe il est accédé sur le port 123 , si vous cherchez un serveur :

https://syrte.obspm.fr/spip/services/ref-temps/article/diffusion-de-l-heure-par-internet-ntp-network-time-protocolv

1) Paramétrage du service TCP/IP

Vous devrez bien sur arrêter et redémarrer le service pour que la modification soit prise en compte

2) Mise en œuvre par la valeur système QTIMADJ mettre QIBM_OS400_NTP pour activer

3) Suivi des mises à jour, elles sont stockées dans un répertoire /QIBM/UserData/OS400/TCPIP/NTP

Vous avez des fichiers de log QTOTxxxx , ils sont horodatés

Vous avez également dans le journal d’audit les postes de type SV (modification de valeurs systèmes) qui peuvent être analysé

Vous y retrouverez les modifications de la valeur système QTIME

Pour en savoir plus

https://www.ibm.com/docs/fr/i/7.5?topic=protocol-scenario-synchronizing-clocks-i

N’hésitez pas c’est simple et efficace

, , , Trouver la fonction usage que vous cherchez ?

?

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.ibm.com/docs/en/i/7.5?topic=reference-supplied-function-ids

Remarque :

De plus en plus de F U sont livrées en mode interdites, ce qui sécurise votre système, attention à QIBM_NAV_ALL_FUNCTION en V7R5 par exemple

, , TR5 SYSTOOLS.CONFIGURATION_STATUS

Cette nouvelle vue vous permet de voir vos unités et leur STATUS

Exemple

La liste des écrans actifs

SELECT *
FROM SYSTOOLS.CONFIGURATION_STATUS
WHERE object_attribute = ‘DSPVRT’
AND STATUS_DESCRIPTION = ‘ACTIVE’
ORDER BY OBJECT_NAME;

Rappel :

les informations la TR sont ici :

https://www.ibm.com/support/pages/ibm-i-75-tr5-enhancements

, , Exécuter ACS à partir de votre partition

Vous voulez exécuter ACS à partir de votre IBMI

Exemple : la nouvelle fonction de génération des fichiers XLS

VALUES SYSTOOLS.GENERATE_SPREADSHEET(
PATH_NAME => ‘/home/plb/liste_options.xls’,
FILE_NAME => ‘QAUOOPT’,
LIBRARY_NAME => ‘QGPL’);

Le répertoire /QIBM/ProdData/Access/ACS est en *PUBLIC *EXCLUDE par défaut.
Voici une solution pour ouvrir en gardant la main sur les utilisateurs qui auront droit à cette possibilité

Création de la liste d’autorisation

CRTAUTL AUTL(ACS)
TEXT(‘Exécution ACS sur IBMi’)

On considère que votre installation est par défaut, on applique la liste dessus

CHGAUT OBJ(‘/QIBM/ProdData/Access/ACS’) AUTL(ACS) SUBTREE(*ALL)

Vous pouvez éditer vos utilisateurs

EDTAUTL AUTL(ACS)

Remarque:

Vous pouvez gérer les droits par groupe, mais le plus efficace c’est par utilisateur, vous voyez ainsi qui est autorisé directement.

L’idée n’est pas de rester sur 5250, mais on voit bien que la transition sera longue et pas toujours indolore.
il existe des solutions de rewamping chez plusieurs éditeurs

Mais il existe un produit méconnu chez IBM qui s’appelle IBM i Access – Mobile (5770XH2)

Vous pouvez le télécharger sur le site ESS d’IBM

Voici la procédure à suivre pour l’installer est ici

https://www.ibm.com/support/pages/ibm-i-access-mobile

Une fois votre instance démarrée vous pouvez accèder par l’URL
http://<votre partition>:2011/iamobile/

On se concentrera directement sur la partie 5250 , vous devrez indiquer ce lien

http://<votre partition>:2011/iamobile/iWAStartSession

vous avez un premier écran

puis la mire d’ouverture

et ici un wrkactjob par exemple

Vous avez de nombreuses options d’affichage

Conclusion :

C’est une solution qui peut répondre pour quelques utilisateurs nomades, qui se connectent occasionnellement.
Vous n’avez pas de clients à déployer et vous utilisez des mécanismes de gestion purement #IBMi

, Profil *DISABLED

Souvent j’entends , « Oui le profil existe encore, mais il est désactivé »

Attention, ce status n’est pris en compte que sur certains protocoles , comme 5250 par exemple

Si vous voulez utiliser cette notion sur d’autres protocoles, vous devrez le gérer vous même , voici un exemple pour le protocole DRDA

On va utiliser un programme d’exit, attention pour DRDA c’est dans les attributs réseaux que vous pouvez le déclarer.

Voici la procédure à suivre pour la prise en compte

CHGNETA    DDMACC(EXPLOIT/DRDAEXIT) 
ENDTCPSVR  SERVER(*DDM)             
DLYJOB 30                           
STRTCPSVR  SERVER(*DDM) 

Voici le programme de contrôle DRDAEXIT

pgm parm(&return &data) /*---------------------------------------*/    
/* ce programme vérifie que l'utilisateur de connexion n'est pas */    
/* desactivé                                                     */    
/* Mise en Oeuvre                                                */    
/*           CHGNETA    DDMACC(EXPLOIT/DRDAEXIT)                 */    
/*---------------------------------------------------------------*/    
             DCLPRCOPT  USRPRF(*OWNER)                                 
dcl &return *char 1                                                    
dcl &data *char 200                                                    
dcl &status *char 10                                                   
             DCL        VAR(&USER) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 
                          DEFVAR(&DATA 1)                              
             DCL        VAR(&APP ) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 
                          DEFVAR(&DATA 11)                             
             DCL        VAR(&func) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 
                          DEFVAR(&DATA 21)                             
/* si profil desactivé on refuse */                                    
             RTVUSRPRF  USRPRF(&USER) STATUS(&STATUS)                  
             if cond(&user = '*DISABLED') then(do)                     
             chgvar &return '0' 
             enddo                  
             else do                
             chgvar &return '1'     
             enddo                  
endpgm  

Remarque :

Vous pourrez ajouter d’autres contrôles , par exemple, par rapport au planning d’activation des profils
Votre programme devra être compiler en adoption de droit, avec un profil de droit *SECADM pour avoir droit à la commande RTVUSRPRF

, Intégrité des objets sur votre partition

Sur votre IBMi en version 40 de sécurité, vous pouvez signer vos objets !

Mais, êtes vous sur que tous les objets sur votre machine sont sains

Vous avez une commande qui permet de faire ce contrôle CHKOBJITV.
Demander une sortie, attention ca prendra un certain temps

Exemple :

SBMJOB CMD(CHKOBJITG USRPRF(*ALL) OUTFILE(votre bib/CHKOBJITG))
JOB(CHKOBJITG)
JOBQ(QSYSNOMAX)

Vous pouvez retrouver ces violations c’est la zone aiviol

Sur les programmes , programmes de service etc …

ALTERED – L’objet a été falsifié.
BADSIG – L’objet a une signature numérique qui n’est pas valide.
DMN – Le domaine n’est pas correct pour le type d’objet.
PGMMOD – L’objet exécutable a été falsifié.
BADLIBUPDA – L’attribut de protection de la bibliothèque n’est pas défini correctement.
SCANFSFAIL – L’objet a été analysé par un programme de sortie lié à l’analyse et, au moment de cette dernière demande d’analyse, l’objet a échoué à l’analyse.
Si une violation est enregistrée pour un module de microcode sous licence, le nom de l’objet sera le nom RU à 8 caractères, où le nom RU est le nom d’unité remplaçable du module de microcode sous licence, le nom de la bibliothèque sera vide et le type d’objet sera *LIC. Si une violation de ce type est rencontrée, contactez votre représentant de service pour récupérer.

Sur les fichiers

NOSIG – L’objet peut être signé mais ne possède pas de signature numérique.
NOTCHECKED – L’objet ne peut pas être vérifié, il est en mode débogage, enregistré avec de l’espace de stockage libéré ou compressé.
NOTTRANS – L’objet n’a pas été converti au format actuel ou n’est pas compatible avec la version, la version et le niveau de modification actuels.

Si après votre analyse vous avez des objets ALTERED ou BADSIG essayez de comprendre ce que c’est
Vous aurez beaucoup de NOTTRANS, ils ne sont pas très grave ?

Comment s’en prémunir pour ne plus injecter d’objet non conformes ?

il y a 3 valeurs systèmes à régler

QVFYOBJRST Vérification de l’objet à la restauration

QFRCCVNRST Forçage de la conversion à la restauration

QALWOBJRST Option de restauration des objets sensibles

Voici l’ordre dans lequel , elles s’enchainent

Attention faites des tests

Vous pourrez alors suivre par les audits ces violations
par exemple les types GR,OR,RA,RJ,RO,RP,RQ,RU,RZ sur les restaurations mais pas que …

Conclusion:

Pas de panique, mais on peut trouver des choses bizarres demandez des explications à vos fournisseurs de logiciels
et attention cependant aux objets de domaine *SYSTEM, si vous en avez dans la liste vous devez agir

, , Utilisez DRDA sur #IBMi

Dans ACS vous avez des exemples comme si dessous

Vous indiquer le nom de votre base de données distantes et vous exécuter votre requête sur le système distant.

derrière cette requête ce cache un protocole nommé DRDA , comme ODBC il permet de ce connecté à une base de donnée distante.

Nous allons voir comment le mettre en œuvre .

sur le système source
Vous devez créer une entrée pour la base de données

le plus simple c’est de passer par la commande WRBRDBDIRE , vous ajouterez une connexion IP à votre système distant.

Sur le système cible
Vous devez paramétrer le service par la commande CHGDDMTCPA , il faut avoir le même mode d’authentification que la base de données distante, par défaut user + mot de passe
vous devez démarrer le service STRTCPSVR *DDM

voila c’est tout
vous pouvez à partir de votre système source faire un connect SQL sur votre système cible si vous avez un mot de passe.

Si vous ne voulez pas renseigner de mot de passe comme dans les exemples ACS vous allez devoir utiliser sur votre système source les postes poste d’authentification serveur.
Pour les ajouter vous avez la commande ADDSVRAUTE, vous devrez également avoir mis la valeur système QRETSVRSEC à ‘1’ pour que vos mots de passe soit enregistrés

il est conseillé d’ajouter un poste générique, par exemple QDDMDRDASERVER en indiquant un user et un mot de passe du système cible !

il n’y a pas de commande WRKSRVAUTE mais vous pouvez en trouver une ici https://github.com/Plberthoin/PLB/tree/master/GTOOLS/

Exemple :

A partir de ce moment la mot de passe sera passé directement.

Vous pouvez facilement, par des services sql comparer 2 partitions (valeurs systèmes, fonctions , etc …)

Remarques

Les noms doivent être en majuscule
il est conseillé de mettre un programme d’exit de contrôle
Attention, vous pouvez vous connecter avec un utilisateur *disabled
Les fichier DDM sur IP s’appuient sur cette technologie

, , , Connaitre la bibliothèque du programme en cours

Vous voulez connaitre la bibliothèque d’un programme en cours d’exécution, pour ajouter cette bibliothèque par exemple, pour contextualiser un exit programme, un watcher, un trigger ou pour limiter un environnement prod, versus dev.
Le tout, sans harcoder une bibliothèque qui figera votre code et vos environnements.

Voici 2 exemples

En RPGLE

dcl-ds *N PSDS ;                  
  bibli_du_pgm CHAR(10) POS(81);  
  nom_du_pgm CHAR(10) POS(1);     
 End-ds ;                          
dcl-s present ind ;
// on tente d'ajouter la bibliothèque
 exec sql                                                                  
 call qcmdexc('Addlible ' concat :bibli_du_pgm concat ' *FIRST') ;         
if sqlcode = 0 ;
  present = *on ;
endif ;
// votre traitement ici
// on enlève si on a ajouté 
if present = *on ;
 exec sql                                                                  
 call qcmdexc('Rmvlible ' concat :bibli_du_pgm ) ;         
endif ;

En CLLE

PGM                                                    
            DCL        VAR(&DATA) TYPE(*CHAR) LEN(80)  
            DCL        VAR(&LIB) TYPE(*CHAR) LEN(10)   
            DCL        VAR(&PGM) TYPE(*CHAR) LEN(10)   
            DCL        VAR(&TEMOIN) TYPE(*LGL)
 /* Paramétrage de l'appel */                          
            CHGVAR     VAR(%BIN(&DATA  1 4)) VALUE(80) 
            CHGVAR     VAR(%BIN(&DATA  5 4)) VALUE(80) 
            CHGVAR     VAR(%BIN(&DATA  9 4)) VALUE( 0) 
            CHGVAR     VAR(%BIN(&DATA 13 4)) VALUE( 0) 
 /* Appel de la procédure */                           
            CALLPRC    PRC('_MATPGMNM') PARM(&DATA)    
 /* Extraction des informations  */                    
            chgvar &pgm %SST(&DATA 51 10)              
            chgvar &lib %SST(&DATA 19 10) 
/* ajout de la bibliothèque */
ADDLIBLE &LIB *FIRST
monmsg cpf2103 exec(do)
chgvar &temoin '1'
enddo 
/* Votre traitement ici */
/* on enlève si on a ajouté */
if cond(*not &temoin) then(do)
RMVLIBLE &LIB
enddo          
ENDPGM          

Remarque :

On a mis également le programme en cours dans les exemples

On a mis le code pour enlever la bibliothèque après le traitement, uniquement si c’est notre programme qui l’a ajouté.


En RPGLE si vous avez un fichier vous devrez déclarer votre fichier en USROPN et ouvrir le fichier par un OPEN, après avoir ajouté la bibliothèque