プライバシーと権限について¶
プライバシールールは、データが RUM または Log キューに入る前に有効になる必要があります。C# と Native C/C++ はどちらも URL Query、HTTP リクエストヘッダー、レスポンスヘッダーのマスキングをサポートしており、汎用 Modifier を使用してビジネス上の機密フィールドを処理できます。
権限設定について¶
Windows SDK はシステム権限を自ら要求することはありません。アプリケーションは、プロセスが設定されたレポート宛先とキャッシュディレクトリにアクセスできることを保証する必要があります。WebView2、ウィンドウハンドル、およびネットワークコンポーネントは、引き続きホストアプリケーション自身の権限とセキュリティポリシーに従います。
デフォルトの動作¶
| データ | .NET / C# | Native C/C++ |
|---|---|---|
| URL Query | 非機密値を保持し、デフォルトの機密パラメータは <redacted> に置き換えられます |
同じ |
| HTTP Header | デフォルトで収集し、認証関連のヘッダーをマスキングします | 同じ |
| ユーザー属性とカスタム属性 | DataModifier または LineDataModifier を使用してマスキングできます |
同じ |
| Log 内容と属性 | DataModifier または LineDataModifier を使用してマスキングできます |
同じ |
| Trace Header | ShouldTrace/should_trace で許可されたターゲットにのみ送信されます |
同じ |
デフォルトの機密 Query 名には、token、access_token、refresh_token、client_secret、password、passwd、secret、api_key、apikey、auth、authorization が含まれます。デフォルトの機密 Header 名には、Authorization、Cookie、Set-Cookie、Proxy-Authorization、X-Api-Key、X-Auth-Token、X-Datakit-Token が含まれます。
統一処理順序¶
RUM、Log、WebView、および Native Browser Bridge のデータは、ディスクキャッシュに書き込まれる前に、同じ処理順序を使用します。
DataModifier:既存の Tag と Field を個別に処理します。nullを返すか、Native コールバックが0を返した場合は、元の値が保持されます。LineDataModifier:Measurement ごとにデータ全体を確認し、既存のフィールドを更新します。新しく追加されたフィールドは無視されます。- HTTP プライバシールール:最後に URL Query、リクエストヘッダー、レスポンスヘッダーを処理し、カスタム Modifier が設定されたネットワークマスキングルールをバイパスすることを防ぎます。
- フォーマットしてキャッシュに書き込みます。
Modifier は複数の収集スレッドで同時に実行される可能性があるため、コールバック内で時間のかかる操作を実行しないでください。コールバックの例外はデータ収集を中断せず、該当するフィールドは元の値が保持されます。
プライバシー設定¶
GuanceSdk.Init(new GuanceConfig
{
DatawayUrl = "https://openway.guance.com",
ClientToken = "<client-token>",
RumAppId = "<rum-app-id>",
DataModifier = (key, value) =>
{
return key switch
{
"user_email" => "<redacted>",
"phone" => "<redacted>",
_ => null
};
},
LineDataModifier = (measurement, data) =>
{
if (measurement == "error" && data.ContainsKey("error_message"))
{
return new Dictionary<string, object?>
{
["error_message"] = "<redacted-error>"
};
}
return null;
},
Privacy = new RumPrivacyConfig
{
CaptureHttpHeaders = true,
CaptureUrlQueryString = true,
RedactAllUrlQueryValues = false,
RedactedValue = "<redacted>",
RedactedHeaderNames = new[]
{
"Authorization",
"Cookie",
"Set-Cookie",
"X-Api-Key"
},
RedactedQueryParameterNames = new[]
{
"token",
"password",
"secret"
}
}
});
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
CaptureHttpHeaders |
true |
マスキングされたリクエストヘッダーとレスポンスヘッダーを記録するかどうか。 |
CaptureUrlQueryString |
true |
URL Query を保持するかどうか。無効にすると Query 全体が削除されます。 |
RedactAllUrlQueryValues |
false |
すべての Query の値を隠すかどうか。 |
RedactedValue |
<redacted> |
マスキング置換テキスト。 |
RedactedHeaderNames |
認証関連ヘッダー | ヘッダー名のリスト。大文字と小文字を区別しません。 |
RedactedQueryParameterNames |
機密パラメータ名のリスト | Query パラメータ名のリスト。大文字と小文字を区別しません。 |
DataModifier と LineDataModifier はどちらもオプションの設定です。デフォルトの HTTP マスキングのみが必要な場合は、Privacy のみを設定してください。
#include <cstring>
static int modify_data(
const char* key,
const guance_data_value*,
guance_data_value* replacement,
void*) {
if (std::strcmp(key, "user_email") != 0) {
return 0;
}
replacement->type = GUANCE_DATA_VALUE_STRING;
replacement->value.string_value = "<redacted>";
return 1;
}
static void modify_line(
const char* measurement,
guance_data_item* data,
uint32_t data_count,
void*) {
if (std::strcmp(measurement, "error") != 0) {
return;
}
for (uint32_t index = 0; index < data_count; ++index) {
if (std::strcmp(data[index].key, "error_message") == 0) {
data[index].value.type = GUANCE_DATA_VALUE_STRING;
data[index].value.value.string_value = "<redacted-error>";
}
}
}
guance_sdk_config sdk_config;
guance_sdk_config_init(&sdk_config);
sdk_config.dataway_url = "https://openway.guance.com";
sdk_config.client_token = "<client-token>";
sdk_config.rum_app_id = "<rum-app-id>";
guance_sdk_handle rum = guance_sdk_init(&sdk_config);
guance_data_modifier_config modifiers;
guance_data_modifier_config_init(&modifiers);
modifiers.data_modifier = modify_data;
modifiers.line_data_modifier = modify_line;
guance_configure_data_modifiers(rum, &modifiers);
const char* redacted_query_names[] = {
"token",
"password",
"secret"
};
const char* redacted_header_names[] = {
"Authorization",
"Cookie",
"Set-Cookie",
"X-Api-Key"
};
guance_rum_resource_collection_config privacy;
guance_rum_resource_collection_config_init(&privacy);
privacy.capture_http_headers = 1;
privacy.capture_url_query = 1;
privacy.redact_all_url_query_values = 0;
privacy.redacted_value = "<redacted>";
privacy.redacted_query_parameter_names = redacted_query_names;
privacy.redacted_query_parameter_name_count = 3;
privacy.redacted_header_names = redacted_header_names;
privacy.redacted_header_name_count = 4;
guance_rum_configure_resource_collection(rum, &privacy);
すべての Native 設定構造体は、最初に対応する *_init() を呼び出す必要があります。HTTP プライバシー設定は、ヘッダー名と Query 名のリストをコピーします。Modifier は関数ポインタと user_data を保持するため、再設定または guance_sdk_shutdown() が呼び出されるまで有効である必要があります。Modifier は同時に実行される可能性があり、同じ SDK Handle を再呼び出しすることはできません。
データマスキング¶
ネットワークデータ収集の無効化¶
ターゲットフィルタリング¶
Native Resource は should_collect を使用して収集ターゲットをフィルタリングできます。C# では、ビジネスハンドラーまたは手動 Resource バウンダリーで同等のフィルタリングを実行してください。Trace Header は、Trace 設定 のターゲット許可リストを使用して、信頼できるサービスに限定する必要があります。
ユーザー、Log、およびカスタムフィールド¶
- パスワード、トークン、身分証明書、支払い情報、または完全な認証ヘッダーを書き込まないでください。
- ユーザー ID には、ビジネスで許可された安定した識別子またはハッシュ値を使用してください。
- Log の内容と属性は、ビジネス上の機密フィールドを自動的に認識しません。Modifier を使用するか、
AddLog()を呼び出す前にマスキングを完了してください。 - カスタム属性は、SDK の予約フィールドを上書きできません。競合するフィールドは無視されます。
Session Replay のプライバシー¶
実験的機能
Session Replay はデフォルトで無効です。明示的に有効にして検証することはできますが、依然として実験的機能です。有効にする前に、デフォルトのポリシーと要素レベルのオーバーライドがビジネスのプライバシー要件を満たしていることを確認する必要があります。
Session Replay のグローバルプライバシーレベル、要素レベルのオーバーライド、および WebView2/Electron のプライバシーバウンダリーは、Windows セッションリプレイのプライバシー設定 と プライバシーオーバーライド にまとめられています。