Redigir dados confidenciais em um aplicativo nativo da nuvem
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 pacote Microsoft.Extensions.Compliance.Abstractions melhora o registo 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 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 ErasingRedactor é redator de fallback padrão. A Microsoft inclui uma classe HMACSHA256Redactor que pode ser usada para editar dados usando uma função de hash. A ocultação HMAC é útil se quiser mascarar dados, mas ainda conseguir correlacionar mensagens de log em várias entradas 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
A aplicação nativa da nuvem da sua organização pode estar a escrever logs e a criar telemetria em múltiplos 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:
- Adicione o pacote NuGet
Microsoft.Extensions.Compliance.Redactiona cada projeto. - Adicione o serviço de redação de texto ao container 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 está 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 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 os 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 do redator HMAC é experimental, então você precisa desativar o aviso do compilador se usá-lo. Cercar 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 parâmetro RedactorOptions. Por exemplo, o código a seguir adiciona uma função de redaçã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 registro em log
A próxima etapa é habilitar a redação na estrutura de log. Isso é feito definindo a propriedade .EnableRedaction 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 registrador de LogOrders 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 por *****.
Os redatores personalizados precisam implementar a classe Redactor. 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.