Redigir dados confidenciais em um aplicativo nativo da nuvem
A redação em aplicativos geralmente é feita em mensagens de log e telemetria. Ela também pode ser usada em outros cenários, como a redaçã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 redigir dados em mensagens de log. O pacote Microsoft.Extensions.Compliance.Abstractions
aprimora o registro em log para incluir uma classe Redactor
que redige 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 redigir o endereço IP de um usuário de um evento de telemetria.
A forma mais simples de redação é apagar o valor e retornar uma cadeia de caracteres vazia para uma variável. Esse comportamento ocorre por padrão porque o ErasingRedactor
é o redator de fallback padrão. A Microsoft inclui uma classe HMACSHA256Redactor
que pode ser usada para redigir dados usando uma função de hash. A redação HMAC será útil se você quiser redigir dados, mas ainda assim 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 será útil se você quiser redigir dados usando um algoritmo personalizado.
Por exemplo, você quer deixar mais claro nos logs que um valor foi redigido substituindo-o por *****
.
Como redigir dados em um aplicativo nativo da nuvem
O aplicativo nativo da nuvem da sua organização pode estar gravando 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 em log, você precisará adicionar o serviço de redação a cada um deles.
Há quatro etapas que você precisa executar para habilitar a redação em seu aplicativo:
- Adicione o pacote NuGet
Microsoft.Extensions.Compliance.Redaction
a cada projeto. - Adicione o serviço de redação ao contêiner de injeção de dependência.
- Escolha qual implementação de redação usar para cada tipo de dados classificados.
- 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 é configurado.
No arquivo program.cs, 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 método AddRedactor
pode incluir um parâmetro RedactorOptions
. O parâmetro permite que você especifique 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 dados EUII
.
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));
});
Observação
O algoritmo de refatoração HMAC é experimental, portanto, você precisa desabilitar o aviso do compilador se usá-lo. Cercar o código acima com #pragma warning disable EXTEXP0002
e #pragma warning restore EXTEXP0002
permitiria a você compilar o seu projeto.
Você pode adicionar várias implementações de redação ao parâmetro RedactorOptions
. Por exemplo, o código a seguir adiciona uma refatoração personalizada para dados EUPI
.
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 log
A próxima etapa é habilitar a redação na estrutura de log. Isso é feito definindo a propriedade .EnableRedaction
para o gerador de log de seus 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 agente que usa o serviço de redação. Implemente um novo agente LogOrders
onde você quiser gravar informações de pedido 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 redação personalizada
A Microsoft permite que você crie uma implementação de redação personalizada. Você usará uma redação personalizada quando quiser redigir dados usando o seu próprio algoritmo. Vamos implementar um redator personalizado que substitui dados confidenciais por *****
.
Os redatores personalizados precisam implementar a classe Redactor
personalizada. 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 eShopLite você pode adicionar essa classe ao projeto DataEntities, em Compliance.cs, abaixo do código de classificação de dados.