MASK SQL
Objectif :
Certaines données sont sensibles et ne devraient être visualisables que par certaines personnes.
Pourtant il est souvent possible d’y accéder avec une simple requête SQL.
Pour palier à cela, il est possible de masquer les données et de les rendre visibles uniquement à des profils ou profils de groupe autorisés en utilisant les MASK SQL.
Le principe est assez simple, il suffit de définir un MASK sur une colonne donnée et de conditionner la visibilité des données selon différents critères.
Pour pouvoir être mis en place, ce process nécessite des droits :
- SECADM
Ou
- QIBM_DB_SECADM
Ainsi que l’activation du RCAC (contrôle d’accès aux colonnes et aux données).
Principe de fonctionnement :
Voici la liste des actions à réaliser pour masquer les données d’un champ d’une table donnée:
- Activer le RCAC (contrôle d’accès aux données) sur la table concernée.
- Créer le MASK sur le champ à masquer en conditionnant la vivibilité du champ
- Activer le MASK
Un masque peut reposer sur un profil, un profil de groupe ou sur le résultat d’une requête (portant sur une table d’autorisation par exemple).
Démonstration, étape par étape :
Voici la table TABLE_EMPLOYES, contenant 3 champs sensibles :
- Le salaire
- Le numéro de téléphone personnel
- L’adresse mail personnelle
1. Activation du RCAC sur la table EMPLOYES :
Vérifier d’abord si le RCAC n’est pas déjà activé sur la table EMPLOYES avec la requête suivante sur QSYS2.SYSTABLES :
SELECT TABLE_NAME,
SYSTEM_TABLE_NAME,
CONTROL
FROM QSYS2.SYSTABLES
WHERE TABLE_SCHEMA = ‘MY_LIBRARY‘
AND TABLE_NAME = ‘TABLE_EMPLOYES‘;
Le champ CONTROL est à blanc, le RCAC n’est pas activé sur la table.
Il faut l’activer avec la requête suivante :
ALTER TABLE MY_LIBRARY.TABLE_EMPLOYES ACTIVATE COLUMN ACCESS CONTROL;
Maintenant la requête :
SELECT TABLE_NAME,
SYSTEM_TABLE_NAME,
CONTROL
FROM QSYS2.SYSTABLES
WHERE TABLE_SCHEMA = ‘MY_LIBRARY‘
AND TABLE_NAME = ‘TABLE_EMPLOYES‘;
retourne le champ CONTROL à « C » le RCAC est maitenant activé sur la table.
2. Création d’un MASK sur la colonne SALAIRE :
Création d’un masque MASK_SALAIRE_EMPLOYES reposant sur le profil utilisateur.
Seul le profil utilisateur ‘MON_PROFIL‘ pour visualiser le contenu du champ SALAIRE.
DROP MASK MY_LIBRARY.MASK_SALAIRE_EMPLOYES;
ON MY_LIBRARY.TABLE_EMPLOYES
FOR COLUMN SALAIRE
RETURN
CASE
WHEN SESSION_USER = ‘MON_PROFIL‘ THEN SALAIRE — Autorisé
ELSE 0 — Non autorisés
END
ENABLE;
Il est possible de désactiver le masque avec la requête suivante :
3. Création d’un MASK sur la colonne TELEPHONE_PERSONNEL :
Création d’un masque MASK_TELEPHONE_EMPLOYES reposant sur un profil de groupe.
Seul les profils appartenant au profil de groupe ‘Profil_Groupe‘ pourront visualiser le contenu du champ TELEPHONE_PERSONNEL.
ON MY_LIBRARY.EMPLOYES
FOR COLUMN TELEPHONE_PERSONNEL
RETURN
CASE
WHEN VERIFY_GROUP_FOR_USER(SESSION_USER, ‘Profil_Groupe‘) = 1
THEN TELEPHONE_PERSONNEL — Autorisé
ELSE 0 — Non autorisés
END
ENABLE;
Les données de la colonne TELEPHONE_PERSONNEL sont bien masquées.
4. Création d’un MASK sur la colonne MAIL_PERSONNEL :
Création d’un masque MASK_MAIL_EMPLOYES reposant sur la table d’autorisation MY_LIBRARY.PROFILS_AUTORISES contenant les données suivantes :
Seul les profils présents dans la table MY_LIBRARY.PROFILS_AUTORISES avec le champ AUTORISATION à ‘O‘ seront autorisés à voir le contenu du champ MAIL_PERSONNEL de la table EMPLOYES.
ON MY_LIBRARY.EMPLOYES
FOR COLUMN MAIL_PERSONNEL
RETURN
CASE
WHEN (SELECT AUTORISATION FROM MY_LIBRARY.PROFILS_AUTORISES
WHERE PROFIL = SESSION_USER) = ‘O’
THEN MAIL_PERSONNEL — Autorisé
ELSE ‘Non autorisé’ — Non autorisés
END
ENABLE;
Les données de la colonne MAIL_PERSONNEL sont bien masquées.
5. Recherche des masques SQL existant :
Pour identifier les masques SQL définis (actif ou non actifs) il suffit de requêter la table QSYS2.SYSCONTROLS comme indiqué ci-dessous :
SELECT RCAC_SCHEMA AS MASQUE_BIBLIOTHEQUE,
RCAC_NAME AS MASQUE_NOM,
TABLE_NAME AS MASQUE_NOM_TABLE,
COLUMN_NAME AS MASQUE_NOM_COLONNE,
ENABLE AS MASQUE_ACTIF, — ‘ Y= Actif / N = Non Actif
CREATE_TIME AS MASQUE_DATE_CREATION,
LAST_ALTERED AS MASQUE_DATE_MAJ
FROM QSYS2.SYSCONTROLS
WHERE TABLE_SCHEMA = ‘MY_LIBRARY’
AND CONTROL_TYPE = ‘M’ — ‘M’ = Colonnes Masque uniquement
ORDER BY TABLE_NAME, COLUMN_NAME;
6. Limites de l’utilisation des masques :
Les colonnes masquées restent utilisables dans les clauses WHERE et les clauses ORDER BY.
Ainsi, si les masques sont très efficaces pour masquer les données telles que les adresses, les noms, les numéros de téléphone; ils restent contournables pour les salaires par exemples.
En effet, même si la colonne SALAIRE est masquée, une requêtre avec un ORDER BY sur le salaire affichera tout de même la liste des employés triée sur leur salaire.
De la même façon, une requête avec une clause WHERE SALAIRE > 1000 AND SALAIRE < 1500 retorunera les employés dont le salaire en compris entre 1000 et 1500 euros…
Il faut bien garder cela à l’esprit…