Commit 956814d3 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

- Config : possibilité d'utiliser des noms de colonnes en plus des noms d'attributs Doctrine.

- Suppression des dépendances à unicaen/app en faveur de la nouvelle bibliothèque unicaen/sql.
- Renommage de la table _METADATA en `unicaen_db_anonym`.
- [FIX] Plus d'anonymisation si la valeur est null.
parent 52c6740c
Loading
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
CHANGELOG
=========

3.1.0
-----
- Config : possibilité d'utiliser des noms de colonnes en plus des noms d'attributs Doctrine.
- Suppression des dépendances à unicaen/app en faveur de la nouvelle bibliothèque unicaen/sql.
- Renommage de la table _METADATA en `unicaen_db_anonym`.
- [FIX] Plus d'anonymisation si la valeur est null.

3.0.0
-----
- PHP 8 requis
+26 −19
Original line number Diff line number Diff line
@@ -10,17 +10,19 @@ lors de la préparation d'une bdd de démo par exemple).

Les données fictives utilisées pour anonymiser sont générées à l'aide de [FakerPHP](https://github.com/FakerPHP/Faker).

Les tables et colonnes concernées sont spécifiées dans un fichier de config, en terme de classe d'entité et de champs
Les tables et colonnes à traiter sont spécifiées dans un fichier de config, en terme de classes d'entités et d'attributs
Doctrine. Cf. [exemple de config](./config/unicaen-db-anonym.local.php.dist).

Il est possibles d'écarter de l'anonymisation/restauration certains enregistrements selon la valeur d'un champ 
(cf. clés de config `'except'`).
Il est possibles d'écarter certains enregistrements de ces tables selon la valeur d'une colonne
(cf. clé de config `'except'`).

Seules les valeurs de colonnes non null sont anonymisées.


Préalables
----------

- Une table `_METADATA` munie d'un témoin d'anonymisation est utilisée pour enregistrer le fait que la bdd a été anonymisée
- Une table `unicaen_db_anonym` est utilisée pour enregistrer le fait que la bdd a été anonymisée
ou non. *Cela empêche qu'un script de restauration ne soit généré à partir d'une bdd anonymisée, auquel cas on ne pourrait
pas restaurer les données d'origine !*
Le script de création de cette table dans une bdd Postgres est fourni [ici](./sql/schema.postgres.sql).
@@ -32,12 +34,13 @@ Actions disponibles
### Génération des scripts d'anonymisation/restauration

Le module génére 2 scripts SQL :
- 1 script d'*anonymisation* des données (clé de config `['output']['anonymisation']`) ;
- 1 script de *restauration* des données originales (clé de config `['output']['restauration']`).
- 1 script d'*anonymisation* des données, dont le chemin est spécifié par la clé de config `['output']['anonymisation']`) ;
- 1 script de *restauration* des données originales, dont le chemin est spécifié par la clé de config `['output']['restauration']`).

