演習 - クラウドネイティブ アプリケーションで機密データを編集する
注文プロセスにログを追加する必要があります。 .NET の編集機能を使用して、機密データがログに漏えいしないようにします。
この演習では、以下のことを行います。
Microsoft.Extensions.Compliance.RedactionNuGet パッケージを各プロジェクトに追加します。- 編集サービスを依存性注入コンテナに追加します。
- ログ 記録フレームワークで編集を有効にします。
- 注文プロセス中にログ 記録フレームワークを呼び出します。
- EUII データのカスタムの編集実装を追加します。
- 分類されたデータの種類ごとに使用する編集実装を選択します。
編集サービスを追加する
引き続き codespace または Visual Studio Code ウィンドウが開いているはずです。 そうでない場合は、今すぐ開きます。
ターミナル ウィンドウで、次のコマンドを入力します。
cd /workspaces/mslearn-dotnet-cloudnative/dotnet-compliance/eShopLite/Store/Microsoft.Extensions.Compliance.RedactionNuGet パッケージをプロジェクトに追加します。dotnet add package Microsoft.Extensions.Compliance.Redactionエクスプローラー ウィンドウで、dotnet-compliance/eShopLite/Store フォルダーを展開し、Program.cs ファイルを選択します。
エディターで、次の依存関係を追加します。
using Microsoft.Extensions.Compliance.Classification; using Microsoft.Extensions.Compliance.Redaction;19 行目まで下にスクロールし、
Add redactionコメントの下に、依存関係挿入コンテナーに編集サービスを追加します。builder.Services.AddRedaction();
ログ 記録フレームワークでの編集の有効化
エディターで、
AddRedaction()行の下に次のコードを追加します。builder.Services.AddLogging(logging => { logging.EnableRedaction(); logging.AddJsonConsole(); //Enable structure logs on the console to view the redacted data. });上記のコードを使用すると、ログ 記録フレームワークでの編集が可能になります。
注文プロセス中にログ 記録フレームワークを呼び出す
エクスプローラー ウィンドウで、dotnet-compliance/eShopLite/Store/Services フォルダーを展開し、ProductService.cs ファイルを選択します。
エディターで、ファイルの下部に次のコードを追加します。
public static partial class Log { [LoggerMessage(1, LogLevel.Information, "Placed Order: {order}")] public static partial void LogOrders(this ILogger logger, [LogProperties] Order order); }エディターの
CreateOrderタスクで、LogOrdersメソッドを呼び出します。public async Task<bool> CreateOrder(Order order) { try { _logger.LogOrders(order);上記のコードは、
LogOrdersメソッドを呼び出し、現在の注文情報を渡します。
新しい編集済みログ記録をテストする
上記のすべてのコードを配置すると、アプリは既定の編集実装を使用して、 Order 情報を編集できます。 次に、これをテストします。
下部の [ターミナル ] ウィンドウで、 dotnet-compliance/eShopLite フォルダーに移動します。
cd ..アプリ コンテナーを更新します。
dotnet publish /p:PublishProfile=DefaultContainerdotnet-compliance フォルダーに移動し、Docker でアプリを起動します。
cd .. docker compose up[ポート] タブを選択し、フロントエンド (32000) ポートの [ブラウザーで開く] 地球アイコンを選択します。
[ 製品 ] リンクを選択します。 買い物かごにいくつかの製品を追加します。
[ 買い物かご ] ボタンを選択します。
ターミナル ウィンドウで 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 値はログに含まれていますが、CustomerName と CustomerAddress の値は空の文字列であることに注意してください。
既定では、再編集の実装を指定しない場合、編集エンジンは
ErasingRedactor実装を使用して、機密データがログに漏えいしないようにします。ターミナル ウィンドウで、Ctrl+キーを押してアプリを停止します。
カスタムの編集の実装を追加する
次に、さまざまな種類のデータに対して異なる編集アルゴリズムを使用するように、編集の実装を強化します。 最初に、値を *****に置き換える新しいカスタムの編集実装を追加します。
エクスプローラー ウィンドウで、dotnet-compliance/eShopLite/DataEntities フォルダーを展開し、Compliance.cs ファイルを選択します。
エディターで、ファイルの下部に次のコードを追加します。
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 メソッドを再編集エンジンで使用できるようにします。
使用する編集の実装を選択する
エクスプローラー ウィンドウで、dotnet-compliance/eShopLite/Store フォルダーを展開し、Program.cs ファイルを選択します。
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実装を特に使用するように編集エンジンを構成します。
新しい編集の実装をテストする
ターミナル ウィンドウで、アプリをビルドして実行します。
docker-compose up --build[ポート] タブを選択し、フロントエンド (32000) ポートの [ブラウザーで開く] 地球アイコンを選択します。
[ 製品 ] リンクを選択します。 買い物かごにいくつかの製品を追加します。
[ 買い物かご ] ボタンを選択します。
ターミナル ウィンドウで 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 値は依然として空の文字列のままですが、 CustomerName と CustomerAddress の値は現在
*****.です。ターミナル ウィンドウで、Ctrl+キーを押してアプリを停止します。