Technique RGPD : Logger des informations sensibles

Julien Chomarat Photo de Julien Chomarat

Julien Chomarat

RGPD : Logger des informations sensibles

Aujourd'hui, en tant que développeur, avec le RGPD vous devez vous assurer que les informations sensibles dans vos applications soient stockées de manière sécurisée.

Cependant, les logs peuvent elles aussi contenir ce type de données que vous devez protéger et nous allons voir comment faire cela simplement.

Pour ce besoin Serilog peut nous simplifier la vie.

Nous allons imaginer que notre application va logger les données envoyées par l'utilisateur pour un paiement.

On va donc créer une console app et ajouter les packages nuget Serilog et Serilog.Sinks.Console

using Serilog;

// Création du logger
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();

// Les informations envoyées par l'utilisateur
var request = new PaymentRequest
{
    CardHolder = "John Doe",
    CardNumber = "1234 5678 9012 3456",
    CardExpiration = "01/24",
    CardSecurityCode = "123"
};

// On log ici les paramètres
Log.Information("Making payment request {@PaymentRequest}", request);

// Notre ViewModel
public record PaymentRequest
{
    public required string CardHolder { get; init; }
    public required string CardNumber { get; init; }
    public required string CardExpiration { get; init; }
    public required string CardSecurityCode { get; init; }
}

Voici la log affichée quand on exécute le programme :

[10:27:44 INF] Making payment request PaymentRequest {"CardHolder": "John Doe", "CardNumber": "1234 5678 9012 3456", "CardExpiration": "01/24", "CardSecurityCode": "123", "$type": "PaymentRequest"}

Comme vous pouvez le voir, ça n'est pas idéal car toutes les informations de paiement sont en clair.

Pour corriger cela nous allons installer le package nuget Destructurama.Attributed. C'est un projet compagnon de Serilog qui étend son comportement quand on déstructure un objet.

Ensuite nous allons mettre à jour la configuration de Serilog pour qu'il utilise Destructurama :

using Destructurama;
using Destructurama.Attributed;
using Serilog;

// Création du logger
Log.Logger = new LoggerConfiguration()
    // On ajoute le support de Destructurama
	.Destructure.UsingAttributes()
    .WriteTo.Console()
    .CreateLogger();

Enfin on va modifier notre objet PaymentRequest pour qu'il indique à Serilog quoi faire pour chaque champ :

public record PaymentRequest
{
    // LogMasked va remplacer le nom par ***
    [LogMasked]
    public required string CardHolder { get; init; }

	// Ici on demande uniquement à afficher les 3 derniers chiffres
	// et masquer tout le reste avec des *
    [LogMasked(ShowLast = 3, PreserveLength = true)]
    public required string CardNumber { get; init; }

	// Ici on remplace tous les caractéres par *
	// en conservant la taille de la chaine d'origine
    [LogMasked(PreserveLength = true)]
    public required string CardExpiration { get; init; }

    [LogMasked(PreserveLength = true)]
    public required string CardSecurityCode { get; init; }
}

Si on relance notre projet voici la log avec les informations sensibles masquées.

[10:32:53 INF] Making payment request {"CardHolder": "***", "CardNumber": "****************456", "CardExpiration": "*****", "CardSecurityCode": "***", "$type": "PaymentRequest"}

Vous pouvez maintenant logger les informations sensibles envoyées dans les formulaires de vos applications simplement.

Pour en savoir plus sur les options offertes par ce projet : https://github.com/destructurama/attributed

Tags : C# RGPD