 
                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)
 
 
 Très peu d'utilisateurs ont besoin de *ALLOBJ-- 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)
 ExempleD11 ["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)
 
 ExempleD11 {"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'outilsen 9.5 Diffé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é
 
 
