API를 사용하여 Cloud Storage에 저장된 민감한 정보 익명화

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
{}

이 페이지에서는 Cloud Data Loss Prevention API를 사용하여 Cloud Storage에 저장된 민감한 정보를 익명화하는 방법을 설명합니다.

이 작업을 통해 비즈니스 프로세스에 사용되는 파일에 PII(개인 식별 정보)와 같은 민감한 정보가 포함되지 않도록 할 수 있습니다. Cloud Data Loss Prevention은 Cloud Storage 버킷의 파일에 민감한 정보가 있는지 검사하고 별도의 버킷에 해당 파일에 대한 익명화된 사본을 만들 수 있습니다. 그런 다음 비즈니스 프로세스에서 익명화된 사본을 사용할 수 있습니다.

스토리지에 있는 데이터를 익명화할 때 발생하는 작업에 대한 자세한 내용은 스토리지의 민감한 정보 익명화를 참조하세요.

시작하기 전에

이 페이지의 필요 조건은 다음과 같습니다.

이 작업의 제한사항 및 고려사항에 대해 알아보세요.

스토리지 분류에는 다음 OAuth 범위가 필요합니다. https://www.googleapis.com/auth/cloud-platform 자세한 내용은 DLP API 인증을 참조하세요.

필요한 IAM 역할

이 작업의 모든 리소스가 동일한 프로젝트에 있으면 서비스 에이전트의 DLP API 서비스 에이전트 역할(roles/dlp.serviceAgent)만 있으면 됩니다. 이 역할을 사용하여 다음을 수행할 수 있습니다.

  • 검사 작업 만들기
  • 입력 디렉터리의 파일 읽기
  • 익명화된 파일을 출력 디렉터리에 쓰기
  • BigQuery 테이블에 변환 세부정보 쓰기

관련 리소스에는 검사 작업, 익명화 템플릿, 입력 버킷, 출력 버킷, 변환 세부정보 테이블이 포함됩니다.

별도의 프로젝트에 리소스가 있어야 하는 경우 프로젝트의 서비스 에이전트에도 다음 역할이 있는지 확인합니다.

  • 입력 버킷 또는 이를 포함하는 프로젝트에 대한 스토리지 객체 뷰어 역할(roles/storage.objectViewer)
  • 출력 버킷 또는 이를 포함하는 프로젝트에 대한 스토리지 객체 생성자 역할(roles/storage.objectCreator)
  • 변환 세부정보 테이블 또는 이를 포함하는 프로젝트에 대한 BigQuery 데이터 편집자 역할(roles/bigquery.dataEditor)

Google 관리형 서비스 계정인 서비스 에이전트에 역할을 부여하려면 단일 역할 부여를 참조하세요. 다음 수준에서도 액세스를 제어할 수 있습니다.

API 개요

Cloud Storage에 저장된 콘텐츠를 익명화하려면 지정한 기준에 따라 민감한 정보를 찾는 검사 작업을 구성합니다. 그런 다음 검사 작업 내에서 Deidentify 작업 형식으로 익명화 안내를 제공합니다.

버킷에서 파일의 하위 집합만 스캔하려면 작업이 스캔하는 파일을 제한할 수 있습니다. 익명화를 사용하는 작업에 지원되는 옵션은 유형(FileType) 및 정규 표현식(FileSet)에 따른 파일 필터링입니다.

Deidentify 작업을 사용 설정하면 기본적으로 Cloud DLP가 스캔에 포함된 모든 지원되는 파일 형식을 변환합니다. 그러나 지원되는 파일 형식의 하위 집합만 변환하도록 작업을 구성할 수 있습니다.

선택사항: 익명화 템플릿 만들기

발견 항목의 변환 방법을 제어하려면 다음 템플릿을 만듭니다. 이러한 템플릿은 구조화된 파일, 구조화되지 않은 파일, 이미지의 발견 항목 변환에 대한 안내를 제공합니다.

  • 익명화 템플릿: 자유 형식 텍스트 파일과 같이 구조화되지 않은 파일에 사용할 기본 DeidentifyTemplate입니다. 이 유형의 DeidentifyTemplate은 구조화된 콘텐츠에만 지원되는 RecordTransformations 객체를 포함할 수 없습니다. 이 템플릿이 없으면 Cloud DLP가 ReplaceWithInfoTypeConfig 메서드를 사용하여 구조화되지 않은 파일을 변환합니다.

  • 구조화된 익명화 템플릿: CSV 파일과 같이 구조화된 파일에 사용할 DeidentifyTemplate입니다. 이 DeidentifyTemplate에는 RecordTransformations가 포함될 수 있습니다. 이 템플릿이 없으면 사용자가 만든 기본 익명화 템플릿이 Cloud DLP에 사용됩니다. 이 템플릿이 없으면 Cloud DLP가 ReplaceWithInfoTypeConfig 메서드를 사용하여 구조화된 파일을 변환합니다.

  • 이미지 수정 템플릿: 이미지에 사용할 DeidentifyTemplate입니다. 이 템플릿에는 ImageTransformations 객체가 포함되어야 합니다. 이 템플릿이 없으면 Cloud DLP가 이미지의 모든 발견 항목을 검은색 상자로 수정합니다.

