Commit e240e75d authored by Thibaut Vallee's avatar Thibaut Vallee
Browse files

script d'anonymisation de la bdd

parent 3034ecd4
Loading
Loading
Loading
Loading
Loading
+6 −0
Changes for CHANGELOG.md: 6 added lines, 0 removed lines.
Original line number Diff line number Diff line
1.8.0 (26/10/2026)
------------------
- Commande et structure pour les scripts d'anonymisation de la bdd
- Début de documentation pour l'anonymisation
- Logger symfony avec la progress bar

1.7.0 (24/09/2025)
------------------

+28 −1
Changes for config/module.config.php: 28 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -2,6 +2,14 @@

namespace Unicaen\BddAdmin;

use Application\Provider\Misc\EnvironnementProvider;
use Application\Provider\Roles\RolesProvider;
use Application\Provider\Roles\UserProvider;
use Unicaen\BddAdmin\Anonymisation\AnonymisationManager;
use Unicaen\BddAdmin\Anonymisation\UtilisateurAnonymisationAction;
use Unicaen\BddAdmin\Command\AnonymiserCommand;
use Unicaen\BddAdmin\Tools\FakerFactory;

return [
    'unicaen-bddadmin' => [

@@ -32,6 +40,20 @@ return [
            // array des classes ou services utilisés pour la migration [index => classe ou service, ...]
        ],

        'anonymisation'=> [
            //Liste des environnements qui autorise a l'utiliser. !!! prod ou production serons toujours ignoré
            'required_environnements' => [ "dev", "test", "demo"],
            //Optionnel, liste d'utilisateur (champs username) qui ne seront pas anonymiser
            'ignored_users' => [],
            //Optionnel, liste de roles dont les utilisateurs ne doivent pas être anonymiser
            'ignored_roles' => [],

            //Donner ici la liste des scripts d'annonymisations (dans l'ordre d'execution)
            'scripts' => [
//                'unicaen_utilisateur_user' => UtilisateurAnonymisationAction::class,
            ]
        ],

        'id_column' => 'id',

        'histo' => [
@@ -55,6 +77,7 @@ return [
    'service_manager' => [
        'factories' => [
            Bdd::class                            => BddFactory::class,
            Command\AnonymiserCommand::class =>  Command\AnonymiserCommandFactory::class,
            Command\InstallCommand::class         => Command\CommandFactory::class,
            Command\InstallDemoCommand::class     => Command\CommandFactory::class,
            Command\UpdateCommand::class          => Command\CommandFactory::class,
@@ -68,12 +91,16 @@ return [
            Command\LoadCommand::class            => Command\CommandFactory::class,
            Command\SaveCommand::class            => Command\CommandFactory::class,
            Command\TestMigrationCommand::class   => Command\CommandFactory::class,

            \Faker\Generator::class => \Unicaen\BddAdmin\Tools\FakerFactory::class,
            Anonymisation\AnonymisationManager::class => Anonymisation\AnonymisationManagerFactory::class,
            Anonymisation\UtilisateurAnonymisationAction::class =>  Anonymisation\AbstractAnonymisationActionFactory::class
        ],
    ],


    'laminas-cli' => [
        'commands' => [
            'bddadmin:anonymiser'       => Command\AnonymiserCommand::class,
            'bddadmin:install'          => Command\InstallCommand::class,
            'bddadmin:install-demo'     => Command\InstallDemoCommand::class,
            'bddadmin:update'           => Command\UpdateCommand::class,
+8 −0
Changes for config/unicaen-bddadmin-demo.global.php.dist: 8 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -17,5 +17,13 @@ return [
//                'data/bdd-admin/sources-demo/unicaen_utilisateur_user.php',
            ],
        ],
        'anonymisation'=> [
            //Liste des environnements qui autorise a l'utiliser. !!! prod ou production serons toujours ignoré
            'required_environnements' => [ "dev", "test", "demo"],
            //Optionnel, liste d'utilisateur (champs username) qui ne seront pas anonymiser
            'ignored_users' => ["app"],
                //Optionnel, liste de roles dont les utilisateurs ne doivent pas être anonymiser
            'ignored_roles' => ["Admin_tech"],
        ],
    ],
];
 No newline at end of file

doc/anonymisation.md

0 → 100644
+127 −0
Changes for doc/anonymisation.md: 127 added lines, 0 removed lines.
Original line number Diff line number Diff line
# Anonymisation

Dans le cadre d'une présentation, il est parfois nécessaire de travailler sur des données réelles mais anonymiser.

Le [AnonymisationManager.php](../src/Anonymisation/AnonymisationManager.php) est le système d'anonymisation des données dans BddAdmin.
Son rôle est de lancer les actions d'anonymisation que vous aurez créés et qui devront impérativement implémenter [AnonymisationActionInterface.php](../src/Anonymisation/AnonymisationActionInterface.php)

Les opérations possibles sont les suivantes :
- Accès à la base de données : le MigrationManager vous donne accès à l'objet [Bdd](bdd.md). Vous pourrez donc requêter tout ce que vous voudrez.

> ⚠️ **Attention** : vos actions d'anonymisation sont irréversible. Il est important de ne l'éffectuer que sur une base de données de test et/ou de démo mais jamais en production

Un système de sécurité vérifie que l'on n'exectue pas l'anonymisation dans un environnement de production. Il n'y a cepdant pas de contrôle sur le fait que la base données n'est pas celle de production.
Il est recommandé d'utiliser la commande `copy-from` en amont afin de récuperer des données à jours.

## AnonymisationManager

L'anonymisationManager est accessible depuis l'objet [Bdd](../src/Bdd.php).

Il sert surtout a exectuer successivement des actions d'anonymisations, dont voici un exemple :

```php
namespace App\Anonymisation;

use Exception;

class EtudiantAnonymisationAction extends AnonymisationAction
{
    public function description(): string
    {
        return "Anonymisation des étudiant";
    }

    public function utile(): bool{

        if(!$this->manager()->hasTable('etudiant')){
            return false;
        }

        return $this->manager()->hasColumn('etudiant', 'nom')
            && $this->manager()->hasColumn('etudiant', 'prenom')
    }

    /**
     * @throws \Exception
     */
    public function run(): bool
    {
        $bdd = $this->getBdd();
        $bdd->beginTransaction();
        try{ 
            $sql = "update etudiant set nom = '****', prenom = '****'";
            $bdd->exec($sql);
        }
        catch(Exception $e){
            $bdd->rollbackTransaction();
            throw $e;
        }
        $bdd->commitTransaction();
        return true;
    }

}
```

Notez l'usage de transaction dans le script d'anonymisation afin de garentir une récupérations des données en cas d'echec.
La fonction `utile()` permet de vérifier que les champs que l'on souhaite modifier existe bien dans la version actuelle de la base de données.

L'ensemble des scripts d'anonymisation doivent être définie dans la configuration : 
```
'unicaen-bddadmin' => [
    'anonymisation'=> [
        'scripts' => [
            'etudiant' => App\Anonymisation\EtudiantAnonymisationAction::class,
            'unicaen_utilisateur_user' => Unicaen\BddAdmin\Anonymisation\UtilisateurAnonymisationAction::class,
        ],
    ],
],
```

Le script [UtilisateurAnonymisationAction.php](../src/Anonymisation/UtilisateurAnonymisationAction.php) est le seul script d'anonymisation proposé par défaut. 
Comme l'hanonymisation implique d'effacer les mots de passe et de modifier le username, tout les utilisateurs concerner ne pourrons plus s'authentifier sur l'instance.
Afin de conserver quelques utilisateurs, il est possible de spécifier des cas utilisateurs (ou des rôles) à ignorer par le script :
```
'unicaen-bddadmin' => [
    'anonymisation'=> [
        'ignored_users' => ['app'],
        'ignored_roles' => ['Admin_tech'],
    ],
],
```
### Commande

La commande `bddadmin:anonymiser` permet de lancer l'ensemble des scripts d'anoymisation.
L'option `-s etudiant` permet de ne faire appel qu'un un script précis.

Par sécurité, elle vérifie que la variable d'environnement `APPLICATION_ENV` est bien un environnement autorisant l'anonymisation.
Par défaut, il s'agit des environnement de `dev`, `demo` et `test`. 
Ces environnements sont définie dans la configuration :
```
'unicaen-bddadmin' => [
    'anonymisation'=> [
        'required_environnements' => [ "dev", "test", "demo"],
    ],
],
```

### Fakers

Si vos scripts d'anonymisations hérite de [AnonymisationAction.php](../src/Anonymisation/AnonymisationAction.php), un faker symfony est automatiquement injecter au service.
Vous pouvez l'utiliser pour générer des données aléatoire ie.
```
$lastName = $this->faker->lastName();
$firstName = $this->faker->firstName();
```

A noter que le nombre de nom / prénom aléatoire proposer est relativement limité. Il est fort probable d'avoir des homonymes si vous en génerer beaucoups.

### Utils
La classe [Util.php](../src/Tools/Util.php) fournis 2 fonctions static permettant de formatter des chaîne de caratère:
 - removeAccents(string) : string
 - removeSpeChar(string) : string


### Améliorations futures :

- utiliser le système de sauvegarde de table pour permettre de désanonymiser.
 No newline at end of file
+1 −0
Changes for doc/console.md: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -24,3 +24,4 @@
- **[test-migration](console/test-migration.md)** : Permet de tester le bon fonctionnement des scripts de migration
- **[update-sequences](console/update-sequences.md)** : Met à jour les séquences afin que leur valeur courante ne soit
  pas déjà utilisée
- **[annonymiser](../src/Command/AnonymiserCommand.php)** : Permet d'anonymiser la base de données
Loading