infoType と infoType 検出器

機密データの保護では、情報タイプinfoType)を使用してスキャンする対象を定義します。infoType は、名前、メールアドレス、電話番号、識別番号、クレジット カード番号などの機密データのタイプを表します。infoType 検出器は、infoType の一致条件で照合する検出メカニズムです。

infoType の選択に関するベスト プラクティス

データを保護するための最初の重要なステップの一つは、データを理解することです。効果的な手法として、ビジネス上の必要性がある情報のみを収集、保存、処理することをおすすめします。取り扱うデータを特定することで、ビジネス、ユーザー、データ セキュリティ、プライバシー体制について、情報に基づいた意思決定を行うことができます。

ビジネス ユースケースによっては、特定の機密情報が必要になる場合もあれば、必要にならない場合もあります。すべてのユースケースをサポートする単一のソリューションはありません。このため、Sensitive Data Protection では、スキャンするデータの種類を柔軟に制御できます。匿名化またはマスキングに infoType を使用している場合は、データの変換のタイミングと方法も制御できます。

一般的なガイドライン

infoType を選択する際は、次の一般的なガイドラインを考慮してください。

特定の infoType の代わりに一般的な infoType を使用する

スキャン結果に検出された特定の infoType を表示する必要がない場合は、検査構成で特定の infoType ではなく一般的な infoType を使用することを検討してください。リクエストで一般的な infoType 検出器を使用するメリットについては、このページの一般的な infoType 検出器と特定の infoType 検出器をご覧ください。

一般的な infoType と、それらに含まれる特定の infoType の完全なリストについては、一般的な infoType をご覧ください。

収集する必要のない機密情報

ビジネスの各サービスは、そのサービスに必要なデータのみを収集する必要があります。たとえば、ビジネスの特定のサービスでは財務情報を収集する必要がない場合があります。これらのサービスでは、CREDIT_CARD_NUMBERFINANCIAL_ACCOUNT_NUMBER などの infoType 検出器や、業界カテゴリ FINANCE のその他の infoType を有効にすることを検討してください。

収集する必要があるが、チームと広く共有したくない情報

個人情報を収集する正当なユースケースがあるかもしれませんが、チームと広く共有すべきではありません。たとえば、サポート チケットを送信したお客様から、問題解決のために連絡先情報が提供されることがあります。チケットを閲覧するチームの全員に個人情報(PII)が表示されないようにします。タイプ カテゴリ PII で、PHONE_NUMBEREMAIL_ADDRESS などの infoType 検出機能を有効にすることを検討してください。

業界、データのプライバシー、または地域の適用法令の規制の対象となるセンシティブ データのカテゴリ

特定の情報タイプは、発行方法や使用目的から機密情報と見なされます。それ以外の場合、コンテキスト情報とユーザー属性情報は保護対象カテゴリと見なされます。このような種類の情報には、収集、使用、管理方法に関する追加の制限が適用される場合があります。次のカテゴリの infoType 検出器を有効にすることを検討してください。

類似する infoType の選択

類似した infoType 検出器を選択する際は、次の点を考慮してください。

パスポート

特定の国のパスポート ID をスキャンする必要がない場合は、汎用検出器 PASSPORT を選択します。

UK_PASSPORT などの特定の国固有のパスポート検出機能を利用できます。ただし、国固有のパスポート検出器の中には、特定の形式のパスポートや、コンテキストの手がかりがあるパスポートのみを識別できるものもあります。

個人名

人名をスキャンする場合は、ほとんどのユースケースで FIRST_NAMELAST_NAME ではなく PERSON_NAME を使用します。

PERSON_NAME は、人名を検出する検出器です。これには、単語の名前とフルネームが含まれます。この検出機能は、自然言語理解などのさまざまなテクノロジーを使用して、JaneJane SmithJane Marie Smith などの名前を検出します。FIRST_NAMELAST_NAME は、名前の一部を特定しようとするこの検出機能のサブセットです。これらの検出機能の検出結果は、常に PERSON_NAME の検出結果のサブセットです。

日付と時刻

すべての日付をスキャンする必要がない場合は、DATE_OF_BIRTH などのターゲット日付検出器の使用を検討してください。この検出器は、日付が人の生年月日に関連していることを示すコンテキストを特定しようとします。

