Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'oscuramento aiuta a ripulire o mascherare le informazioni sensibili nei log, nei messaggi di errore o in altri output. In questo modo è possibile rispettare le regole di privacy e proteggere i dati sensibili. È utile nelle app che gestiscono dati personali, informazioni finanziarie o altri punti dati riservati.
Installare il pacchetto di redazione
Per iniziare, installare il 📦 pacchetto NuGet Microsoft.Extensions.Compliance.Redaction :
dotnet add package Microsoft.Extensions.Compliance.Redaction
Oppure, se stai utilizzando il SDK di .NET 10+
dotnet package add Microsoft.Extensions.Compliance.Redaction
I redattori disponibili
I redactor sono responsabili dell'azione di redattazione dei dati sensibili. Restituiscono, sostituiscono o mascherano le informazioni riservate. Considera i seguenti redattori disponibili forniti dalla libreria.
- ErasingRedactor Sostituisce qualsiasi input con una stringa vuota.
- Usa HmacRedactor
HMACSHA256
per codificare i dati da redigire.
Esempio di utilizzo
Per usare i redactor predefiniti, è necessario registrare i servizi necessari. Registrare i servizi usando uno dei metodi disponibili AddRedaction
come descritto nell'elenco seguente:
- AddRedaction(IServiceCollection): registra un'implementazione di IRedactorProvider in IServiceCollection.
-
AddRedaction(IServiceCollection, Action<IRedactionBuilder>): registra un'implementazione di IRedactorProvider in IServiceCollection e configura i redactor disponibili con il delegato specificato
configure
.
Configurare un redactor
Recuperare i redattori in fase di esecuzione usando un oggetto IRedactorProvider. È possibile implementare il proprio provider e registrarlo all'interno della AddRedaction
chiamata oppure usare il provider predefinito. Configurare i redattori usando questi IRedactionBuilder metodi:
// This will use the default redactor, which is the ErasingRedactor
var serviceCollection = new ServiceCollection();
serviceCollection.AddRedaction();
// Using the default redactor provider:
serviceCollection.AddRedaction(redactionBuilder =>
{
// Assign a redactor to use for a set of data classifications.
redactionBuilder.SetRedactor<StarRedactor>(
MyTaxonomyClassifications.Private,
MyTaxonomyClassifications.Personal);
// Assign a fallback redactor to use when processing classified data for which no specific redactor has been registered.
// The `ErasingRedactor` is the default fallback redactor. If no redactor is configured for a data classification then the data will be erased.
redactionBuilder.SetFallbackRedactor<MyFallbackRedactor>();
});
// Using a custom redactor provider:
builder.Services.AddSingleton<IRedactorProvider, StarRedactorProvider>();
Dato questa classificazione dei dati nel codice:
public static class MyTaxonomyClassifications
{
public static string Name => "MyTaxonomy";
public static DataClassification Private => new(Name, nameof(Private));
public static DataClassification Public => new(Name, nameof(Public));
public static DataClassification Personal => new(Name, nameof(Personal));
}
Configurare il redattore HMAC
Configurare redattore HMAC usando questi IRedactionBuilder metodi:
var serviceCollection = new ServiceCollection();
serviceCollection.AddRedaction(builder =>
{
builder.SetHmacRedactor(
options =>
{
options.KeyId = 1234567890;
options.Key = Convert.ToBase64String("1234567890abcdefghijklmnopqrstuvwxyz");
},
// Any data tagged with Personal or Private attributes will be redacted by the Hmac redactor.
MyTaxonomyClassifications.Personal, MyTaxonomyClassifications.Private,
// "DataClassificationSet" lets you compose multiple data classifications:
// For example, here the Hmac redactor will be used for data tagged
// with BOTH Personal and Private (but not one without the other).
new DataClassificationSet(MyTaxonomyClassifications.Personal,
MyTaxonomyClassifications.Private));
});
In alternativa, configurarlo in questo modo:
var serviceCollection = new ServiceCollection();
serviceCollection.AddRedaction(builder =>
{
builder.SetHmacRedactor(
Configuration.GetSection("HmacRedactorOptions"), MyTaxonomyClassifications.Personal);
});
Includere questa sezione nel file di configurazione JSON:
{
"HmacRedactorOptions": {
"KeyId": 1234567890,
"Key": "1234567890abcdefghijklmnopqrstuvwxyz"
}
}
- L'oggetto HmacRedactorOptions richiede che le proprietà HmacRedactorOptions.Key e HmacRedactorOptions.KeyId siano impostate.
- Deve
Key
essere in formato base 64 e almeno 44 caratteri. Usare una chiave distinta per ogni distribuzione principale di un servizio. Mantenere segreto il materiale chiave e ruotarlo regolarmente. - L'oggetto
KeyId
viene aggiunto a ogni valore redatto per identificare la chiave usata per eseguire l'hashing dei dati. - ID chiave diversi significano che i valori non sono correlati e non possono essere usati per la correlazione.
Nota
È HmacRedactor ancora sperimentale, quindi i metodi precedenti causeranno l'avviso EXTEXP0002
, che indica che non è ancora stabile.
Per usarlo, aggiungere <NoWarn>$(NoWarn);EXTEXP0002</NoWarn>
al file di progetto o aggiungere #pragma warning disable EXTEXP0002
intorno alle chiamate a SetHmacRedactor
.
Configurare un redactor personalizzato
Per creare un redactor personalizzato, definire una sottoclasse che eredita da Redactor:
public sealed class StarRedactor : Redactor
public class StarRedactor : 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;
}
}
Creare un fornitore di editor personalizzato
L'interfaccia IRedactorProvider fornisce istanze di redattori basate sulla classificazione dei dati. Per creare un provider redactor personalizzato, ereditare da IRedactorProvider come illustrato nell'esempio seguente:
using Microsoft.Extensions.Compliance.Classification;
using Microsoft.Extensions.Compliance.Redaction;
public sealed class StarRedactorProvider : IRedactorProvider
{
private static readonly StarRedactor _starRedactor = new();
public static StarRedactorProvider Instance { get; } = new();
public Redactor GetRedactor(DataClassificationSet classifications) => _starRedactor;
}
Registrazione di informazioni riservate
La registrazione è un'origine comune di esposizione accidentale dei dati. Le informazioni riservate, ad esempio dati personali, credenziali o dettagli finanziari, non devono mai essere scritte nei log in testo normale. Per evitare questo, usare sempre la redazione quando si registrano dati potenzialmente sensibili.
Passaggi per la registrazione dei dati sensibili
- Installare il pacchetto delle estensioni di telemetria: installare Microsoft.Extensions.Telemetry per poter usare il logger esteso per abilitare la funzionalità di redazione.
- Configurare la redazione: Integrare i redattori con la pipeline di logging chiamando il metodo AddRedaction(IServiceCollection), per sanitizzare o mascherare automaticamente i campi sensibili prima che siano scritti nei log.
- Identificare i campi sensibili: sapere quali dati nell'applicazione sono sensibili e richiedono la protezione e contrassegnarli con la classificazione dei dati appropriata.
- Esaminare l'output del log: auditare regolarmente i log per assicurarsi che non siano esposti dati sensibili.
Esempio: Omettere dati nei registri
Quando si usa Microsoft.Extensions.Logging, è possibile combinare la redazione con la registrazione come indicato di seguito:
using Microsoft.Extensions.Telemetry;
using Microsoft.Extensions.Compliance.Redaction;
var services = new ServiceCollection();
services.AddLogging(builder =>
{
// Enable redaction.
builder.EnableRedaction();
});
services.AddRedaction(builder =>
{
// configure redactors for your data classifications
builder.SetRedactor<StarRedactor>(MyTaxonomyClassifications.Private);
});
// Use annotations to mark sensitive data.
// For example, apply the Private classification to SSN data.
[LoggerMessage(0, LogLevel.Information, "User SSN: {SSN}")]
public static partial void LogPrivateInformation(
this ILogger logger,
[MyTaxonomyClassifications.Private] string SSN);
public void TestLogging()
{
LogPrivateInformation("MySSN");
}
L'output dovrebbe essere simile al seguente:
User SSN: *****
In questo modo si garantisce che i dati sensibili vengano redatti prima di essere registrati, riducendo il rischio di perdite di dati.