Поделиться через


Изменение данных в .NET

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 методов, как описано в следующем списке:

Настройка редактора

Получение редакторов во время выполнения программы с помощью 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;
}

Ведение журнала конфиденциальной информации

Логирование данных является общим источником случайной уязвимости данных. Конфиденциальные данные, такие как персональные данные, учетные данные или финансовые сведения, никогда не должны записываться в журналы в виде обычного текста. Чтобы предотвратить это, всегда используйте редактирование при ведении журнала потенциально конфиденциальных данных.

Действия по ведению журнала конфиденциальных данных

  1. Установите пакет расширений телеметрии: установите Microsoft.Extensions.Telemetry , чтобы использовать расширенный средство ведения журнала для включения функции редактирования.
  2. Настройка редактирования: интеграция редакторов с журнальным конвейером, вызвав соответствующий метод для автоматического удаления или маскирования конфиденциальных полей перед их записью в журналы.
  3. Определение конфиденциальных полей: узнайте, какие данные в приложении конфиденциальны и требуют защиты, и помечайте их соответствующим классификацией данных.
  4. Просмотр выходных данных журнала: регулярно проводите проверку журналов, чтобы гарантировать, что конфиденциальные данные не раскрываются.

Пример. Редактирование данных в журналах

При использовании 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: *****

Это гарантирует, что конфиденциальные данные редактируются перед ведением журнала, что снижает риск утечки данных.