Il peut être intéressant de voir les droits qui existent sur un objet, pour comprendre et administrer la sécurité.
Les droits sur un objet sont visibles par la commande DSPOBJAUT, mais également par DSPAUTL si votre objet est protégé par une liste.
Prérequis, vous devez avoir au moins le droit *USE sur la bibliothèque qui contient l’objet.
Cette requête résume l’ensemble de ces droits présents
--
-- Voir les droits sur un objet
-- sur l'objet et sur la liste s'il y en a une
-- indiquez votre objet et votre lib
--
SELECT '2) LISTE' as nature,
'QSYS' as Library ,
AUTHORIZATION_LIST,
'*AUTL' as TYPE,
AUTHORIZATION_NAME ,
OBJECT_OPERATIONAL,
OBJECT_MANAGEMENT,
OBJECT_EXISTENCE,
OBJECT_ALTER,
OBJECT_REFERENCE,
DATA_READ,
DATA_ADD,
DATA_UPDATE,
DATA_DELETE,
DATA_EXECUTE
FROM QSYS2.AUTHORIZATION_LIST_USER_INFO
WHERE AUTHORIZATION_LIST = (SELECT AUTHORIZATION_LIST
FROM QSYS2.OBJECT_PRIVILEGES
WHERE object_schema = 'VOTRE_BIB'
AND object_name = 'VOTRE_OBJ'
FETCH FIRST ROW ONLY)
UNION
SELECT '1) OBJECT' as NATURE,
OBJECT_SCHEMA as library,
OBJECT_NAME as OBJECT,
OBJECT_TYPE as TYPE,
AUTHORIZATION_NAME,
OBJECT_OPERATIONAL,
OBJECT_MANAGEMENT,
OBJECT_EXISTENCE,
OBJECT_ALTER,
OBJECT_REFERENCE,
DATA_READ,
DATA_ADD,
DATA_UPDATE,
DATA_DELETE,
DATA_EXECUTE
FROM QSYS2.OBJECT_PRIVILEGES
WHERE object_schema = 'VOTRE_BIB'
AND object_name = 'VOTRE_OBJ'
ORDER BY 1;
Rappel :
Ces droits ne sont vérifiés que si votre profil et votre profil de groupe ne sont pas *ALLOBJ
Les droits qui sont systématiquement présents sur les objets, sont les droits *PUBLIC et le propriétaire
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2024-06-09 09:44:452024-06-11 19:41:49Liste complète des droits sur un objet
Vous voulez savoir quel est le droit d’un utilisateur sur un objet, et comprendre comment il a obtenu ce droit. Voici une commande qui va vous l’afficher.
On ne traitera ici que le mécanisme historique de l’IBMi, pas les droits complétifs obtenus par les groupes additionnels, on considère également que vous avez droit sur la bibliothèque qui contient l’objet.
Rappel le schéma de recherche d’obtention des droits
Le principe est : au premier trouvé il s’arrête !
Notre outil s’appelle DSPUSRAUT2, il existait déjà sur Git une version sans écran DSPUSRAUT
La commande
Le résultat
Dans notre exemple le droit est *ALL et il est obtenu grâce au profil de groupe mentionné dans la liste d’autorisation.
Les sources de l’outil DSPUSRAUT2 se trouvent ici :
Vous avez 4 sources à compiler dans cet ordre, un DSPF, un PNLGRP, un CLLE (en adoption de droit par rapport à un profil qui a *ALLOBJ) et un CMD.
Voila, simple et efficace.
Ça peut vous permettre de comprendre rapidement des accès ou des refus et maintenant grâce aux services SQL, vous pouvez administrer une grande partie des autorisations.
Vous pouvez aussi utiliser les collectes de droits pour retrouver des informations intéressantes qui sont plus complètes mais plus compliquées à utiliser …
Conseil :
Si vous voulez mettre en place une politique de sécurité intéressante vous devez viser le niveau 5 ou 6
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2024-06-07 15:08:182024-06-11 19:45:01Connaitre le droit d’un profil sur un objet
Comment faire afficher un écran à un traitement batch ?
Les traitements 5250 sont faits pour tourner en interactif, mais pour différentes raisons vous pouvez vouloir les faire tourner en batch :
Pas de login sécurisation pas de attn request etc …
Voici un exemple, dans une société ou j’ai travaillé, les unités de productions pouvaient demander un mot de passe à l’astreinte, par exemple la nuit.
La solution la plus simple qu’on avait trouvée était de lui afficher un programme de changement sur son unité écran.
On lui demandait donc son profil utilisateur et son unité écran et on lançait le programme sur celle ci, il pouvait changer son mot de passe directement.
C’est cet exemple que j’ai simplifié qui est ci dessous
le DSPF source
A DSPSIZ(24 80 *DS3)
A CA03(03)
A INDARA
A R FMT01
A*%%TS SD 20240527 074541 PLB REL-V7R4M0 5770-WDS
A 4 20'Réinitialiser un mot de passe'
A 7 2'Utilisateur :'
A 8 2'Nouveau mot de passe :'
A 22 1'F3=Exit'
A USER 10A O 7 26
A PWD 32A B 8 26CHECK(LC)
A DEV 10A O 4 54
A TEXTE 30 O 14 3
Le CLP source
pgm (&dev &user)
/*----------------------------------------------------------*/
/* Ce programme permet de faire afficher un écran en batch */
/* vous devez acquérir l'unité écran */
/* pour réinitialiser un mot de passe */
/* sbmjob cmd(call initpwdr (&dev &user) job(QPADEV0001) */
/*----------------------------------------------------------*/
dcl &dev *char 10
dcl &user *char 10
/* Contrôles existence */
CHKOBJ OBJ(&DEV) OBJTYPE(*DEVD)
MONMSG MSGID(CPF9801) EXEC(DO)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('L''unité écran doit exister') +
MSGTYPE(*ESCAPE)
enddo
ALCOBJ OBJ((&DEV *DEVD *EXCLRD)) WAIT(0)
monmsg CPF1002 exec(do)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('Impossible d''allouer l''unité +
écran doit exister') MSGTYPE(*ESCAPE)
enddo
CHKOBJ OBJ(&user) OBJTYPE(*usrprf)
MONMSG MSGID(CPF9801) EXEC(DO)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Le +
profil utilisateur doit exister') +
MSGTYPE(*ESCAPE)
enddo
/* Lancement du programme sur l'écran remote */
SBMJOB CMD(CALL PGM(INITPWDR) PARM((&DEV) (&USER))) +
JOB(&DEV) JOBQ(QSYSNOMAX)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('Travail, ' *bcat &dev *bcat +
'démarré') MSGTYPE(*comp)
endpgm
Le CLP cible
pgm (&dev &user)
/*----------------------------------------------------------*/
/* Ce programme réinitiliase un mot de passe */
/* Peut être envoyé sur un écran remote qui est sur la */
/* Mire */
/*----------------------------------------------------------*/
dcl &dev *char 10
dclf initpwdr
monmsg cpf0000 exec(goto erreur)
/* controles fait dans le programme appelant */
OVRDSPF FILE(INITPWDR) DEV(&DEV) OVRSCOPE(*JOB)
chgvar &pwd 'ici mot de passe'
dountil &in03
SNDRCVF RCDFMT(FMT01)
if cond(*not &in03) then(do)
if (&pwd *ne 'ici mot de passe') then(do)
CHGUSRPRF USRPRF(&USER) PASSWORD(&PWD) PWDEXP(*YES)
Chgvar &texte ('Mot de passe réinitialisé')
enddo
enddo
enddo
/* fin traitement */
DLTOVR FILE(INITPWD) LVL(*JOB)
MONMSG MSGID(CPF0000)
return
erreur:
SNDUSRMSG MSG('Réinitialisation de mot de passe pour' +
*BCAT &USER *BCAT ', actuellement +
impossible') MSGTYPE(*INFO)
MONMSG MSGID(CPF0000)
endpgm
La seule spécificité est de choisir l’unité écran d’affichage, pour qu’elle soit éligible elle doit être à la mire de connexion.
Sur un changement de mot de passe, il peut être important d’avoir un suivi ?
Bien sur, vous pouvez ajouter des contrôles …
Le job cible qui tourne en batch !
Donc pas de possibilité d’ATTN Request , et messages d’erreurs dans QSYSOPR
Remarques :
Vous pouvez choisir l’utilisateur de lancement, mais QSECOFR est interdit dans un SBMJOB Simple mais efficace, mais difficilement généralisable, on doit avoir un OVRDBF par DSPF
Intéressant pour des demandes ponctuelles
Dans les CLP vous pouvez indiquer directement l’unité sur la commande SNDRCVF
SELECT * FROM TABLE(QSYS2.TRACKED_JOB_INFO(JOB_QUEUE_LIBRARY_FILTER => ‘GG’, JOB_QUEUE_FILTER => ‘GGTEST’)) ORDER BY INTERNAL_JOB_IDENTIFIER, ROUTING_STEP;
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2024-05-10 15:35:052024-05-10 15:35:06Gestion du suivi des tâches soumises
Vous pouvez demander un tas d’informations d’audit pour tracer les violations de sécurité par exemple
Vous devez avoir le droit *AUDIT sur votre profil pour la mettre en place, c’est valeurs système qui permettent de le paramétrer les informations souhaitées
QAUDCTL, QAUDLVL, QAUDLVL2
Pour chaque information demandée, vous allez avoir un poste qui est créé dans le journal d’audit QAUDJRN.
Pour consolider ces informations, vous devez les copiez dans des fichiers il existait jusqu’à présent 2 méthodes
1) Les fichiers modèles utilisables dans des commandes IBMi
exemple pour les types PW, c’est le fichier QASYPWJ5 que vous devez dupliquer dans votre bibliothèque DSPJRN JRN(QAUDJRN) ENTTYP(‘PW’) OUTPUT(OUTFILE) OUTFILFMT(TYPE5) OUTFILE(MABIB/WASYPWJ5)
La stratégie est la suivante , la première fois vous demandez la création du fichier de sortie par un crtdupobj et après vous ajoutez à ce fichier tous les soirs à 23 h 59 les postes PW
2) Les Technology Refresh nous apportent régulièrement des services
Ces services permettent de lire directement ces informations par SQL. c’est les fonctions tables qui se trouve dans SYSTOOLS et qui s’écrivent SYSTOOLS.AUDIT_JOURNAL_XX() XX étant le type exemple pour les types PW SYSTOOLS.AUDIT_JOURNAL_PW()
voici un exemple
select A.VIOLATION_TYPE_DETAIL, A.AUDIT_USER_NAME , A.REMOTE_ADDRESS, A.ENTRY_TIMESTAMP from table (SYSTOOLS.AUDIT_JOURNAL_PW(STARTING_TIMESTAMP => current timestamp – 1 days)) A order by A.ENTRY_TIMESTAMP desc
La stratégie est la suivante , la première fois vous demandez la création du fichier de sortie par un create table as() et après vous ajoutez à ce fichier tous les soirs à 23 h 59 les postes PW par un insert
3) Avec la TR (4 pour V7R5 et 10 pour V7R4)
elle vous apporte une solution intégrée pour créer votre DATAMART https://www.ibm.com/support/pages/ibm-i-75-tr4-enhancements Vous avez 2 services
Vous avez une vue qui vous permet de suivre vos mises à jour de datamart
SELECT DATA_MART_LIBRARY, DATA_MART_TABLE, JOURNAL_ENTRY_TYPE, BUILD_END, FAILURE_DETAIL FROM QSYS2.AUDIT_JOURNAL_DATA_MART_INFO WHERE JOURNAL_ENTRY_TYPE = ‘PW’ AND DATA_MART_LIBRARY = ‘MALIB’ ;
Vous pourrez également manager par Navigator for i
Remarque :
Bien sur vous avez toujours aussi un onglet dans Navigator for i qui vous permet de voir sous forme de graphique les résultats , mais attention uniquement sur les postes en cours . Si vous avez déjà une solution, c’est compliqué de revenir dessus, mais si vous n’avez rien ca vous simplifier considérablement les taches. Attention dans tous les cas c’est à vous d’épurer les récepteurs quand vous les avez traité
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2024-05-10 10:08:422024-05-10 15:25:50Manager les informations d’audit avec la TR4
il faut savoir qu’un fichier SAVF est un fichier PF de 528 de long.
Vous pouvez avoir besoin pour différentes raisons de convertir SAVF en PF pour manipuler plus simplement par SQL, pour contourner des restrictions d’utilisations etc ..
Vous trouverez ici 2 commandes qui vont vous permettent de réaliser cette opération : https://github.com/Plberthoin/PLB/tree/master/CPYSAVF
Copier un SAVF dans un PF
Voir le PF
Copier un PF dans un SAVF
Voir le Résultat
Pour voir ce résultat taper la commande DSPSAVF , Voir WRKSAVF si vous avez installez notre outil
Remarque :
Outil simple mais efficace qui peut rendre des services à des administrateurs
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2024-05-03 09:10:562024-05-03 09:10:58Convertir un SAVF en PF
Vous devrez lui indiquer dans la paramètre PGMDTA la commande qualifiée à tracer exemple : ‘STRDBG QSYS’
Les données reçues sont sur le format CHGC0100 qui vous donne le découpage du buffer reçu par votre programme
Vous pouvez faire un programme générique qui va loguer l’utilisation d’une commande, vous pouvez en mettre plusieurs et la prise en compte est immédiate
Il y a plusieurs solutions, la plus simple est sans doute celle la ,vous devrez avoir accès à la console et connaitre un mot de passe sur la console (HSCROOT par exemple)
Il faut savoir que vous pouvez vous connecter à celle ci, même si vous avez un mot de passe désactivé.
A partir d’ACS
Sélectionner Console 5250
Vous devez rentrer un mot de passe de votre HMC, exemple HSCROOT
Vous devez choisir votre partition
et saisir le mot passe même *DISABLED sur la mire d’ouverture
Une fois connecter il suffit de réactiver le profil
==>CHGUSRPRF USRPRF(QSECOFR) STATUS(*ENABLED)
Remarque:
Il est malgré tout conseillé d’avoir un compte de secours que vous dédiez à une reprise derrière une désactivation intempestive.
Par exemple :
SECOURS qui sera dédié à ca avec des droits identiques à QSECOFR et avec un mot de passe gardé au coffre
plus d’informations ici : https://www.ibm.com/support/pages/qsecofr-profile-disabled
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2024-03-27 14:27:542024-03-27 15:40:15Mot de passe QSECOFR désactivé
C’est une bibliothèque qui contient les sources d’environ 15 outils IBMi, le plus connu est NETS qui permet de gérer les partages en mode 5250. Elle est développée par Jim Sloan, ce sont les outils TAATOOLS et depuis la version V3.7 ce sont eux qui gérent les licences.
Donc vous pouvez acquérir une licence du produit en vous adressant ici : support@taatool.com
Vous pouvez également avoir une version des outils sur votre machine : en effet avant la version 3.7 IBM distribuait gratuitement ce produit
Dans ce menu vous avez par exemple l’option 12 qui permet de gérer les utilisateurs désactivés, c’est une alternative simple à Navigator for i dans certains cas.
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