次の方法で共有


Recall DLP プロバイダー API

Recall (プレビュー) を使用すると、ユーザーは自然言語を使用して、画面のローカルに保存および分析されたスナップショットを検索できます。 Recall はデータ損失防止 (DLP) プロバイダーと統合され、組織のポリシーに基づいて機密性の高いコンテンツが保存されるのを防ぎます。 この記事では、 Recall が任意の DLP ツールを操作できるようにするパブリック API について説明します。

システム アーキテクチャ

次の図は、Windows Recall が DLP プロバイダーとやり取りする方法を示しています。

┌─────────────────────────────────────────────────────────────┐
│ Windows Recall                                              │
│ - Captures screenshots and app content                      │
│ - Queries DLP provider before capturing                     │
└─────────────────────┬───────────────────────────────────────┘
                      │ Query: Should we capture this window?
                      │ Context: Process, Window, File, Labels
                      ▼
┌─────────────────────────────────────────────────────────────┐
│ AIContext.exe Process                                       │
│                                                             │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Your DLP Provider DLL (loaded in-process)               │ │
│ │ - Evaluates organizational policies                     │ │
│ │ - Returns capture restrictions                          │ │
│ │ - Provides sensitivity label information                │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────┬───────────────────────────────────────┘
                      │ Response: Allow/Block/Warn/Audit
                      │ Labels: Sensitivity information
                      ▼
┌─────────────────────────────────────────────────────────────┐
│ Windows Recall                                              │
│ - Enforces returned restrictions                            │
│ - Displays sensitivity labels to user                       │
│ - Logs audit events as required                             │
└─────────────────────────────────────────────────────────────┘

パブリック API

コア構造

RestrictionEnforcement 列挙型

特定の制限の適用レベルを定義します。

enum RestrictionEnforcement
{
    RestrictionEnforcement_Allow = 0,
    RestrictionEnforcement_AuditAndAllow = 1,
    RestrictionEnforcement_Warn = 2,
    RestrictionEnforcement_Block = 3,
};

価値観:

  • RestrictionEnforcement_Allow (0): 操作は制限なしで許可されます。
  • RestrictionEnforcement_AuditAndAllow (1): 操作は許可されますが、監査のためにログに記録する必要があります。
  • RestrictionEnforcement_Warn (2): 操作は、続行する前に警告をユーザーに求めます。
  • RestrictionEnforcement_Block (3): 操作は完全に防止されます。

制限構造

さまざまな操作の適用レベルを指定します。

struct Restrictions
{
    RestrictionEnforcement CopyToClipboard;
    RestrictionEnforcement CaptureInRecall;
};

メンバーズ:

  • CopyToClipboard: コンテンツをクリップボードにコピーするための強制レベル。
  • CaptureInRecall: Recall スナップショット内のコンテンツをキャプチャするための強制レベル。

SensitivityLabelDescription 構造体

ユーザーに表示する秘密度ラベルに関する情報を提供します。

struct SensitivityLabelDescription
{
    LPCWSTR Name;
    LPCWSTR Color;
    LPCWSTR TooltipText;
    uint32_t Sensitivity;
};

メンバーズ:

  • 名前: 秘密度ラベルの表示名 ("Confidential" など)。
  • : 視覚的表現用の 16 進数の色コード (例: "#FF0000")。
  • TooltipText: ユーザーがラベルの上にマウス ポインターを置いたときに表示される説明テキスト。
  • 秘密度: 数値の感度レベル (値が大きいほど感度が高いことを示します)。

EnterpriseContextQuery 構造体

キャプチャ要求と、 DLP プロバイダーからの応答に関する情報が含まれています。

struct EnterpriseContextQuery
{
    uint32_t ProcessId;
    uint64_t WindowHandle;
    LPCWSTR FileName;
    LPCWSTR SensitivityLabelId;
    LPCWSTR OrganizationId;
    SensitivityLabelDescription SensitivityLabelDescription;
    Restrictions Restrictions;
};

メンバーズ:

  • ProcessId: キャプチャするアプリケーションのプロセス ID。
  • WindowHandle: キャプチャされるウィンドウへのハンドル。
  • FileName: アプリケーションで開いているファイルへの完全なパス (該当する場合)。
  • SensitivityLabelId: 既存の秘密度ラベルの識別子。
  • OrganizationId: 現在のユーザー コンテキストからの組織識別子。
  • SensitivityLabelDescription: 表示される秘密度ラベル情報 (プロバイダーによって設定されます)。
  • 制限: 適用する制限をキャプチャします (プロバイダーによって設定されます)。