DATE 検出機能は、コンテキストに関係なく、すべての日付を検出します。また、今日昨日などの相対日付もフラグ設定します。同様に、TIME はすべてのタイムスタンプを見つけようとします。

ロケーション

すべての場所をスキャンする必要がない場合は、LOCATION 検出機能の代わりに STREET_ADDRESS の使用を検討してください。STREET_ADDRESS 検出器は完全修飾されたアドレスの検出を試みます。完全修飾されたアドレスは通常、一般的な場所よりも正確であり、より機密性が高いと見なされます。

LOCATION infoType 検出機能は、コンテキストに関係なく、任意の場所(パリカナダなど)を検出します。

コンテキストが必要な infoType 検出器

多くの infoType 検出器では、一致を特定する前にコンテキストの手がかりが存在する必要があります。組み込みの infoType 検出機能が、フラグ設定を想定しているアイテムにフラグを設定しない場合(それらのアイテムの近くにコンテキストの手がかりがないため)、代わりに GENERIC_ID またはカスタム infoType 検出機能の使用を検討してください。

業界共通の定義がない情報タイプ

一部の情報タイプには、業界共通の定義がありません。たとえば、カルテ番号、口座番号、PIN、セキュリティ コードなどです。これらのタイプについては、GENERIC_IDFINANCIAL_ACCOUNT_NUMBERMEDICAL_RECORD_NUMBER などの infoType の使用を検討してください。これらの検出機能は、エンティティ検出とコンテキストを組み合わせて、機密性の高い要素を検出します。

高レイテンシの infoType 検出器

  • 不要な infoType 検出器は有効にしないでください。以下は特定のシナリオで有用ですが、これらの infoType により、リクエストの実行速度がこれらを含まないリクエストよりもはるかに遅くなる可能性があります。

    • PERSON_NAME
    • FEMALE_NAME
    • MALE_NAME
    • FIRST_NAME
    • LAST_NAME
    • DATE_OF_BIRTH
    • LOCATION
    • STREET_ADDRESS
    • ORGANIZATION_NAME
  • infoType 検出器は常に明示的に指定します。空の infoType リストを使用しないでください。

infoType の使用方法

機密データの保護では、スキャンの構成に含まれる infoType 検出器を使用して、検査の対象と検出結果の変換方法が決定されます。infoType の名前は、スキャン結果の表示や報告時にも使用されます。

たとえば、テキスト ブロックでメールアドレスを検索する場合は、検査構成で EMAIL_ADDRESS infoType 検出機能 を指定します。テキスト ブロックのメールアドレスを秘匿化する場合は、検査構成と匿名化構成の両方で EMAIL_ADDRESS を指定し、そのタイプを秘匿化または変換する方法を示します。

さらに、組み込みの infoType 検出器とカスタム infoType 検出器を組み合わせて、スキャン結果からメールアドレスのサブセットを除外することもできます。まず、INTERNAL_EMAIL_ADDRESS というカスタム infoType を作成し、内部テスト用メールアドレスを除外するように構成します。次に、EMAIL_ADDRESS の結果を含めるようにスキャンを設定しますが、INTERNAL_EMAIL_ADDRESS に一致する結果を除外する除外ルールを含めることができます。カスタム infoType 検出器の除外ルールやその他の機能の詳細については、カスタム infoType 検出器の作成をご覧ください。

機密データの保護には、名前で指定する一連の組み込み infoType 検出器が用意されています。それぞれについては、infoType 検出器リファレンスにリストされています。これらの検出器では、さまざまな手法を使用して各タイプを検出し、分類します。たとえば、パターン一致が必要なタイプ、数学的なチェックサムがあるタイプ、特別な数字制限があるタイプ、検出結果に特定の接頭辞またはコンテキストがあるタイプが存在します。

コンテンツをスキャンするように機密データの保護を設定する場合は、スキャンの構成で使用する infoType 検出器を指定します。

たとえば、次の JSON とコードサンプルは、DLP API への単純なスキャン リクエストを示しています。inspectConfigPHONE_NUMBER 検出器が指定されています。これは機密データの保護に対して、指定された文字列内で電話番号をスキャンするように指示しています。

C#

