Redigir dados confidenciais em um aplicativo nativo da nuvem

Concluído

A redação dentro de aplicativos é mais comumente feita em mensagens de log e telemetria. Ele também pode ser usado em outros cenários, como edição de dimensões em métricas ou dados de cabeçalho em middleware.

A estrutura de log do .NET fornece uma maneira simples de editar dados em mensagens de log. O Microsoft.Extensions.Compliance.Abstractions pacote aprimora o registro em log para incluir uma Redactor classe que edita dados.

O que é redação?

A redação é o processo de remoção de informações confidenciais de uma mensagem. Por exemplo, talvez você queira redigir o nome de um usuário de uma mensagem de log. Ou talvez você queira editar o endereço IP de um usuário a partir de um evento de telemetria.

A redação mais simples é apagar o valor e retornar uma cadeia de caracteres vazia para uma variável. Esse comportamento acontece por padrão porque o é o ErasingRedactor redator de fallback padrão. A Microsoft inclui uma classe que pode ser usada para redigir dados usando uma HMACSHA256Redactor função de hash. A redação do HMAC é útil se você quiser editar dados, mas ainda ser capaz de correlacionar mensagens de log em várias instruções de log. A última opção é fornecer sua própria função de redação, que é útil se você quiser editar dados usando um algoritmo personalizado.

Por exemplo, você deseja deixar mais claro nos logs que um valor é editado substituindo-o por *****.

Como redigir dados em um aplicativo nativo da nuvem

O aplicativo nativo da nuvem de suas organizações pode estar escrevendo logs e criando telemetria em vários projetos. Por exemplo, ele pode estar gravando logs do serviço de banco de dados, do aplicativo Web ou de qualquer outra API que ele usa. Dependendo do tipo de registro, você precisará adicionar o serviço de redação a cada um.

Há quatro etapas que você precisa seguir para habilitar a redação em seu aplicativo:

  1. Adicione o Microsoft.Extensions.Compliance.Redaction pacote NuGet a cada projeto.
  2. Adicione o serviço de redação ao contêiner de injeção de dependência.
  3. Escolha qual implementação de redação usar para cada tipo de dados classificados.
  4. Habilite a redação na estrutura de log.

Adicionar o serviço de redação ao contêiner de injeção de dependência

O exemplo a seguir é para um aplicativo Blazor WebAssembly. O processo é semelhante para outros tipos de aplicativos, mas o código é ligeiramente diferente, dependendo de como o contêiner de injeção de dependência está configurado.

No arquivo .cs programa, adicione as seguintes dependências:

using Microsoft.Extensions.Compliance.Classification;
using Microsoft.Extensions.Compliance.Redaction;

Os pacotes acima permitem que você adicione o serviço de redação ao contêiner de injeção de dependência com este código:

builder.Services.AddRedaction();

Escolha qual implementação de redação usar para cada tipo de dados classificados

O AddRedactor método pode incluir um RedactorOptions parâmetro. O parâmetro permite especificar qual implementação de redação usar para cada taxonomia de dados.

Por exemplo, o código a seguir especifica que o HMACSHA256Redactor deve ser usado para EUII dados.

builder.Services.AddRedaction(configure =>
{
    // Configure to use the HMAC redactor
    configure.SetHmacRedactor(configureHmac =>
    {
        // This key should be fetched from keyvault or some other secure store.
        configureHmac.Key = "thisisadummykeythatshouldbereplacedwithakeyfromakeystore";
        // Some discriminator to differentiate between different deployments of a service.
        configureHmac.KeyId = 1;

    }, new DataClassificationSet(DataClassifications.EUIIDataClassification));
});

Nota

O algoritmo do redator HMAC é experimental, então você precisa desativar o aviso do compilador se usá-lo. Cercando o código acima com #pragma warning disable EXTEXP0002 e #pragma warning restore EXTEXP0002 permitiria que você compilasse seu projeto.

Você pode adicionar várias implementações de edição ao RedactorOptions parâmetro. Por exemplo, o código a seguir adiciona um redator personalizado para EUPI dados.

builder.Services.AddRedaction(configure =>
{
    // Configure to use the HMAC redactor for EUII data
    configure.SetHmacRedactor(configureHmac =>
    {
        // This key should be fetched from keyvault or some other secure store.
        configureHmac.Key = "thisisadummykeythatshouldbereplacedwithakeyfromakeystore";
        // Some discriminator to differentiate between different deployments of a service.
        configureHmac.KeyId = 1;

    }, new DataClassificationSet(DataClassifications.EUIIDataClassification));

    // Configure a custom redactor for EUPI data
    configure.SetRedactor<EShopCustomRedactor>(new DataClassificationSet(DataClassifications.EUPIDataClassification));
});

Habilitar a redação na estrutura de registro em log

A próxima etapa é habilitar a redação na estrutura de log. Isso é feito definindo a .EnableRedaction propriedade para seu gerador de log de aplicativos. Para o aplicativo de exemplo, o código é:

builder.Services.AddLogging(logging => 
{
    logging.EnableRedaction();
    logging.AddJsonConsole(); //Enable structure logs on the console to view the redacted data.
});

Com o código acima em vigor, você pode criar um novo registrador que usa o serviço de redação. Implemente um novo LogOrders registrador onde quiser gravar informações de pedidos nos logs.

public static partial class Log
{
    [LoggerMessage(1, LogLevel.Information, "Write the Order data formatted as JSON: {order}")]
    public static partial void LogOrders(this ILogger logger, [LogProperties] Order order);
}

Criar uma implementação de edição personalizada

A Microsoft permite que você crie uma implementação de edição personalizada. Você usará uma redação personalizada quando quiser editar dados usando seu próprio algoritmo. Vamos implementar um redator personalizado que substitua dados confidenciais pelo *****.

Os redatores personalizados precisam implementar a Redactor classe. A classe precisa de dois métodos implementados:

public class EShopCustomRedactor : Redactor
{
    private const string Stars = "*****";

    public override int GetRedactedLength(ReadOnlySpan<char> input) => Stars.Length;

    public override int Redact(ReadOnlySpan<char> source, Span<char> destination)
    {
        Stars.CopyTo(destination);
        return Stars.Length;
    }
}

Em nossa arquitetura de exemplo, você pode adicionar essa classe ao projeto DataEntities, em Compliance.cs abaixo do código de classificação de eShopLite dados.