Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
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: *****
Это гарантирует, что конфиденциальные данные редактируются перед ведением журнала, что снижает риск утечки данных.