アプリケーションは、 UserActivity.ContentInfo API を介して秘密度ラベル情報を提供できます。 アプリケーションでこの情報を書式設定して指定する方法の詳細については、「 UserActivity ContentInfo を使用して Recall に秘密度ラベルを指定する」を参照してください。

必要な DLL エクスポート

DLP プロバイダー DLL は、次のように正確な名前でこれらの関数をエクスポートする必要があります。

EnterpriseContextProvider_QueryEnterpriseContext

Recall は、キャプチャ要求を評価するためにこの関数を呼び出します。

HRESULT STDMETHODCALLTYPE EnterpriseContextProvider_QueryEnterpriseContext(
    _In_ ULONG totalQuerySizeBytes,
    _Inout_updates_all_(totalQuerySizeBytes / sizeof(EnterpriseContextQuery)) EnterpriseContextQuery* queryBuffer);

パラメーター:

  • totalQuerySizeBytes: クエリ バッファーの合計サイズ (バイト単位)。
  • queryBuffer: EnterpriseContextQuery 構造体の配列へのポインター。 プロバイダーは、組織のポリシーに基づいて Restrictions フィールドと SensitivityLabelDescription フィールドを更新する必要があります。

戻り値:

  • 成功した場合は S_OK を返し、失敗した場合は適切な HRESULT エラー コードを返します。

備考:

Windows では、効率を高める目的で複数のクエリが同時に送信される場合があります。 実装では、バッファー内のすべてのクエリを処理し、返す前に適切なフィールドを更新する必要があります。

EnterpriseContextProvider_FlushEnterpriseContext

Recall は、この関数を定期的に呼び出して、プロバイダーがキャッシュされた文字列またはリソースを解放できるようにします。

VOID STDMETHODCALLTYPE EnterpriseContextProvider_FlushEnterpriseContext();

備考:

Recall は、前のクエリ応答のデータを調べたりコピーしたりした後に、この関数を呼び出します。 リソースの割り当てを解除したり、キャッシュをクリアしたり、クリーンアップ操作を実行したりするには、この関数を使用します。

プロバイダーの登録

レジストリのセットアップ (プロバイダー)

DLP プロバイダーのインストールでは、DLL へのパスを含むレジストリ エントリが作成されます。

HKEY_LOCAL_MACHINE\SOFTWARE\YourCompany\DLP
    InstallPath    REG_SZ    C:\Program Files\YourCompany\DLP

セキュリティに関する考慮事項:

承認されていない変更を防ぐためにレジストリ キーを強化します。 適切な ACL を設定して、書き込みアクセスを管理者のみに制限します。

グループ ポリシーの構成 (管理者)

管理者は、 Set Data Loss Prevention Provider グループ ポリシーを使用してプロバイダーを構成します。

  • ポリシー名: SetDataLossPreventionProvider
  • ポリシーの場所: Windows AI > Windows コンポーネント>コンピューターの構成>管理用テンプレート
  • ポリシー値の形式: key:<REGISTRY_PATH>; value:<VALUE_NAME>; binary:<DLL_NAME>

大事な:value フィールドは、keyで指定されたレジストリ キーの下にあるレジストリ値の名前を参照します。

構成例:

次を使用してレジストリ エントリを作成する場合:

reg add HKLM\Software\YourCompany\DLP -v InstallPath -t REG_SZ -d "C:\Program Files\YourCompany\DLP"

DLL は YourCompanyDLP.dll という名前で、グループ ポリシーの値は次のようになります。

key:HKLM\software\YourCompany\DLP; value:InstallPath; binary:YourCompanyDLP.dll

オプションのバージョン チェック:

DLP プロバイダーに必要な最小バージョンを指定できます。

key:HKLM\software\YourCompany\DLP; value:InstallPath; binary:YourCompanyDLP.dll; minversion:1.2.0.0

minversionを指定Recall、バイナリのバージョンが指定したバージョン以上の場合にのみバイナリが読み込まれます。

クエリ処理フロー

