Politique de sécurité et IBM i


DB2 : gestion des droits

 

Commencons par un peu de théorie :

 

La gestion de la sécurité s'appuie sur la notion de profil utilisateur (objet *USRPRF dans QSYS)

 

Un profil est rattaché à une des Classes d'utilisateur

Chaque classe engendre des droits spéciaux

La gestion des droits par objet est la base de la sécurité sur un IBM i

tout objet possède des droits publics (indiquant les droits par défaut pour un utilisateur "lambda" indiqué par *PUBLIC)
et des droits nominatifs ou privés.

 

les droits sont révisables par EDTOBJAUT en indiquant le type d'objet

F11 permet de voir le détail.


                        Droits sur un objet (EDTOBJAUT)
   Objet  . . . . . . . :   MATABLE         Type d'objet . . . . :   *FILE
         Bibliothèque . . . :     BDVIN          Propriétaire . . . . :   PROPRIO


   
                                                                                       
Objet protégé par la liste d'autorisation . . . . . . . . . .    AUTL1   

                 Droits       ------Objet------     |     ------Données-------
 Utilisat    sur objet  Opér Gest Exist Modif ref  Lect  Ajt  MàJ  Supp Exec
 PROPRIO     *ALL        X    X     X     X    X |   X     X    X    X   X 
   PRFGRP      *CHANGE     X                       |   X     X    X    X     
   PRFUTL      USER DEF    X                       |   X          X          
   *PUBLIC     *USE        X                       |   X                     
   (1)         (2)        !<------ (3) ----->!    !   <------- (4) -------->!        

(1) Utilisateur

  *PUBLIC définit les droits de tous les utilisateurs non spécifiquement désignés 
et ne figurant pas sur la liste d'autorisation protégeant l'objet.

  *GROUP indique le groupe auquel vous appartenez  
(2) Types de droits standards

correspond en fait à un ensemble de droits élémentaires ou USER DEF

*USE : *OBJOPER + *READ|*EXECUTE *CHANGE : *OBJOPER + *READ|*ADD|*UPDATE|*DELETE|*EXECUTE *ALL : *OBJOPER|*OBJMGT|*OBJEXIST|*OBJALTER
+ *READ|*ADD|*UPDATE|*DELETE|*EXECUTE *EXCLUDE:
aucun
(3) Droits sur l'objet

         
     Opér (*OBJOPER)
           Droits d'intervention sur l'objet : Permet d'utiliser un objet
           et de consulter ses attributs dans les limites des droits sur
           les données détenus par l'utilisateur.
    Gest (*OBJMGT)
           Droits sur la gestion des objets : permet de définir le niveau
           de sécurité d'un objet, de le déplacer ou de le rebaptiser.
           Permet également d'ajouter des membres à un objet, si ce dernier
           est un fichier base de données.
     Exist (*OBJEXIST)
           Droits sur l'existence des objets : Permet de contrôler
           l'existence et la propriété d'un objet.
Modif (*OBJALTER)
         Les droits de modification des attributs permettent de modifier les
       attributs d'un objet (par exemple, l'ajout ou le retrait de
       déclenchements [trigger] pour un fichier base de données).
    Réf (*OBJREF)
        Les droits de référence permettent d'indiquer que l'objet constitue
      le premier niveau [parent] d'une contrainte référentielle.

(4) Droits sur les données 

Lect (*READ)
           Droit de lecture : Permet d'accéder au contenu d'un objet.
     Ajt (*ADD)
           Droit d'ajout : Permet d'ajouter des données à un objet.
     MàJ (*UPDATE)
           Droit de mise à jour : Permet de modifier les données d'un objet.
     Sup (*DELETE)
           Droit de suppression : Permet de supprimer les données d'un objet.
     Exécut (*EXECUTE)
           Les droits d'exécution permettent de lancer un programme ou
          d'effectuer une recherche dans une bibliothèque (ou un répertoire).

Ils peuvent aussi être indiqués en syntaxe SQL :

ACCORDER DES DROITS
         I ---ALL------(tous les droits)---I
        I ---ALTER----(*OBJALTER)---------I
       I ---DELETE---(*OBJOPR + *DELETE)-I
