pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #77
GDPR
GDPR,
le sujet d'actualité...
Pour masquer vos données vous avez un certain nombre de techniques offertes par DB2
- Fonctions SQL de cryptage (ENCRYPT_RC2, ENCRYPT_TDES, ENCRYPT_AES)
- FIELDPROC ( Pause-Café 56, Septembre 2010)
Vous pouvez associer à une colonne d'une table un pgm (à vous, à écrire) chargé de crypter/décrypter la donnée
- RCAC ( Pause-Café 68, Novembre 2014)
Vous pouvez associer :- à une colonne d'une table, un masque (une règle) indiquant qui peut voir la colonne
- en clair
- partiellement
- pas du tout
- à une table, une permission indiquant quelles lignes un utilisateur peut voir.
Exemple de mise en place
CREATE OR REPLACE TABLE prospects.gdprUSER
(username char(10), INFO_AUT CHAR(1) ) ;- CREATE OR REPLACE MASK Prospects.GDPR_MASK1 ON prospects.prospect FOR COLUMN tel RETURN
CASE
WHEN SESSION_USER = (SELECT username
FROM prospects.gdprUSER
WHERE username = SESSION_USER AND
(INFO_AUT = 'T' OR INFO_AUT = '2'))
THEN TEL
ELSE LEFT(TEL, 2) concat 'xxxxxxxx'
END
ENABLE ; - CREATE OR REPLACE MASK Prospects.GDPR_MASK2 ON prospects.prospect FOR COLUMN email RETURN
CASE
WHEN SESSION_USER = (SELECT username
FROM prospects.gdprUSER U
WHERE username = SESSION_USER AND
(INFO_AUT = 'M' OR INFO_AUT = '2'))
THEN EMAIL
ELSE '-' concat substr(email , position('@' in EMAIL))
END ENABLE ;
- ALTER TABLE prospects.prospect
ACTIVATE COLUMN ACCESS CONTROL;
- Commit;
fichier gdprUSER vide :
Mail autorisé
Mail ET téléphone
- CREATE OR REPLACE MASK Prospects.GDPR_MASK1 ON prospects.prospect FOR COLUMN tel RETURN
- à une colonne d'une table, un masque (une règle) indiquant qui peut voir la colonne
- les Tables temporelles (Pause-Café 73 , Mai 2016)
sont un moyen d'avoir une trace de toutes les modifications effectuées sur les données sensibles
(un peu comme la fonction journal, mais sur des tables ciblées et plus facile à exploiter)
- Ces trois derniers thèmes, sont souvent (et brillamment) évoqués par de nombreux fournisseurs.
- Nous tenions plutôt à vous rappeler des fondamentaux !
- La CNIL indique (https://www.cnil.fr/sites/default/files/typo/document/Guide_securite-VD.pdf )
Fiche n° 2 – L’authentification des utilisateurs
le responsable d’un système informatique doit être en mesure d’assurer que
chaque utilisateur du système n’accède qu’aux données dont il a besoin pour
l’exercice de sa mission.
Aïe ! la gestion des droits
- Faites la chasse aux tables ayant les droits *PUBLIC à *ALL (et oui, je l'ai vu)
- ET méfiez vous de QCRTAUT ou de CRTAUT au niveau bibliothèque
(Nouveaux objets = droits par défaut des objets à venir)
- ET méfiez vous de QCRTAUT ou de CRTAUT au niveau bibliothèque
- mais, personnellement, ma bête noire c'est : les utilisateurs avec *ALLOBJ
Par curiosité, passez donc ces requêtes (SQL as a service)
-- liste des profils non IBM avec *ALLOBJ
Select * from qsys2.user_info
where authorization_name not like 'Q%' and special_authorities like '%ALLOBJ%';--liste des travaux utilisant un profil non IBM avec *ALLOBJ
Select a.* from table (qsys2.active_job_info() ) as a join qsys2.user_info as U using(authorization_name)
where authorization_name not like 'Q%' and special_authorities like '%ALLOBJ%';-- Which users have *ALLOBJ authority either directly or via a Group or Supplemental profile? (exemple IBM)
SELECT * FROM QSYS2.USER_INFO
WHERE SPECIAL_AUTHORITIES LIKE '%*ALLOBJ%'
OR AUTHORIZATION_NAME IN (SELECT USER_PROFILE_NAME FROM QSYS2.GROUP_PROFILE_ENTRIES
WHERE GROUP_PROFILE_NAME IN (SELECT AUTHORIZATION_NAME FROM QSYS2.USER_INFO
WHERE SPECIAL_AUTHORITIES LIKE '%*ALLOBJ%')) ; - pour connaître les besoins réels STRAUTCOL (Pause Café 73)
- les programmes en "owner" sont la solution (ils adoptent les droits du propriétaire)
- pour les administrateurs voyez nos utilitaires su et sudo : https://github.com/FrenchIBMi/Clubs
- Si vous avez des terminaux IP, voyez notre utilitaire de mise en veille d'une session 5250
- SI vous n'arrivez pas à faire baisser les droits, au moins limitez les fonctions par Administration d'applications
...Pour cela, chaque utilisateur doit être doté d’un identifiant qui lui est propre
et doit s’authentifier avant toute utilisation des moyens informatiques.
Dans le cas d’une authentification des utilisateurs basée sur des mots de
passe, leur mise en oeuvre doit respecter les règles suivantes :
- avoir une taille de 8 caractères minimum ;
- utiliser des caractères de types différents (majuscules, minuscules,
chiffres, caractères spéciaux). Des moyens mnémotechniques permettent
de créer des mots de passe complexe, par exemple
- en ne conservant que les premières lettres des mots d’une phrase ;
- en mettant une majuscule si le mot est un nom (ex : Chef) ;
- en gardant des signes de ponctuation (ex : ’) ;
- en exprimant les nombres à l’aide des chiffres de 0 à 9 (ex : Un ->1) ;
Conclusion, modifiez QPWDLVL à 2/3 !
revoyez QPWDRULE
Pour la mise en place
•Passez la commande DSPAUTUSR + F11 et vérifiez que les utilisateurs avec mot de passe ont *YES dans la colonne
"Mot de passe Niv. 2 ou 3"
•Ayez une sauvegarde système récente (de toutes façons !)
•Modifiez QPWDLVL et faites un IPL.
Les meilleurs mots de passe sont ceux qui ne circulent pas -> SSO (cf EIM)
A défaut, ceux qu'on ne voit pas passer en clair -> SSL
- La CNIL indique (https://www.cnil.fr/sites/default/files/typo/document/Guide_securite-VD.pdf )
Version 7.3 / TR3
7.3, TR3 (la plupart des fonctions sont communes à la TR7 de la 7.2)
- DB2
- Publier du JSON
VALUES(JSON_ARRAY((SELECT DEPTNO FROM DEPT
WHERE DEPTNAME LIKE 'BRANCH OFFICE%')));
--Produit un tableau de valeur (rappel entre [ et ] )
==> ["F22","G22","H22","I22","J22"]
SELECT JSON_OBJECT('Nom' : LASTNAME,
'date naissance' : HIREDATE,
'Salaire' SALARY) FROM EMPLOYEE WHERE EMPNO = '000020';
--produit un objet JSON, chaque élément à un nom et une valeur
==> {"Nom":"THOMPSON","date naissance":"1973-10-10","Salaire":41250.00}
SELECT workdept, JSON_ARRAYAGG(lastname)
FROM EMPLOYEE WHERE workdept LIKE 'D%'
GROUP BY workdept;
--produit un tableau de valeurs par groupe (GROUP BY)D11
["STERN","ADAMSON","PIANKA","YOSHIMURA","SCOUTTEN","WALKER","BROWN","JONES","LUTZ","YAMAMOTO","JOHN"]
D21
["PULASKI","JEFFERSON","MARINO","SMITH","JOHNSON","PEREZ","MONTEVERDE"]
options -------
•ABSENT on NULL (dft)
•NULL on NULL
•RETURNING CLOB(2G) CCSID 1208 FORMAT JSON (dft)
•RETURNING CHAR/VARCHAR...ENCODING UTF-8 | UTF16 •RETURNING BLOBSELECT JSON_OBJECTAGG(workdept, JSON_OBJECTAGG(char(empno) value lastname)
FROM EMPLOYEE WHERE workdept LIKE 'D%'
GROUP BY workdept;
--produit une série d'objets JSON (clé/valeur) pour un groupe (GROUP BY)
D11 {"000060":"STERN","000150":"ADAMSON","000160":"PIANKA","000170":"YOSHIMURA",
"000180":"SCOUTTEN","000190":"WALKER","000200":"BROWN","000210":"JONES",
"000220":"LUTZ","200170":"YAMAMOTO","200220":"JOHN"}D21 {"000070":"PULASKI","000230":"JEFFERSON","000240":"MARINO","000250":"SMITH",
"000260":"JOHNSON","000270":"PEREZ","200240":"MONTEVERDE"}
options -------
•NULL on NULL (dft)
•ABSENT on NULL
•RETURNING CLOB(2G) CCSID 1208 FORMAT JSON (dft)
•RETURNING CHAR/VARCHAR...ENCODING UTF-8 | UTF16
•RETURNING BLOB - Lire du JSON
- JSON_VALUE retourne une valeur scalaire (unitaire)
- (options)
- WITHOUT ARRAY WRAPPER
faire référence à une donnée non unitaire génère une erreur
- WITH UNCONDITIONAL ARRAY WRAPPER
le résultat est encadré de [ et de ]
- WITH CONDITIONAL ARRAY WRAPPER
le résultat est encadré entre [ et ] en cas de valeurs multiples
- KEEP QUOTES : conservé les "
- OMIT QUOTES : ne pas les conserver , With Array Wrapper, ne peut pas être indiqué.
- NULL ON EMPTY
retourne valeur nulle sur un élément manquant
- ERROR ON EMPTY
retourne une erreur sur un élément manquant
- DEFAULT <une-valeur> ON EMPTY
retourne une valeur par défaut sur un élément manquant
- ERROR ON ERROR
retourne une erreur en cas d'erreur (SQL16410)
- DEFAULT <une-valeur> ON ERROR
retourne une valeur par défaut suite à une erreur
- WITHOUT ARRAY WRAPPER
- JSON_QUERY retourne une chaîne au format JSON
- (options)
- NULL ON EMPTY
- ERROR ON EMPTY
- DEFAULT <une-valeur> ON EMPTY
- ERROR ON ERROR
- DEFAULT <une-valeur> ON ERROR
- NULL ON EMPTY
- JSON_VALUE retourne une valeur scalaire (unitaire)
- LIMIT et OFFSET : support étendu
- Accepté dans les SELECT imbriqués
- Accepté dans les vues (select imbriqués uniquement)
- Accepté sur le 5250 (la requête est entièrement ré-exécutée)
- LIMIT et OFFSET peuvent être le résultat d'une expression
- LIMIT accepté sur DELETE et UPDATE
-- supprimer les 10 plus anciennes commandes
DELETE FROM Commandes where nocli = 45 order by DATCMD LIMIT 10
Exemple
- Nouveaux services
- JOBQ_INFO liste les JOBQ, leur attachement (sous-système)
- STACK_INFO, affiche la liste d'invocation d'un job (* = le job en cours)
- ASP_INFO donne des informations sur les ASP (fonctionne avec l'ASP système)
- ASP_VARY_INFO donne l'état des ASP indépendants
Ces services sont proposés dans la dernière mise à jour d' ACS (1.1.7.2)
- HISTORY_LOG_INFO (DSPLOG) et DISPLAY_JOURNAL (QAUDJRN uniquement) fournissent des informations au format SYSLOG (Unix)
- JOBQ_INFO liste les JOBQ, leur attachement (sous-système)
- Publier du JSON
Détail de "Event" dans le cas du journal d'AUDIT
Voir notre cours sur PASE pour le démon syslogd
- Nouvelles options de gestion des droits sur la bibliothèque
- GRANT CREATEIN on schema BIB1 to USER1 : droit de création d'objets => *OBJOPR + *READ + *ADD + *EXECUTE
- GRANT USAGE on schema BIB1 to USER2 : droit d'utilisation => *USE
- GRANT ALL on schema BIB1 to USER3 => les deux
- même chose sur REVOKE...
- RPG
- Nouvelle fonction %proc donne le nom :
- du module (pgm) en cours
- ou de la procédure en cours
vous remarquerez que RDI 9.5 ne reconnaît pas ces notions , il faudra attendre RDI 9.6
- %ELEM et %SIZE acceptent les DS complexes avec ou sans indice
Avant
Maintenant (en plus)
- RESET et DEALLOC admettent aussi les DS complexes
- Nouvelle fonction %proc donne le nom :
- ACS (version 1.1.7.2 )
- Une nouvelle options SSH permet de lancer un shell
- avec Putty ou Cygwin (si ces derniers sont installés)
- un terminal sous MAC/Linux
- Vous pouvez préciser dans AcsConfig.properties
com.ibm.iaccess.PreferredSSHClient=iterm2 (par exemple) com.ibm.iaccess.SSHClientOpts=-x (pour éviter le message "X11 forwarding....failed")
- avec Putty ou Cygwin (si ces derniers sont installés)
- Vous trouverez une nouvelle option de maintenance de la base de données
Affichant- Les contraintes en instance de vérification
- les index en cours de (re)construction
- les Alter Table en cours
- les RGZPFM en cours
- Les constructions d'index Omnifind en cours (si le produit est installé)
- l'accès à la commande CHGQRYA est disponible
- depuis Schémas
- depuis le gestionnaire de scripts SQL
- Accès aux paramètres
- Visualisation du contenu de QAQQINI
- depuis Schémas
- la plupart des informations sont désormais affichées en Français
(attention pour cette fenêtre, il y a un correctif disponible)
- Les nouveaux services (TR3) sont proposés dans les exemples
- Divers
- le nombre de capture d'écrans n'est plus limité
- la saisie des dates et heures pour filtrer les spools affichés est en format local (Français pour nous)
- possibilité de vérifier la version en mode commande (/PLUGIN=checkupdates)
- Une nouvelle options SSH permet de lancer un shell
- RDI 9.6
-
1/ Installation
Le plus simple est de faire une "Web install"
Mettez à jour IBM Installation manager, si besoin.
Puis, toujours dans Installation Manager, ajoutez un référentiel (Fichier/préférences)
ajoutez https://www.ibm.com/software/repositorymanager/com.ibm.rational.developer.ibmi.v96
Lors de la vérification il faudra vous authentifier avec votre ID IBM
et voilà
Ensuite cliquez sur installer
2/ Nouveautés
les variables déclarées, non utilisées (qui provoquent RNF7031 à la compilation) sont signalées
Cette indication disparaît, dès que la variable apparaît dans le code
Ce comportement peut s'enlever ici (Fenêtre/préférences)•Notez aussi que les indicateurs nommés peuvent apparaître en tant que zones
•la touche Enter fractionne la ligne source (comme Alt+S, qui d'ailleurs fonctionne avec le CL désormais)
•La touche tabulation décale le code (Maj+Tab décale vers la gauche)
•La nouvelle fonction intégrée %PROC est reconnue
•L'option de comparaison de source (existante déjà en versions précédentes)
Fenêtre des différences
elle ne contenait que ces options dans la barre d'outils en 9.5Différence suivante/précédente Modification suivante/précédente Elle propose désormais ces options
Inverser les fenêtres gauche et droite Insérer la différence de gauche vers droite Insérer la différence de droite vers gauche Insérer toutes les différences de gauche vers droite Insérer toutes les différences de droite vers gauche
A la sortie de la fenêtre, on vous propose la sauvegarde de chaque source
•Sous mac toujours pas de vérification de syntaxe (Ctrl+Maj+V) donc de diagramme d'application
mais les invites (F4) des spécifs RPG ou DDS sont mieux gérées (colonnes plus larges)•Cette version d'Eclipse, possède un éditeur JSON
- La grosse nouveauté est la couverture de code en ligne de commande
Installez SI65229 + SI64670 (7.3) ou SISI65228 + SI64561(7.2) (voir Developer Work)
Attention, pour l'instant :
- il faut QDEVTOOLS dans votre liste de bibliothèques
- il faut une bibliothèque portant votre nom de user (pourquoi ?) , qui va recevoir un fichier intermédiaire nommé CODECOV
- CMD
- Commande à lancer (n'importe quelle commande, CALL compris bien sûr)
- MODULE
- Accepte les types
- *PGM
- *SRVPGM
- supporte des entrées multiples
- Accepte les types
- CCVIEW
- *SOURCE -> le source : implique DBGVIEW(*SOURCE)
- *LIST -> la liste de compilation : implique DBGVIEW(*LIST) ou implique DBGVIEW(*ALL)
- *DFT : suivant la compilation *LIST si DBGVIEW(*LIST) *SOURCE sinon
- CCLVL
- *LINE -> niveau ligne (on note les lignes sur lesquelles vous êtes passées)
- *PROC -> niveau procédure (on note les procédure uniquement)
- OUTDIR / OUTSTMF
- paramètre mutuellement exclusifs
- OUTDIR : indiqué un répertoire
- le fichier sera nommé nomDuPgm_timestamp.cczip
- OUTSTMF : indiquez un nom complet de fichier
- avec extension : .cczip obligatoire !
- sans extension : .cczip sera ajouté
le fichier généré (notez l'extension .cczip)
C'est en fait un fichier .zip contenant le(s) source(s) et des statistiques (ccdata) sur la couverture de code
Pour le lire, il faut RDIdans la vue Résultat de couverture de code (Fenêtre/Afficher la vue, pour faire apparaître une vue)
, utilisez le +
Système distant
Indiquez votre connexion, le bon dossier...
Validez
Réactualisez la fenêtre
Double clic sur la ligne affiche les modules (l'affichage en HTML ou PDF, n'est pas encore disponible)
Double clic sur le nom du module, affiche le source.
- En vert les lignes sur lesquelles vous êtes passé lors de votre test.
- En rouge les lignes sur lesquelles vous n'êtes pas passé