一般的な対話シーケンス

  1. Windows Recall は、アプリケーション ウィンドウからコンテンツをキャプチャする準備をします。

  2. Recall は 、次のようなクエリを作成します。

    • ターゲット アプリケーションのプロセス ID とウィンドウ ハンドル
    • ファイル パス (アプリケーションに開いているドキュメントがある場合)
    • 既存の秘密度ラベル情報
    • 現在のユーザー コンテキストからの組織 ID
  3. DLPプロバイダーは、組織のポリシーに対して各クエリを評価します。

    • アプリケーションをキャプチャする必要があるかどうかを確認する
    • ファイル レベルの制限を確認する
    • 秘密度ラベルを評価する
    • ユーザー/グループ固有のポリシーを適用する
  4. プロバイダーは、次を使用して 更新されたクエリ構造を返します。

    • Restrictions.CaptureInRecall: キャプチャを許可、警告、監査、またはブロックするかどうか
    • SensitivityLabelDescription: 表示用のラベル名、色、ツールヒント
    • その他の関連する制限情報
  5. Windows Recall では、 返される制限が適用されます。

    • 許可: 通常どおりキャプチャ
    • AuditAndAllow: アクションをキャプチャしてログに記録します
    • 警告: キャプチャする前にユーザーにメッセージを表示する
    • ブロック: キャプチャを完全に防止します。

クエリ シナリオ 1 の例: "社外秘" ラベルを持つ Word 文書

[Input]:

  • 過程: winword.exe
  • ファイル: SecretProject.docx
  • ラベル: Confidential

処理:

組織のルールに対してドキュメント分類ポリシーを確認します。

アウトプット:

  • CaptureInRecall: RestrictionEnforcement_Block
  • SensitivityLabelDescription.Name: "社外秘 - キャプチャしない"

クエリ シナリオ 2 の例: パブリック サイト上の Web ブラウザー

[Input]:

  • 過程: msedge.exe
  • 窓: news.example.com

処理:

承認済みリストに対してドメインを確認します。

アウトプット:

  • CaptureInRecall: RestrictionEnforcement_Allow

クエリ シナリオの例 3: Finance Application

[Input]:

  • 過程: FinanceApp.exe
  • ユーザー: finance_user

処理:

ユーザー グループとアプリケーションの秘密度を確認します。

アウトプット:

  • CaptureInRecall: RestrictionEnforcement_AuditAndAllow
  • SensitivityLabelDescription.Name: "財務データ - 監査済み"

実装ガイドライン

パフォーマンスに関する考慮事項

  • バッチ処理: Windows は、より効率的にするために複数のクエリを同時に送信する場合があります。 バッチ処理を処理するようにコードを最適化します。
  • キャッシュ: 応答時間を改善するために必要な場合は、ポリシーの決定をキャッシュします。 キャッシュのライフサイクルを管理するには、 FlushEnterpriseContext 関数を使用します。
  • 非同期操作: クエリ関数の操作をブロックしないようにします。 ユーザー エクスペリエンスに影響を与えないように、すばやく戻ります。

エラー処理

  • さまざまなエラー条件に対して適切な HRESULT コードを返します。
  • FlushEnterpriseContext関数を使用してリソースをクリーンアップします。
  • ポリシー情報が一時的に正常に使用できない場合 (既定では安全な動作) を処理します。

セキュリティ要件

  • In-Process 実行: DLL は、昇格された特権で AIContext.exe プロセス内でインプロセスで実行されます。
  • セキュリティで保護されたコーディングのプラクティス: メモリ管理のためのセキュリティで保護されたコーディングプラクティスに従います。 すべての入力パラメーターを十分に検証します。
  • デジタル署名: DLL は、展開のために Authenticode 署名されている必要があります。 署名されていないバイナリは読み込まれません。
  • レジストリ保護: 承認されていない変更を防ぐために、グループ ポリシーで指定されたレジストリ キーを強化します。

読み込みプロセス

Recall では、 LoadLibraryEx を使用してレジストリで指定されたパスから DLL を読み込み、 GetProcAddress を呼び出して、必要なエクスポートされた関数のアドレスを取得します。 QueryEnterpriseContextを呼び出した後、Recallは応答からデータを調べてコピーし、FlushEnterpriseContextを呼び出して、割り当てられたリソースをプロバイダーが解放できるようにします。

概要

DLP プロバイダーを作成してデプロイするには、次の手順に従います。

  1. 必要なエクスポートを実装して DLL を開発します

    • EnterpriseContextProvider_QueryEnterpriseContext
    • EnterpriseContextProvider_FlushEnterpriseContext
  2. サンプル クエリを使用して実装をテストし、さまざまなシナリオで正しい動作を確認します。

  3. Authenticode 証明書を使用してバイナリに署名します

  4. 次のインストール プロセスを作成 します。

    • DLL を安全な場所にインストールします
    • 適切な ACL を使用してレジストリ エントリを設定する
    • 管理者向けの構成ツールを提供します
  5. 管理者が ポリシーを構成するためのSetDataLossPreventionProviderします。

  6. エンタープライズ環境にデプロイして構成します。