GRANT ---I ---INDEX----(*OBJALTER)---------I-------->
        I ---INSERT---(*OBJOPR + *ADD)----I
        I ---SELECT---(*OBJOPR + *READ)---I
        I ---UPDATE---(*OBJOPR + *UPD)----I I--(col1,col2*)----I          I ---REFERENCE(*OBJREF)-----------I

 ----- ON nom(de table ou de vue)------------------->

----- TO -nomprofil------(1 nom de profil)--------->
         I-PUBLIC----I   (*PUBLIC)
-------------------------------------------------.
        I---WITH GRANT AUTORITY(*OBJMGT)---I
 (donne le droit de gérer les droits)

* pour le droit UPDATE on peut restreindre le droit de mise à jour à certaines colonnes

RETIRER DES DROITS
          I ---ALL------(tous les droits)---I
        I ---ALTER----(*OBJALTER)---------I
       I ---DELETE---(*OBJOPR + *DELETE)-I
REVOKE ---I ---INDEX----(*OBJMGT)-----------I-------->
        I ---INSERT---(*OBJOPR + *ADD)----I
        I ---SELECT---(*OBJOPR + *READ)---I
        I ---UPDATE---(*OBJOPR + *UPD)----I          I ---REFERENCE(*OBJREF)-----------I

 ----- ON nom(de table ou de vue)------------------->

----- TO -nomprofil------(1 nom de profil)-------.
         I-PUBLIC----I   (*PUBLIC)

Là encore, vous pouvez utiliser Navigator for i





Row and Column Access Control


Il s'agit de pouvoir indiquer des « droits » à la colonne ou à la ligne qui s'appliquent y compris aux personnes ayant les droits d'administrateur


Ces deux nouvelles options sont accessibles via System i Navigator ou Navigator for i (version Web).

 

•CREATE MASK indique si une colonne est retournée tel que ou totalement/partiellement masquée ('xxx-xxx-xxx-1234' pour un n° de CB)



Sous ACS


Puis



Définition de la table, vue par ACS




Attention vous devez avoir les droits QIBM_DB_SECADM (même QSECOFR !)
sinon vous recevrez SQL0552

 


la restriction étant posée, vous pouvez la modifer, la supprimer et en retrouver le source, toujours par ACS




Les restrictions RCAC s'appliquent dans tous les contextes :

DSPPFM du fichier sous QSECOFR ->


DSPPFM sous le profil CM                ->

 

Bien sûr la valeur retournée doit être compatible avec le type de la colonne (sinon vous recevez SQL0678)

ICI avec la colonne CAV_PRIX qui est numérique

•1er test refusé : la valeur de remplacement est caractère (xxxxxxxxxx)



•2eme test accepté : la valeur de remplacement est 0


Un MASK n'empêche pas les insertions (par contre vous ne retrouvez pas forcement la donnée telle que vous l'avez insérée, mais masquée)

 

Le problème se pose éventuellement lors des mises à jour :

Exemple , le pgm suivant lit et modifie le producteur 1 en RPG ( fichier qui possède un MASK sur PR_TEL)

lors de l'Update RPG, il met à jour la ligne suivant les données qu'il a lui même reçu.

 