익명화 템플릿 만들기에 대해 자세히 알아보세요.

익명화 작업이 포함된 검사 작업 만들기

DlpJob 객체는 검사 대상, 민감한 항목으로 플래그 지정할 데이터 형식, 발견 항목에 수행할 작업에 대한 안내를 제공합니다. Cloud Storage 디렉터리에서 민감한 정보를 익명화하려면 DlpJob에서 최소한 다음을 정의해야 합니다.

  • StorageConfig 객체: 검사할 Cloud Storage 디렉터리를 지정합니다.
  • InspectConfig 객체: 찾으려는 데이터 형식과 민감한 정보를 찾는 방법에 대한 추가 검사 안내를 포함합니다.
  • 다음을 포함하는 Deidentify 작업:

    • TransformationConfig 객체: 구조화된 파일과 구조화되지 않은 파일의 데이터를 익명화하기 위해 생성된 템플릿을 지정합니다. 이미지에서 민감한 정보를 수정하는 구성을 포함할 수도 있습니다.

      TransformationConfig 객체를 포함하지 않으면 Cloud DLP가 텍스트의 민감한 정보를 infoType으로 바꿉니다. 이미지에서는 검은색 상자로 민감한 정보를 덮습니다.

    • TransformationDetailsStorageConfig 객체: Cloud DLP가 각 변환에 대한 세부정보를 저장해야 하는 BigQuery 테이블을 지정합니다. 각 변환의 세부정보에는 설명, 성공 또는 오류 코드, 오류 세부정보, 변환된 바이트 수, 변환된 콘텐츠의 위치, Cloud DLP가 변환을 수행한 검사 작업의 이름이 포함됩니다. 이 표에는 실제 익명화된 콘텐츠가 저장되지 않습니다.

복사된 콘텐츠가 익명화된 다음 익명화 작업이 완료됩니다. 작업에는 지정된 변환이 적용된 횟수에 대한 요약이 포함되어 있으며, DlpJobprojects.dlpJobs.get 메서드를 사용하여 검색할 수 있습니다. 반환된 DlpJob에는 DeidentifyDataSourceDetails 객체와 InspectDataSourceDetails 객체가 모두 포함됩니다. 이러한 객체에는 각각 Deidentify 작업 및 검사 작업 결과가 모두 포함됩니다.

DlpJobTransformationDetailsStorageConfig 객체를 포함하면 변환 세부정보에 대한 메타데이터가 포함된 BigQuery 테이블이 생성됩니다. 발생하는 각 변환에 대해 Cloud DLP가 하나의 메타데이터 행을 테이블에 기록합니다. 테이블 콘텐츠에 대한 자세한 내용은 변환 세부정보 참조를 확인하세요.

코드 예시

다음 JSON 예시는 Cloud Storage 디렉터리에서 파일을 익명화하는 방법을 보여줍니다.

HTTP 메서드 및 URL

POST https://dlp.googleapis.com/v2/projects/PROJECT_ID/dlpJobs

JSON 입력

{
   "inspect_job": {
     "storage_config": {
       "cloud_storage_options": {
         "file_set": {
           "url": "INPUT_DIRECTORY"
         }
       }
     },
     "inspect_config": {
       "info_types": [
         {
           "name": "PERSON_NAME"
         }
       ]
     },
     "actions": {
       "deidentify": {
         "cloud_storage_output": "OUTPUT_DIRECTORY",
         "transformation_config": {
           "deidentify_template": "DEIDENTIFY_TEMPLATE_NAME",
           "structured_deidentify_template": "STRUCTURED_DEIDENTIFY_TEMPLATE_NAME",
           "image_redact_template": "IMAGE_REDACTION_TEMPLATE_NAME"
         },
         "transformation_details_storage_config": {
           "table": {
             "project_id": "TRANSFORMATION_DETAILS_PROJECT_ID",
             "dataset_id": "TRANSFORMATION_DETAILS_DATASET_ID",
             "table_id": "TRANSFORMATION_DETAILS_TABLE_ID"
           }
         },
         "fileTypesToTransform": ["IMAGE","CSV", "TEXT_FILE"]
       }
     }
   }
 }