L'idée est de parcourir tous les enregistrements de chaque entité/table (sauf ceux écartés d'après la config) pour 
générer d'une part un `update ... where id = ...` d'anonymisation inscrit dans le script d'anonymisation 
et d'autre part un `update ... where id = ...` de restauration inscrit dans le script de restauration.
L'idée est de parcourir tous les enregistrements de chaque entité/table (sauf ceux à écarter) et de 
générer pour chacun :
  - d'une part un `update ... set ... where id = ...` d'anonymisation (inscrit dans le script d'anonymisation) ;
  - d'autre part un `update ... set ... where id = ...` de restauration (inscrit dans le script de restauration).

Aperçu d'un script d'anonymisation :
```sql
@@ -59,33 +62,37 @@ update DOCTORANT set INE = '03140E00N22' where id = 30071 ;
update DOCTORANT set INE = '03140E00N33' where id = 30073 ;
```

Commande pour lancer la génération :

```bash
php public/index.php unicaen-db-anonym generer
```

### Lancement de l'anonymisation

Si le script d'anonymisation **et** celui de restauration ont été générés, le module est en mesure d'exécuter le script 
d'anonymisation.
Le module est en mesure d'exécuter le script d'anonymisation à condition que :
  - le témoin d'anonymisation est à '0' dans la table `unicaen_db_anonym`,
  - le script d'anonymisation **et** celui de restauration ont été générés.

```bash
php public/index.php unicaen-db-anonym anonymiser
```

À l'issue de l'anonymisation, le témoin d'anonymisation est mis à '1' dans la table `_METADATA`, ce qui empêchera de
À l'issue de l'anonymisation, le témoin d'anonymisation est mis à '1' dans la table `unicaen_db_anonym`, ce qui empêchera de
lancer inutilement une nouvelle anonymisation mais surtout de regénérer un script de restauration à partir de la bdd
anonymisée.

### Lancement de la restauration

Si le script d'anonymisation **et** celui de restauration ont été générés, le module est en mesure d'exécuter le script
de restauration.
Le module est en mesure d'exécuter le script de restauration à condition que :
  - le témoin d'anonymisation est à '1' dans la table `unicaen_db_anonym`,
  - le script d'anonymisation **et** celui de restauration ont été générés.

```bash
php public/index.php unicaen-db-anonym anonymiser
php public/index.php unicaen-db-anonym restaurer
```

À l'issue de la restauration, le témoin d'anonymisation est mis à '0' dans la table `_METADATA`, ce qui empêchera de
À l'issue de la restauration, le témoin d'anonymisation est mis à '0' dans la table `unicaen_db_anonym`, ce qui empêchera de
lancer inutilement une nouvelle restauration.


@@ -93,6 +100,6 @@ Remarques importantes
---------------------

- Les scripts d'anonymisation/restauration ne visent que les enregistrements qui existaient dans la bdd cible au moment
de leur génération. Si les données de cette bdd évoluent dans le temps (par exemple à l'issue d'un import de données 
périodique ou au fil de l'utilisation de l'appli pointant sur cette bdd), ces scripts n'impacteront pas les nouveaux
enregistrements apparus (au mieux) ou planteront sur les enregistrements disparus (au pire).
de leur génération. Donc si les données de cette bdd évoluent dans le temps (par exemple à l'issue d'un import de données 
périodique ou au fil de l'utilisation de l'appli), ces scripts n'impacteront pas les nouveaux
enregistrements apparus ou planteront sur les enregistrements disparus.
+2 −6
Original line number Diff line number Diff line
@@ -9,7 +9,8 @@
    ],
    "require": {
        "php": "^8.0",
        "unicaen/app": "^6.0",
        "doctrine/orm": "^2.19",
        "unicaen/console": "^6.0",
        "webmozart/assert": "^1.11",
        "fakerphp/faker": "^1.20"
    },
@@ -26,10 +27,5 @@
        "classmap": [
            "./Module.php"
        ]
    },
    "config": {
        "allow-plugins": {
            "laminas/laminas-dependency-plugin": true
        }
    }
}
+8 −2
Original line number Diff line number Diff line
@@ -2,7 +2,6 @@

namespace UnicaenDbAnonym;

use UnicaenAuth\Guard\PrivilegeController;
use UnicaenDbAnonym\Controller\ConsoleController;
use UnicaenDbAnonym\Controller\ConsoleControllerFactory;
use UnicaenDbAnonym\Controller\IndexController;
@@ -13,6 +12,13 @@ use UnicaenDbAnonym\Service\DbService;
use UnicaenDbAnonym\Service\DbServiceFactory;

return [
    'unicaen-db-anonym' => [
        'output' => [
            'anonymisation' => '/tmp/unicaen_db_anonym_anonymisation.sql',
            'restauration' => '/tmp/unicaen_db_anonym_restauration.sql',
        ],
        'entities' => [],
    ],
    'router' => [
        'routes' => [
            'unicaen-db-anonym' => [
@@ -113,7 +119,7 @@ return [
    ],
    'bjyauthorize' => [
        'guards' => [
            PrivilegeController::class => [
            'UnicaenAuth\Guard\PrivilegeController' => [
                [
                    /**
                     * @see ConsoleController::genererAction()
+2 −2
Original line number Diff line number Diff line
--
-- Création si nécessaire de la table des métadonnées de la bdd.
--
create table if not exists _METADATA (
create table if not exists unicaen_db_anonym (
    key varchar(64) not null,
    value text,
    extra text,
    description varchar(128)
);
-- Création du témoin d'anonymisation
insert into _METADATA (key, value, description)
insert into unicaen_db_anonym (key, value, description)
values ('BDD_ANONYMISEE', '0', 'Indique si les données de cette bdd ont été anonymisées (1) ou non (0)');
Loading