クラウドネイティブ アプリケーションで機密データを削除する

完了

アプリケーション内のリダクションは、ログ メッセージとテレメトリに対して行われるのが最も一般的です。 また、メトリックのディメンションやミドルウェアのヘッダー データの削除など、他のシナリオでも使用できます。

.NET ログ記録フレームワークを使用すると、ログ メッセージ内のデータを簡単に削除できます。 Microsoft.Extensions.Compliance.Abstractions パッケージは、データを編集する Redactor クラスを含むようにログを強化します。

リダクションとは

リダクションは、メッセージから機密情報を削除するプロセスです。 たとえば、ログ メッセージからユーザーの名前を削除したい場合があります。 または、テレメトリ イベントからユーザーの IP アドレスを削除したい場合もあります。

最も簡単な編集は、値を消去し、その変数に空の文字列を返すことです。 この動作は、ErasingRedactor が既定のフォールバック編集機能であるため、既定で発生します。 Microsoft には、ハッシュ関数を使用してデータを削除するために使用できる HMACSHA256Redactor クラスが含まれています。 HMAC の編集は、データを編集するが、複数のログ ステートメント間でログ メッセージを関連付けたい場合に便利です。 最後のオプションは、独自のリダクション関数を提供することです。これは、カスタム アルゴリズムを使用してデータを削除する場合に便利です。

たとえば、値を ***** に置き換えると、その値が削除されていることをログ内でより明確にすることができます。

クラウドネイティブ アプリケーション内のデータを削除する方法

組織のクラウドネイティブ アプリは、複数のプロジェクトでログを書き込み、テレメトリを作成している可能性があります。 たとえば、データベース サービス、Web アプリ、または使用するその他の API からログを書き込む場合があります。 ログの種類に応じて、それぞれにリダクション サービスを追加する必要があります。

アプリでリダクションを有効にするには、次の 4 つの手順を実行する必要があります。

  1. Microsoft.Extensions.Compliance.Redaction NuGet パッケージを各プロジェクトに追加します。
  2. リダクション サービスを依存関係挿入コンテナーに追加します。
  3. 機密データの種類ごとに使用するリダクション実装を選びます。
  4. ログ記録フレームワークでリダクションを有効にします。

リダクション サービスを依存関係挿入コンテナーに追加する

Blazor WebAssembly アプリの例を次に示します。 このプロセスは他の種類のアプリでも同様ですが、依存関係挿入コンテナーの構成方法によってコードが若干異なります。

program.cs ファイルに、次の依存関係を追加します。

using Microsoft.Extensions.Compliance.Classification;
using Microsoft.Extensions.Compliance.Redaction;

上記のパッケージを使用すると、次のコードを使用して、依存関係挿入コンテナーにリダクション サービスを追加できます。

builder.Services.AddRedaction();

機密データの種類ごとに使用するリダクション実装を選ぶ

AddRedactor メソッドには、RedactorOptions パラメータを含めることができます。 このパラメータを使用すると、各データ分類に使用するリダクション実装を指定できます。

たとえば、次のコードは、EUII データに HMACSHA256Redactor を使用することを指定します。

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));
});

Note

HMAC リダクター アルゴリズムは試験段階であるため、使用する場合はコンパイラの警告を無効にする必要があります。 上記のコードを #pragma warning disable EXTEXP0002#pragma warning restore EXTEXP0002 で囲むと、プロジェクトをコンパイルできるようになります。

RedactorOptions パラメータに複数のリダクション実装を追加できます。 たとえば、次のコードは 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));
});

ログ記録フレームワークでリダクションを有効にする

次の手順では、ログ記録フレームワークでリダクションを有効にします。 これを行うには、.EnableRedaction プロパティをアプリケーション ログ ジェネレーターに設定します。 サンプル アプリのコードは次のとおりです。

builder.Services.AddLogging(logging => 
{
    logging.EnableRedaction();
    logging.AddJsonConsole(); //Enable structure logs on the console to view the redacted data.
});

上記のコードを配置すると、リダクション サービスを使用する新しいロガーを作成できます。 注文情報をログに書き込む場所に、新しい LogOrders ロガーを実装します。

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);
}

カスタムのリダクション実装を作成する

Microsoft では、カスタムのリダクション実装を作成できます。 独自のアルゴリズムを使用してデータを削除する場合は、カスタムのリダクションを使用します。 機密データを ***** に置き換えるカスタム リダクターを実装してみましょう。

カスタム リダクターは Redactor クラスを実装する必要があります。 このクラスには、次の 2 つのメソッドが実装されている必要があります。

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;
    }
}

この eShopLite アーキテクチャ例では、データ分類コードの下にある Compliance.csDataEntities プロジェクトにこのクラスを追加できます。