Suite à un CALL par CM (c'est QSECOFR qui regarde le contenu de la table) :

 

 

Y compris un Update RPG avec la fonction %fields

 

 

résultat identique

En effet, la 7.2 apporte cette nouvelle clause VIOLATION sur les Check constraint

ON INSERT VIOLATION SET column-name = DEFAULT
 L'erreur n'est pas signalée, la valeur par défaut est insérée

ON UPDATE VIOLATION PRESERVE column-name
 L'erreur n'est pas signalée, la valeur précédente est conservée


Exemple


Vu par ACS



suite à deux INSERT, dont l'un ne renseignant pas la colonne Verifok, nous avons bien les valeurs attendues


select * from VERIF



Mais suite à cet INSERT qui aurait du être refusé


Nous voyons


Enfin, suite à cet UPDATE, lui aussi invalide


Nous voyons toujours


 NB : aucun message dans la LOG pour signaler les "remplacement" de valeur

 

Seul un UPDATE SQL (toujours réalisé par CM) , ne met à jour que certains champs (donc ne touche pas aux autres)
et permet d'éviter la création d'une contrainte.



Résultat :



Enfin, les données sont masquées, juste avant l'affichage, c'est à dire après jointure et GROUP BY


par exemple, le SELECT suivant, qui donne le nombre de clients par indicatif téléphonique



Affiche :




•CREATE PERMISSION indique la(les) règles(s) qui font qu'une ligne peut être vue

Toute ligne ne correspondant pas à la règle n'est pas retournée :

Exemple CM ne doit pas voir l'appellation 13 :

rappelez vous, on indique ce qui peut être vu (une affirmation, donc)

Sous ACS



la restriction étant posée, vous pouvez toujours la modifier, retrouver le source et la supprimer, avec ACS



On aurait aussi pu faire deux permissions

un peu moins performant en temps de réponse...

Puis

Le système ajoute alors une permission implicite QIBM_DEFAULT_nomdetable_schema où la permission est si 0=1, donc toujours fausse.


seules les permissions explicites autorisent des lignes à être vues (en bref tout ce qui n'est pas autorisé est interdit)

 

Avec notre PERMISSION "VINS_ROW_ACCESS":

Une PERMISSION, peut empêcher une insertion ou une mise à jour, qui ne respecte pas la règle

 

Exemple avec APPEL_CODE à 13 (vous recevez SQ20471)

 

Administration :

 • tant que vous n'avez pas activé les droits par ALTER TABLE, les MASK et les PERMISSIONS sont inopérants

 • activer les droits, avant d'avoir défini MASK ou PERMISSION rend l'accès à cette table compliqué (tout est masqué)

Les mêmes paramètres sont proposés sur les assistants de création :

La version 1.3 de Omnifind (5733OMF) est la seule compatible RCAC

Vous trouverez sur les procédures

 

Administration

La mise en place ou le retrait des droits RCAC :

  et des enregistrements dans le journal de la table, de code D, type :

Sinon, pour voir la liste des droits RCAC, regarder SYSCONTROLS et SYSCONTROLSDEP

• SysControls de QSYS2

RCAC_SCHEMA
RCAC_NAME
RCAC_OWNER
TABLE_SCHEMA
TABLE_NAME
TBCORRELATION
COLUMN_NAME
SYSTEM_COLUMN_NAME
SYSTEM_TABLE_NAME
SYSTEM_TABLE_SCHEMA
CONTROL_TYPE
ENFORCED
IMPLICIT
ENABLE
CREATE_TIME
LAST_ALTERED
IASP_NUMBER
LABEL
LONG_COMMENT
RULETEXT.

VARCHAR(128)
VARCHAR(128)
VARCHAR(128)
VARCHAR(128)
VARCHAR(128)
VARCHAR(128)
VARCHAR(128)
CHAR(10)
CHAR(10)
CHAR(10)
CHAR(1) M=Mask | R=Row permission
CHAR(1)
CHAR(1)
CHAR(1)
TIMESTAMP
TIMESTAMP
SMALLINT
VARCHAR(50)
VARCHAR(2000)
DBCLOB -> c'est ici qu'est la règle, en clair.

Par exemple :

SELECT RCAC_NAME , cast(RULETEXT as char(2000) ) FROM QSYS2.SYSCONTROLS
  WHERE RCAC_SCHEMA = 'BDVIN1'


• SYSCONTROLSDEP affiche les éléments dépendants, par exemple :

CREATE TABLE USEROK
(username char(10), appel_code int ) ;
---------------------------------------------------------------------------
-- l'utilisateur CM ne doit voir que les appellations 13 et 144

INSERT INTO USEROK VALUES('CM', 13);
INSERT INTO USEROK VALUES('CM', 144);

CREATE PERMISSION PROD_ROW_ACCESS1 ON producteurs
FOR ROWS
WHERE
appel_code in (select appel_code from USEROK
                        where username = SESSION_USER)
ENFORCED FOR ALL ACCESS
ENABLE ;
---------------------------------------------------------------------------
ALTER TABLE producteurs
ACTIVATE ROW ACCESS CONTROL
ENFORCED FOR ALL ACCESS
ENABLE ;

SyscontrolsDep contient :


• Impact sur les requêtes SQL :


   Autant les masques ne s'appliquent que lors de l'affichage (n'ont donc pas d'impact sur les jointures, par exemple)

  Autant les permissions sont plus déterminantes :

la jointure n'a lieu qu'avec les lignes autorisées.

 

INSERT into cible
(SELECT * from SOURCE)

Commandes système :

 

Enfin attention

Copyright © 2020 VOLUBIS