機密データの保護用のクライアント ライブラリをインストールして使用する方法については、機密データの保護のクライアント ライブラリをご覧ください。

機密データの保護のために認証するには、アプリケーションのデフォルト認証情報を設定します。 詳細については、ローカル開発環境の認証の設定をご覧ください。


using System;
using Google.Api.Gax.ResourceNames;
using Google.Cloud.Dlp.V2;

public class InspectPhoneNumber
{
    public static InspectContentResponse Inspect(
        string projectId,
        string text,
        Likelihood minLikelihood = Likelihood.Possible)
    {
        // Instantiate a client.
        var dlp = DlpServiceClient.Create();

        // Set content item.
        var contentItem = new ContentItem { Value = text };

        // Construct inspect config.
        var inspectConfig = new InspectConfig
        {
            InfoTypes = { new InfoType { Name = "PHONE_NUMBER" } },
            IncludeQuote = true,
            MinLikelihood = minLikelihood
        };

        // Construct a request.
        var request = new InspectContentRequest
        {
            ParentAsLocationName = new LocationName(projectId, "global"),
            InspectConfig = inspectConfig,
            Item = contentItem,
        };

        // Call the API.
        var response = dlp.InspectContent(request);

        // Inspect the results.
        var resultFindings = response.Result.Findings;

        Console.WriteLine($"Findings: {resultFindings.Count}");

        foreach (var f in resultFindings)
        {
            Console.WriteLine("\tQuote: " + f.Quote);
            Console.WriteLine("\tInfo type: " + f.InfoType.Name);
            Console.WriteLine("\tLikelihood: " + f.Likelihood);
        }

        return response;
    }
}

Go

機密データの保護用のクライアント ライブラリをインストールして使用する方法については、機密データの保護のクライアント ライブラリをご覧ください。

機密データの保護のために認証するには、アプリケーションのデフォルト認証情報を設定します。 詳細については、ローカル開発環境の認証の設定をご覧ください。

import (
	"context"
	"fmt"
	"io"

	dlp "cloud.google.com/go/dlp/apiv2"
	"cloud.google.com/go/dlp/apiv2/dlppb"
)

// inspectPhoneNumber demonstrates a simple scan request to the Cloud DLP API.
// Notice that the PHONE_NUMBER detector is specified in inspectConfig,
// which instructs Cloud DLP to scan the given string for a phone number.
func inspectPhoneNumber(w io.Writer, projectID, textToInspect string) error {
	// projectID := "my-project-id"
	// textToInspect := "My phone number is (123) 555-6789"

	ctx := context.Background()

	// Initialize a client once and reuse it to send multiple requests. Clients
	// are safe to use across goroutines. When the client is no longer needed,
	// call the Close method to cleanup its resources.
	client, err := dlp.NewClient(ctx)
	if err != nil {
		return err
	}
	// Closing the client safely cleans up background resources.
	defer client.Close()

	// Create and send the request.
	req := &dlppb.InspectContentRequest{
		Parent: fmt.Sprintf("projects/%s/locations/global", projectID),
		Item: &dlppb.ContentItem{
			DataItem: &dlppb.ContentItem_Value{
				Value: textToInspect,
			},
		},
		InspectConfig: &dlppb.InspectConfig{
			// Specify the type of info the inspection will look for.
			// See https://cloud.google.com/dlp/docs/infotypes-reference
			// for complete list of info types
			InfoTypes: []*dlppb.InfoType{
				{Name: "PHONE_NUMBER"},
			},
			IncludeQuote: true,
		},
	}

	// Send the request.
	resp, err := client.InspectContent(ctx, req)
	if err != nil {
		fmt.Fprintf(w, "receive: %v", err)
		return err
	}

	// Process the results.
	result := resp.Result
	fmt.Fprintf(w, "Findings: %d\n", len(result.Findings))
	for _, f := range result.Findings {
		fmt.Fprintf(w, "\tQuote: %s\n", f.Quote)
		fmt.Fprintf(w, "\tInfo type: %s\n", f.InfoType.Name)
		fmt.Fprintf(w, "\tLikelihood: %s\n", f.Likelihood)
	}
	return nil
}

Java

機密データの保護用のクライアント ライブラリをインストールして使用する方法については、機密データの保護のクライアント ライブラリをご覧ください。