다음을 바꿉니다.

  • PROJECT_ID: 검사 작업을 저장할 프로젝트 ID입니다.
  • INPUT_DIRECTORY: 검사할 Cloud Storage 디렉터리입니다(예: gs://input-bucket/folder1/folder1a). URL이 후행 슬래시로 끝나면 INPUT_DIRECTORY 내의 하위 디렉터리가 스캔되지 않습니다.
  • OUTPUT_DIRECTORY: 익명화된 파일을 저장할 Cloud Storage 디렉터리입니다. 이 디렉터리는 INPUT_DIRECTORY와 같은 Cloud Storage 버킷에 없어야 합니다.
  • DEIDENTIFY_TEMPLATE_NAME: 비구조화된 파일 및 구조화된 파일에 대해 기본 익명화 템플릿을 만든 경우 이에 대한 전체 리소스 이름입니다. 이 값은 projects/projectName/(locations/locationId)/deidentifyTemplates/templateName 형식이어야 합니다.
  • STRUCTURED_DEIDENTIFY_TEMPLATE_NAME: 구조화된 파일에 대해 익명화 템플릿을 만든 경우 이에 대한 전체 리소스 이름입니다. 이 값은 projects/projectName/(locations/locationId)/deidentifyTemplates/templateName 형식이어야 합니다.
  • IMAGE_REDACTION_TEMPLATE_NAME: 이미지에 대해 이미지 수정 템플릿을 만든 경우 이에 대한 전체 리소스 이름입니다. 이 값은 projects/projectName/(locations/locationId)/deidentifyTemplates/templateName 형식이어야 합니다.
  • TRANSFORMATION_DETAILS_PROJECT_ID: 변환 세부정보를 저장할 프로젝트의 ID입니다.
  • TRANSFORMATION_DETAILS_DATASET_ID: 변환 세부정보를 저장할 BigQuery 데이터 세트의 ID입니다. 테이블 ID를 제공하지 않으면 시스템에서 자동으로 생성됩니다.
  • TRANSFORMATION_DETAILS_TABLE_ID: 변환 세부정보를 저장할 BigQuery 테이블의 ID입니다.

이전 JSON 예시에서 다음 사항에 유의하세요.

  • inspectJob: 작업의 구성 객체입니다(DlpJob). 이 객체에는 검사 및 익명화 단계의 구성이 모두 포함됩니다.
  • storageConfig: 검사할 콘텐츠의 위치입니다(StorageConfig). 이 예시에서는 Cloud Storage 버킷 CloudStorageOptions를 지정합니다.
  • inspectConfig: InspectConfig에 대해 검사할 민감한 정보에 대한 정보입니다. 이 예시에서는 기본 제공 infoType PERSON_NAME과 일치하는 콘텐츠를 검사합니다.
  • actions: 작업의 검사 부분이 완료된 후 수행할 작업입니다(Action).
  • deidentify: 이 작업을 지정하면 Cloud DLP가 Deidentify 내부에 지정된 구성에 따라 일치하는 민감한 정보를 익명화합니다.
  • cloud_storage_output: 검사할 Cloud Storage 디렉터리의 URL을 지정합니다.
  • transformation_config: Cloud DLP가 구조화된 파일, 구조화되지 않은 파일, 이미지(TransformationConfig)에서 민감한 정보를 익명화하는 방법을 지정합니다.

    TransformationConfig 객체를 포함하지 않으면 Cloud DLP가 텍스트의 민감한 정보를 infoType으로 바꿉니다. 이미지에서는 검은색 상자로 민감한 정보를 덮습니다.

  • transformation_details_storage_config: Cloud DLP가 이 작업에 수행하는 각 변환에 대한 메타데이터를 저장하도록 지정합니다. 또한 Cloud DLP가 해당 메타데이터를 저장해야 하는 테이블의 위치와 이름을 지정합니다(TransformationDetailsStorageConfig).

  • fileTypesToTransform: 익명화 작업을 나열된 파일 형식으로만 제한합니다. 이 필드를 설정하지 않으면 검사 작업에 포함된 모든 지원되는 파일 형식이 익명화 작업에도 포함됩니다. 이 예시에서 지원되는 모든 파일 형식을 검사하도록 DlpJob을 구성한 경우에도 Cloud DLP가 이미지, CSV, 텍스트 파일만 익명화합니다.

검사 작업 만들기

검사 작업(DlpJob)을 만들려면 projects.dlpJobs.create 요청을 전송합니다. cURL을 사용하여 요청을 전송하려면 이전 예시를 JSON 파일로 저장하고 다음 명령어를 실행합니다.

curl -s \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: PROJECT_ID" \
https://dlp.googleapis.com/v2/projects/PROJECT_ID/dlpJobs \
-d @PATH_TO_JSON_FILE

다음을 바꿉니다.

  • PROJECT_ID: DlpJob을 저장한 프로젝트의 ID입니다.
  • PATH_TO_JSON_FILE: 요청 본문이 포함된 JSON 파일의 경로입니다.

Cloud DLP가 새로 생성된 DlpJob의 식별자, 상태, 설정한 검사 구성의 스냅샷을 반환합니다.

{
  "name": "projects/PROJECT_ID/dlpJobs/JOB_ID",
  "type": "INSPECT_JOB",
  "state": "PENDING",
  ...
}

검사 작업 결과 검색

DlpJob 결과를 검색하려면 projects.dlpJobs.get 요청을 전송합니다.

curl -s \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: PROJECT_ID" \
https://dlp.googleapis.com/v2/projects/PROJECT_ID/dlpJobs/JOB_ID

다음을 바꿉니다.

  • PROJECT_ID: DlpJob을 저장한 프로젝트의 ID입니다.
  • JOB_ID: DlpJob을 만들 때 반환된 작업의 ID입니다.

작업이 완료되면 다음과 비슷한 응답이 표시됩니다.

{
  "name": "projects/PROJECT_ID/dlpJobs/JOB_ID",
  "type": "INSPECT_JOB",
  "state": "DONE",
  "inspectDetails": {
    "requestedOptions": {
      "snapshotInspectTemplate": {},
      "jobConfig": {
        "storageConfig": {
          "cloudStorageOptions": {
            "fileSet": {
              "url": "INPUT_DIRECTORY"
            }
          }
        },
        "inspectConfig": {
          "infoTypes": [
            {
              "name": "PERSON_NAME"
            }
          ],
          "limits": {}
        },
        "actions": [
          {
            "deidentify": {
              "transformationDetailsStorageConfig": {
                "table": {
                  "projectId": "TRANSFORMATION_DETAILS_PROJECT_ID",
                  "datasetId": "TRANSFORMATION_DETAILS_DATASET_ID",
                  "tableId": "TRANSFORMATION_DETAILS_TABLE_ID"
                }
              },
              "transformationConfig": {
                "deidentifyTemplate": "DEIDENTIFY_TEMPLATE_NAME",
                "structuredDeidentifyTemplate": "STRUCTURED_DEIDENTIFY_TEMPLATE_NAME",
                "imageRedactTemplate": "IMAGE_REDACTION_TEMPLATE_NAME"
              },
              "fileTypesToTransform": [
                "IMAGE",
                "CSV",
                "TEXT_FILE"
              ],
              "cloudStorageOutput": "OUTPUT_DIRECTORY"
            }
          }
        ]
      }
    },
    "result": {
      "processedBytes": "25242",
      "totalEstimatedBytes": "25242",
      "infoTypeStats": [
        {
          "infoType": {
            "name": "PERSON_NAME"
          },
          "count": "114"
        }
      ]
    }
  },
  "createTime": "2022-06-09T23:00:53.380Z",
  "startTime": "2022-06-09T23:01:27.986383Z",
  "endTime": "2022-06-09T23:02:00.443536Z",
  "actionDetails": [
    {
      "deidentifyDetails": {
        "requestedOptions": {
          "snapshotDeidentifyTemplate": {
            "name": "DEIDENTIFY_TEMPLATE_NAME",
            "createTime": "2022-06-09T17:46:34.208923Z",
            "updateTime": "2022-06-09T17:46:34.208923Z",
            "deidentifyConfig": {
              "infoTypeTransformations": {
                "transformations": [
                  {
                    "primitiveTransformation": {
                      "characterMaskConfig": {
                        "maskingCharacter": "*",
                        "numberToMask": 25
                      }
                    }
                  }
                ]
              }
            },
            "locationId": "global"
          },
          "snapshotStructuredDeidentifyTemplate": {
            "name": "STRUCTURED_DEIDENTIFY_TEMPLATE_NAME",
            "createTime": "2022-06-09T20:51:12.411456Z",
            "updateTime": "2022-06-09T21:07:53.633149Z",
            "deidentifyConfig": {
              "recordTransformations": {
                "fieldTransformations": [
                  {
                    "fields": [
                      {
                        "name": "Name"
                      }
                    ],
                    "primitiveTransformation": {
                      "replaceConfig": {
                        "newValue": {
                          "stringValue": "[redacted]"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "locationId": "global"
          },
          "snapshotImageRedactTemplate": {
            "name": "IMAGE_REDACTION_TEMPLATE_NAME",
            "createTime": "2022-06-09T20:52:25.453564Z",
            "updateTime": "2022-06-09T20:52:25.453564Z",
            "deidentifyConfig": {},
            "locationId": "global"
          }
        },
        "deidentifyStats": {
          "transformedBytes": "3972",
          "transformationCount": "110"
        }
      }
    }
  ],
  "locationId": "global"
}

다음 단계