Pause-Café Volubis

pause-café

rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 fois par an : en Bretagne et sur internet.

Pause-café #77

Janvier 2018
le 9 Janvier à la roche Bernard (le Sarah B.) , le 11 par Internet

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



  • 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)


    • 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%')) ;
      Très peu d'utilisateurs ont besoin de *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


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"]

      Exemple

      options -------

      •ABSENT on NULL (dft)
      •NULL on NULL

      •RETURNING CLOB(2G) CCSID 1208 FORMAT JSON (dft)
      •RETURNING CHAR/VARCHAR...ENCODING UTF-8 | UTF16 •RETURNING BLOB
      SELECT 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"}
      Exemple

      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
      • 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


    • 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)





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

  • 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")

    • 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


    • 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)
  • 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.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 :

    1. il faut QDEVTOOLS dans votre liste de bibliothèques
    2. 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
    • 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 RDI

    dans 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é

Copyright © 1995,2018 VOLUBIS