Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Redaction помогает удалять или маскировать конфиденциальную информацию в журналах, сообщениях об ошибках или других выходных данных. Это обеспечивает соответствие правилам конфиденциальности и защищает конфиденциальные данные. Это полезно в приложениях, обрабатывающих персональные данные, финансовую информацию или другие конфиденциальные точки данных.
Установить пакет редактирования
Чтобы приступить к работе, установите 📦 пакет NuGet Microsoft.Extensions.Compliance.Redaction :
dotnet add package Microsoft.Extensions.Compliance.Redaction
Или, если вы используете .NET 10+ SDK:
dotnet package add Microsoft.Extensions.Compliance.Redaction
Доступные редакторы
Редакторы отвечают за редактирование конфиденциальных данных. Они редактируют, заменяют или маскируют конфиденциальную информацию. Рассмотрим следующие доступные редакторы, предоставляемые библиотекой:
- ErasingRedactor заменяет любые входные данные пустой строкой.
-
HmacRedactor использует
HMACSHA256для кодирования удаляемых данных.
Пример использования
Чтобы использовать встроенные редакторы, необходимо зарегистрировать требуемые службы. Зарегистрируйте службы с помощью одного из доступных AddRedaction методов, как описано в следующем списке:
- AddRedaction(IServiceCollection): регистрирует реализацию IRedactorProvider в IServiceCollection.
-
AddRedaction(IServiceCollection, Action<IRedactionBuilder>): регистрирует реализацию IRedactorProvider в IServiceCollection и настраивает доступные редакторы, используя заданный
configureделегат.
Настройка редактора
Получение редакторов во время выполнения программы с помощью IRedactorProvider. Вы можете реализовать собственный поставщик и зарегистрировать его внутри вызова AddRedaction, или использовать поставщика по умолчанию. Настройте редакторы с помощью следующих IRedactionBuilder методов:
// 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>();
Учитывая данную классификацию данных в вашем коде:
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));
}
Настройка редактора HMAC
Настройте редактор HMAC с помощью следующих IRedactionBuilder методов:
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));
});
Кроме того, настройте его следующим образом:
var serviceCollection = new ServiceCollection();
serviceCollection.AddRedaction(builder =>
{
builder.SetHmacRedactor(
Configuration.GetSection("HmacRedactorOptions"), MyTaxonomyClassifications.Personal);
});
Включите этот раздел в файл конфигурации JSON:
{
"HmacRedactorOptions": {
"KeyId": 1234567890,
"Key": "1234567890abcdefghijklmnopqrstuvwxyz"
}
}
- Для HmacRedactorOptions необходимо задать его свойства HmacRedactorOptions.Key и HmacRedactorOptions.KeyId.
- Значение
Keyдолжно быть в формате base64 и не менее 44 символов. Используйте отдельный ключ для каждого основного развертывания службы. Сохраняйте секрет материала ключа и регулярно поворачивайте его. - К каждому отредактированному значению добавляется
KeyId, чтобы идентифицировать ключ, используемый для хеширования данных. - Разные идентификаторы ключей означают, что значения не связаны и не могут использоваться для корреляции.
Примечание.
По-прежнему HmacRedactor экспериментальный, поэтому предыдущие методы вызывают EXTEXP0002 предупреждение, указывающее, что оно еще не стабильно.
Чтобы использовать его, добавьте <NoWarn>$(NoWarn);EXTEXP0002</NoWarn> в файл проекта или добавьте #pragma warning disable EXTEXP0002 вокруг вызовов SetHmacRedactor.
Настройка пользовательского редактора
Чтобы создать пользовательский редактор, определите подкласс, наследующий от Redactor:
public sealed 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;
}
}
Создание настраиваемого поставщика редактора
Интерфейс IRedactorProvider предоставляет экземпляры редакторов на основе классификации данных. Чтобы создать настраиваемого поставщика редактора, наследуйтесь от IRedactorProvider, как показано в следующем примере.
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;
}
Ведение журнала конфиденциальной информации
Логирование данных является общим источником случайной уязвимости данных. Конфиденциальные данные, такие как персональные данные, учетные данные или финансовые сведения, никогда не должны записываться в журналы в виде обычного текста. Чтобы предотвратить это, всегда используйте редактирование при ведении журнала потенциально конфиденциальных данных.
Действия по ведению журнала конфиденциальных данных
- Установите пакет расширений телеметрии: установите Microsoft.Extensions.Telemetry , чтобы использовать расширенный средство ведения журнала для включения функции редактирования.
- Настройка редактирования: интеграция редакторов с журнальным конвейером, вызвав соответствующий метод для автоматического удаления или маскирования конфиденциальных полей перед их записью в журналы.
- Определение конфиденциальных полей: узнайте, какие данные в приложении конфиденциальны и требуют защиты, и помечайте их соответствующим классификацией данных.
- Просмотр выходных данных журнала: регулярно проводите проверку журналов, чтобы гарантировать, что конфиденциальные данные не раскрываются.
Пример. Редактирование данных в журналах
При использовании Microsoft.Extensions.Logging можно объединить редактирование с ведением журнала следующим образом:
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");
}
Выходные данные должны иметь следующий вид:
User SSN: *****
Это гарантирует, что конфиденциальные данные редактируются перед ведением журнала, что снижает риск утечки данных.