演習 - クラウドネイティブ アプリケーションで機密データを編集する

完了

注文プロセスにログを追加する必要があります。 .NET の編集機能を使用して、機密データがログに漏えいしないようにします。

この演習では、以下のことを行います。

  • Microsoft.Extensions.Compliance.Redaction NuGet パッケージを各プロジェクトに追加します。
  • 編集サービスを依存性注入コンテナに追加します。
  • ログ 記録フレームワークで編集を有効にします。
  • 注文プロセス中にログ 記録フレームワークを呼び出します。
  • EUII データのカスタムの編集実装を追加します。
  • 分類されたデータの種類ごとに使用する編集実装を選択します。

編集サービスを追加する

引き続き codespace または Visual Studio Code ウィンドウが開いているはずです。 そうでない場合は、今すぐ開きます。

  1. ターミナル ウィンドウで、次のコマンドを入力します。

    cd /workspaces/mslearn-dotnet-cloudnative/dotnet-compliance/eShopLite/Store/
    
  2. Microsoft.Extensions.Compliance.Redaction NuGet パッケージをプロジェクトに追加します。

    dotnet add package Microsoft.Extensions.Compliance.Redaction
    
  3. エクスプローラー ウィンドウで、dotnet-compliance/eShopLite/Store フォルダーを展開し、Program.cs ファイルを選択します。

  4. エディターで、次の依存関係を追加します。

    using Microsoft.Extensions.Compliance.Classification;
    using Microsoft.Extensions.Compliance.Redaction;
    
  5. 19 行目まで下にスクロールし、 Add redaction コメントの下に、依存関係挿入コンテナーに編集サービスを追加します。

    builder.Services.AddRedaction();
    

ログ 記録フレームワークでの編集の有効化

  1. エディターで、 AddRedaction() 行の下に次のコードを追加します。

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

    上記のコードを使用すると、ログ 記録フレームワークでの編集が可能になります。

注文プロセス中にログ 記録フレームワークを呼び出す

  1. エクスプローラー ウィンドウで、dotnet-compliance/eShopLite/Store/Services フォルダーを展開し、ProductService.cs ファイルを選択します。

  2. エディターで、ファイルの下部に次のコードを追加します。

    public static partial class Log
    {
        [LoggerMessage(1, LogLevel.Information, "Placed Order: {order}")]
        public static partial void LogOrders(this ILogger logger, [LogProperties] Order order);
    }
    
  3. エディターの CreateOrder タスクで、 LogOrders メソッドを呼び出します。

    public async Task<bool> CreateOrder(Order order)
    {
        try
        {
            _logger.LogOrders(order);
    

    上記のコードは、 LogOrders メソッドを呼び出し、現在の注文情報を渡します。

新しい編集済みログ記録をテストする

上記のすべてのコードを配置すると、アプリは既定の編集実装を使用して、 Order 情報を編集できます。 次に、これをテストします。

  1. 下部の [ターミナル ] ウィンドウで、 dotnet-compliance/eShopLite フォルダーに移動します。

    cd ..
    
  2. アプリ コンテナーを更新します。

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. dotnet-compliance フォルダーに移動し、Docker でアプリを起動します。

    cd ..
    docker compose up
    
  4. [ポート] タブを選択し、フロントエンド (32000) ポートの [ブラウザーで開く] 地球アイコンを選択します。

  5. [ 製品 ] リンクを選択します。 買い物かごにいくつかの製品を追加します。

  6. [ 買い物かご ] ボタンを選択します。

  7. ターミナル ウィンドウで Ctrl+キーを押し、検索フィールドに「EventId」:1 と入力します。

    frontend-1  | {"EventId":1,"LogLevel":"Information","Category":"Store.Services.ProductService","Message":"Placed Order: DataEntities.Order","State":{"Message":"Microsoft.Extensions.Logging.ExtendedLogger\u002BModernTagJoiner","{OriginalFormat}":"Placed Order: {order}","order.Total":209.94,"order.Products":"[\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022]","order":"DataEntities.Order","order.CustomerAddress":"","order.CustomerName":"","order.Id":""}}
    

    この JSON 形式のログ エントリが表示されます。 order.Total 値はログに含まれていますが、CustomerNameCustomerAddress の値は空の文字列であることに注意してください。

    既定では、再編集の実装を指定しない場合、編集エンジンは ErasingRedactor 実装を使用して、機密データがログに漏えいしないようにします。

  8. ターミナル ウィンドウで、Ctrl+キーを押してアプリを停止します。

カスタムの編集の実装を追加する

次に、さまざまな種類のデータに対して異なる編集アルゴリズムを使用するように、編集の実装を強化します。 最初に、値を *****に置き換える新しいカスタムの編集実装を追加します。

  1. エクスプローラー ウィンドウで、dotnet-compliance/eShopLite/DataEntities フォルダーを展開し、Compliance.cs ファイルを選択します。

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

    上記のコードでは、 EShopCustomRedactor の redaction メソッドを再編集エンジンで使用できるようにします。

使用する編集の実装を選択する

  1. エクスプローラー ウィンドウで、dotnet-compliance/eShopLite/Store フォルダーを展開し、Program.cs ファイルを選択します。

  2. builder.Services.AddRedaction(); コードを置き換えて、編集エンジンの構成を提供します。

    builder.Services.AddRedaction(configure =>
    {
        configure.SetRedactor<ErasingRedactor>(new DataClassificationSet(DataClassifications.EUPDataClassification));
        configure.SetRedactor<EShopCustomRedactor>(new DataClassificationSet(DataClassifications.EUIIDataClassification));
    });
    

    上記のコードは、EUP データの ErasingRedactor 実装と EUII データの新しいカスタム EShopCustomRedactor 実装を特に使用するように編集エンジンを構成します。

新しい編集の実装をテストする

  1. ターミナル ウィンドウで、アプリをビルドして実行します。

    docker-compose up --build
    
  2. [ポート] タブを選択し、フロントエンド (32000) ポートの [ブラウザーで開く] 地球アイコンを選択します。

  3. [ 製品 ] リンクを選択します。 買い物かごにいくつかの製品を追加します。

  4. [ 買い物かご ] ボタンを選択します。

  5. ターミナル ウィンドウで Ctrl+キーを押し、検索フィールドに「EventId」:1 と入力します。

    frontend-1  | {"EventId":1,"LogLevel":"Information","Category":"Store.Services.ProductService","Message":"Placed Order: DataEntities.Order","State":{"Message":"Microsoft.Extensions.Logging.ExtendedLogger\u002BModernTagJoiner","{OriginalFormat}":"Placed Order: {order}","order.Total":269.88,"order.Products":"[\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022,\u0022DataEntities.Product\u0022]","order":"DataEntities.Order","order.CustomerAddress":"*****","order.CustomerName":"*****","order.Id":""}}
    

    この JSON 形式のログ エントリが表示されます。 次の点に注意してください: order.Id 値は依然として空の文字列のままですが、 CustomerNameCustomerAddress の値は現在 *****. です。

  6. ターミナル ウィンドウで、Ctrl+キーを押してアプリを停止します。