機密データの保護のために認証するには、アプリケーションのデフォルト認証情報を設定します。 詳細については、ローカル開発環境の認証の設定をご覧ください。


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.Finding;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InspectConfig;
import com.google.privacy.dlp.v2.InspectContentRequest;
import com.google.privacy.dlp.v2.InspectContentResponse;
import com.google.privacy.dlp.v2.Likelihood;
import com.google.privacy.dlp.v2.LocationName;
import java.io.IOException;

public class InspectPhoneNumber {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String textToInspect = "My name is Gary and my email is gary@example.com";
    inspectString(projectId, textToInspect);
  }

  // Inspects the provided text.
  public static void inspectString(String projectId, String textToInspect) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {
      // Specify the type and content to be inspected.
      ContentItem item = ContentItem.newBuilder().setValue(textToInspect).build();

      // Specify the type of info the inspection will look for.
      // See https://cloud.google.com/dlp/docs/infotypes-reference for complete list of info types
      InfoType infoType = InfoType.newBuilder().setName("PHONE_NUMBER").build();

      // Construct the configuration for the Inspect request.
      InspectConfig config =
          InspectConfig.newBuilder()
              .setIncludeQuote(true)
              .setMinLikelihood(Likelihood.POSSIBLE)
              .addInfoTypes(infoType)
              .build();

      // Construct the Inspect request to be sent by the client.
      InspectContentRequest request =
          InspectContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(item)
              .setInspectConfig(config)
              .build();

      // Use the client to send the API request.
      InspectContentResponse response = dlp.inspectContent(request);

      // Parse the response and process results
      System.out.println("Findings: " + response.getResult().getFindingsCount());
      for (Finding f : response.getResult().getFindingsList()) {
        System.out.println("\tQuote: " + f.getQuote());
        System.out.println("\tInfo type: " + f.getInfoType().getName());
        System.out.println("\tLikelihood: " + f.getLikelihood());
      }
    }
  }
}

Node.js

機密データの保護用のクライアント ライブラリをインストールして使用する方法については、機密データの保護のクライアント ライブラリをご覧ください。

機密データの保護のために認証するには、アプリケーションのデフォルト認証情報を設定します。 詳細については、ローカル開発環境の認証の設定をご覧ください。

// Imports the Google Cloud Data Loss Prevention library
const DLP = require('@google-cloud/dlp');

// Instantiates a client
const dlp = new DLP.DlpServiceClient();

// The project ID to run the API call under
// const projectId = 'my-project';

// The string to inspect
// const string = 'My email is gary@example.com and my phone number is (223) 456-7890.';

// The minimum likelihood required before returning a match
// const minLikelihood = 'LIKELIHOOD_UNSPECIFIED';

// The maximum number of findings to report per request (0 = server maximum)
// const maxFindings = 0;

// The infoTypes of information to match
// See https://cloud.google.com/dlp/docs/concepts-infotypes for more information
// about supported infoTypes.
// const infoTypes = [{ name: 'PHONE_NUMBER' }];

// The customInfoTypes of information to match
// const customInfoTypes = [{ infoType: { name: 'DICT_TYPE' }, dictionary: { wordList: { words: ['foo', 'bar', 'baz']}}},
//   { infoType: { name: 'REGEX_TYPE' }, regex: {pattern: '\\(\\d{3}\\) \\d{3}-\\d{4}'}}];

// Whether to include the matching string
// const includeQuote = true;

async function inspectPhoneNumber() {
  // Construct item to inspect
  const item = {value: string};

  // Construct request
  const request = {
    parent: `projects/${projectId}/locations/global`,
    inspectConfig: {
      infoTypes: infoTypes,
      customInfoTypes: customInfoTypes,
      minLikelihood: minLikelihood,
      includeQuote: includeQuote,
      limits: {
        maxFindingsPerRequest: maxFindings,
      },
    },
    item: item,
  };

  // Run request
  const [response] = await dlp.inspectContent(request);
  const findings = response.result.findings;
  if (findings.length > 0) {
    console.log('Findings:');
    findings.forEach(finding => {
      if (includeQuote) {
        console.log(`\tQuote: ${finding.quote}`);
      }
      console.log(`\tInfo type: ${finding.