Cloud Healthcare API 데이터 세트에 고객 관리 암호화 키(CMEK) 사용 설정

기본적으로 Google Cloud는 Google에서 관리하는 암호화 키를 사용하여 데이터를 저장할 때 자동으로 암호화합니다. 데이터를 보호하는 키와 관련된 특정 규정 준수 또는 규제 기관 요구사항이 있으면 Cloud Healthcare API 데이터 세트에 고객 관리 암호화 키(CMEK)를 사용하면 됩니다. Google에서 데이터를 보호하는 암호화 키를 소유하고 관리하는 것이 아니라 개발자가 Cloud Key Management Service(Cloud KMS)에서 제어하고 관리하는 키를 통해 Cloud Healthcare API 데이터 세트가 암호화됩니다.

CMEK를 사용 설정하는 시기와 이유를 포함한 일반적인 CMEK에 대한 자세한 내용은 고객 관리 암호화 키(CMEK)를 참조하세요.

시작하기 전에

Cloud Healthcare API 데이터 세트와 Cloud KMS가 같은 Google Cloud 프로젝트 또는 다른 Google Cloud 프로젝트에 있는지 결정합니다. 자세한 내용은 업무분장을 참조하세요.

이 문서를 위해 다음 규칙이 사용됩니다.

  • PROJECT_ID: Cloud Healthcare API 프로젝트 ID
  • KMS_PROJECT_ID: Cloud KMS가 실행되는 프로젝트 ID로, PROJECT_ID와 동일할 수 있음

Google Cloud 프로젝트 ID와 프로젝트 번호에 대한 자세한 내용은 프로젝트 식별을 참조하세요.

제한사항

  • Cloud Healthcare API 데이터 세트를 만드는 경우에만 Cloud KMS 키를 사용할 수 있습니다. 기존 Cloud Healthcare API 데이터 세트에서 Cloud KMS 키를 사용 설정, 변경 또는 중지할 수 없습니다.
  • CMEK로 암호화된 데이터 세트에서는 FHIR, DICOM, HL7v2 저장소만 지원됩니다. CMEK 보호는 데이터 세트와 해당 리소스의 DICOM, FHIR, HL7v2 저장소에 적용됩니다.
  • CMEK로 암호화된 리소스를 익명화할 수 없습니다.

CMEK 작업

Cloud KMS 키는 CMEK로 암호화된 리소스를 생성, 읽기, 업데이트 또는 삭제할 때 그리고 결제 또는 키 사용 보장과 같은 운영 태스크에 사용됩니다.

외부 키 고려사항

지원되는 외부 키 관리 파트너 시스템 내에서 관리하는 키를 사용하여 Google Cloud 내에서 데이터를 보호하는 방법은 Cloud 외부 키 관리자를 참조하세요.

Google Cloud 외부에서 관리하는 키를 분실할 경우 Google에서 데이터를 복구할 수 없습니다.

키 사용 불가 및 데이터 손실

데이터 세트가 키로 암호화되어 있고 해당 키를 사용할 수 없게 되어 사용할 수 없는 상태로 유지되면 Cloud Healthcare API는 데이터 세트를 중지하고 결국 삭제합니다. 키가 중지 또는 폐기되거나 취소된 권한으로 인해 키에 액세스할 수 없으면 키를 사용할 수 없게 되지만 어떤 이유로든 키를 사용할 수 없으면 이러한 동작이 발생합니다. 키의 보호 수준 또는 외부 키인지 여부는 이 동작에 영향을 미치지 않습니다. 외부 키도 예기치 않게 사용할 수 없게 될 수 있습니다. 예를 들어 Google Cloud 리소스와 EKM 사이에서 연결 문제가 발생할 수 있습니다.

다음 프로세스에서는 키 가용성을 확인하는 방법과 데이터 세트를 중지하고 삭제하는 방법을 설명합니다.

  1. CMEK로 암호화된 Cloud Healthcare API 데이터 세트가 생성되면 Cloud Healthcare API는 5분마다 키 상태를 확인하여 키를 사용할 수 있는지 확인합니다. 키를 사용할 수 없으면 Cloud Healthcare API가 최대 1시간 동안 데이터 세트에 대한 요청을 계속 지원합니다.

  2. 1시간 후에도 Cloud Healthcare API가 여전히 Cloud KMS와 연결할 수 없으면 Cloud Healthcare API 데이터 세트가 보호 조치로 중지됩니다. Cloud Healthcare API 데이터 세트를 다시 사용 설정하려면 지원 담당자에게 문의하세요.

    중지되면 datasets.getdatasets.delete 요청만 Cloud Healthcare API 데이터 세트에 전송할 수 있습니다. 다른 요청은 400 FAILED_PRECONDITION 오류가 발생하면서 실패합니다.

  3. Cloud Healthcare API 데이터 세트가 30일 넘게 사용할 수 없는 상태로 유지되면 영구 삭제됩니다. 데이터 세트의 모든 DICOM, FHIR, HL7v2 저장소와 관련 데이터도 삭제됩니다. 삭제된 데이터는 복구할 수 없습니다.

키 만들기

다음 섹션에서는 Cloud KMS 키링과 키를 만드는 방법을 설명합니다. Cloud KMS 대칭 암호화 키만 지원됩니다.

지원되는 위치

Cloud KMS 키는 Cloud Healthcare API 위치에서 제공됩니다. Cloud Healthcare API 데이터 세트의 리전이나 멀티 리전과 일치하는 위치에 키링을 만듭니다.

  • 모든 멀티 리전 Cloud Healthcare API 데이터 세트는 일치하는 위치의 멀티 리전 키링을 사용해야 합니다. 예를 들어 us 리전의 Cloud Healthcare API 데이터 세트를us 리전의 키링으로 보호해야 하고 eu 리전의 Cloud Healthcare API 데이터 세트를 europe 리전의 키링으로 보호해야 합니다.

  • 리전 Cloud Healthcare API 데이터 세트는 일치하는 리전 키를 사용해야 합니다. 예를 들어 asia-northeast1 리전의 Cloud Healthcare API 데이터 세트를 asia-northeast1 리전의 키링으로 보호해야 합니다.

  • Cloud Healthcare API 데이터 세트에 CMEK를 구성할 때는 global 리전을 사용할 수 없습니다.

자세한 내용은 Cloud Healthcare API 위치Cloud KMS 위치를 참조하세요.

키링 및 키 만들기

Cloud KMS가 실행되는 Google Cloud 프로젝트에서 다음 단계를 완료합니다.

  1. 키링을 만듭니다.
  2. 키 만들기

암호화 및 복호화 권한 부여

Cloud KMS 키로 Cloud Healthcare API 데이터를 보호하려면 Cloud Healthcare 서비스 에이전트 서비스 계정에 해당 키에 대한 CryptoKey 암호화/복호화(roles/cloudkms.cryptoKeyEncrypterDecrypter) 역할을 부여합니다. 자세한 내용은 데이터 세트 CMEK 권한을 참조하세요.

서비스 계정에 역할을 부여하면 Cloud Healthcare API에서 CMEK로 암호화된 리소스를 암호화하고 복호화할 수 있습니다. 애플리케이션은 데이터를 읽거나 쓸 때 키를 지정할 필요가 없습니다. Cloud Healthcare API는 암호화를 처리합니다.

요청자가 Cloud KMS 키로 암호화된 객체를 읽거나 쓸 때는 평소처럼 객체에 액세스합니다. 요청 중에 서비스 에이전트는 다음 조건이 모두 충족되면 요청된 객체를 자동으로 암호화하거나 복호화합니다.

  • 서비스 에이전트에는 여전히 필요한 권한이 포함됩니다.
  • 키가 사용 가능하고 사용 설정되어 있습니다.

CMEK로 암호화된 Cloud Healthcare API 데이터 세트 만들기

다음 샘플에서는 CMEK로 암호화된 데이터 세트를 만드는 방법을 보여줍니다.

데이터 세트를 만들 때 Cloud KMS 키 리소스 ID를 지정해야 합니다. 이 키는 대소문자를 구분하며 다음과 같은 형식입니다.

projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME

Cloud KMS 키 리소스 ID를 보려면 Cloud KMS 리소스 ID 가져오기를 참조하세요.

콘솔

  1. Google Cloud 콘솔에서 브라우저 페이지로 이동합니다.

    브라우저로 이동

  2. 데이터 세트 만들기를 클릭합니다. 데이터 세트 만들기 페이지가 표시됩니다.

  3. 이름 필드에 데이터 세트 허용 문자 및 크기 요구사항에 따라 데이터 세트 식별자를 입력합니다.

  4. 다음 위치 유형 중 하나를 선택합니다.

    • Region 사용). 데이터 세트가 Google Cloud 리전 하나 내에 영구적으로 있습니다. 이 옵션을 선택한 후 리전 필드에 위치를 입력하거나 선택합니다.

    • 멀티 리전. 데이터 세트는 여러 Google Cloud 리전에 걸쳐 있는 위치 내에 영구적으로 있습니다. 이 옵션을 선택한 후 멀티 리전 필드에 멀티 리전 위치를 입력하거나 선택합니다.

  5. 암호화 섹션에서 다음 암호화 유형 중 하나를 선택합니다.

    • Google 관리 암호화 키: 기본 암호화 방법입니다. Google에서 이 Cloud Healthcare API 데이터 세트의 데이터를 보호하는 암호화 키를 관리하게 하려면 이 방법을 사용합니다.

    • Cloud KMS 키: 고객 관리 암호화 키(CMEK)를 사용합니다.

  6. 만들기를 클릭합니다. 브라우저 페이지가 표시됩니다. 새 데이터 세트가 데이터 세트 목록에 표시됩니다.

gcloud

gcloud healthcare datasets create 명령어를 사용하여 데이터 세트를 만듭니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud healthcare datasets create DATASET_ID \
  --location=LOCATION \
  --encryption-key=KEY_RESOURCE_ID

Windows(PowerShell)

gcloud healthcare datasets create DATASET_ID `
  --location=LOCATION `
  --encryption-key=KEY_RESOURCE_ID

Windows(cmd.exe)

gcloud healthcare datasets create DATASET_ID ^
  --location=LOCATION ^
  --encryption-key=KEY_RESOURCE_ID

다음과 비슷한 응답이 표시됩니다.

Create request issued for: [DATASET_ID]
Waiting for operation [projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID] to complete...
Created dataset [DATASET_ID].

REST

  1. datasets.create 메서드를 사용하여 데이터 세트를 만듭니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    JSON 요청 본문:

    {
      "encryptionSpec": {
        "kmsKeyName": "KEY_RESOURCE_ID"
      }
    }
    

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    cat > request.json << 'EOF'
    {
      "encryptionSpec": {
        "kmsKeyName": "KEY_RESOURCE_ID"
      }
    }
    EOF

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets?datasetId=DATASET_ID"

    PowerShell

    요청 본문을 request.json 파일에 저장합니다. 터미널에서 다음 명령어를 실행하여 현재 디렉터리에 이 파일을 만들거나 덮어씁니다.

    @'
    {
      "encryptionSpec": {
        "kmsKeyName": "KEY_RESOURCE_ID"
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    그런 후 다음 명령어를 실행하여 REST 요청을 전송합니다.

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets?datasetId=DATASET_ID" | Select-Object -Expand Content

    API 탐색기

    요청 본문을 복사하고 메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 요청 본문을 이 도구에 붙여넣고 다른 필수 필드를 입력한 후 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에는 장기 실행 작업(LRO)의 식별자가 포함됩니다. 장기 실행 작업은 메서드 호출을 완료하는 데 추가 시간이 걸릴 수 있는 경우에 반환됩니다. OPERATION_ID의 값을 확인합니다. 다음 단계에서 이 값이 필요합니다.

  2. projects.locations.datasets.operations.get 메서드를 사용하여 장기 실행 작업의 상태를 가져옵니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID
    • LOCATION: 데이터 세트 위치
    • DATASET_ID: 데이터 세트 ID
    • OPERATION_ID: 장기 실행 작업에서 반환된 ID

    요청을 보내려면 다음 옵션 중 하나를 선택합니다.

    curl

    다음 명령어를 실행합니다.

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    다음 명령어를 실행합니다.

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API 탐색기

    메서드 참조 페이지를 엽니다. 페이지 오른쪽에 API 탐색기 패널이 열립니다. 이 도구를 사용하여 요청을 보낼 수 있습니다. 모든 필수 필드를 입력하고 실행을 클릭합니다.

    출력은 다음과 같습니다. 응답에 "done": true가 포함되었으면 장기 실행 작업이 완료된 것입니다.

데이터 세트가 Cloud KMS로 보호되는지 확인

만들거나 Cloud Healthcare API 데이터 세트를 보호하는 각 키에서 키가 키 사용 추적으로 보호하는 리소스를 확인할 수 있습니다. 자세한 내용은 키 사용량 보기를 참조하세요.

키 순환

Cloud KMS는 새 버전으로의 자동 및 수동 키 순환을 모두 지원합니다.

키를 순환하면 다음과 같은 결과가 발생합니다.

  • 순환 후에 생성된 Cloud Healthcare API 데이터 세트는 암호화와 모든 작업에 새로운 키 버전을 사용합니다.
  • 키로 암호화된 기존 데이터 세트의 리소스는 자동으로 새 기본 키 버전으로 다시 암호화되지 않습니다.

암호화가 작동하려면 모든 키 버전을 사용할 수 있어야 합니다. 그렇지 않으면 Cloud Healthcare API 데이터 세트가 중지되고 데이터 세트에 대한 모든 요청이 실패합니다. 자세한 내용은 외부 키 고려사항중지된 데이터 세트 및 영구 데이터 세트 삭제를 참조하세요.

Cloud KMS 키에 대한 Cloud Healthcare API 액세스 권한 삭제

Cloud Healthcare API가 CMEK로 암호화된 데이터에 액세스할 수 없도록 키를 제어하고 키에 대한 권한을 중지, 삭제 또는 취소할 수 있습니다. Cloud Healthcare API 데이터 세트와 연결된 키 또는 키 버전을 삭제한 후에는 해당 키 또는 키 버전으로 암호화된 모든 데이터가 영구적으로 손실됩니다.

키 또는 키 버전을 사용 중지하는 시점과 더 이상 사용할 수 없는 시점 사이에는 지연 시간이 있습니다. 또한 키에 대해 Cloud Healthcare 서비스 에이전트 서비스 계정의 권한을 취소하는 시점과 더 이상 액세스할 수 없는 시점 사이에도 지연 시간이 있습니다. 자세한 내용은 Cloud KMS 리소스 일관성을 참조하세요.

CMEK 지원 인스턴스에 데이터 내보내기 및 가져오기

내보내기 작업 중에 고객 관리 키로 암호화된 데이터를 보존하려면 내보내기를 시작하기 전에 스토리지 대상에 CMEK를 설정해야 합니다. 비CMEK 또는 CMEK로 암호화된 스토리지에서 가져올 때 데이터를 CMEK로 암호화된 데이터 세트에 가져오는 데에는 특별한 요구사항이나 제한사항이 없습니다.

제한사항

가격 책정

데이터 세트 요금은 CMEK로 암호화되었는지 여부에 관계없이 동일하게 청구됩니다. 자세한 내용은 Cloud Healthcare API 가격 책정을 참조하세요.

Cloud KMS는 키 비용과 해당 키에 대한 암호화 작업 비용을 모두 청구합니다. 이러한 작업은 Cloud Healthcare API에서 암호화 또는 복호화에 키를 사용할 때 발생합니다. 이러한 비용은 Cloud Healthcare API에서 생성되는 예상 암호화 작업 수를 기준으로 최소한으로 예상할 수 있습니다. 자세한 내용은 Cloud KMS 가격 책정을 참조하세요.

Cloud KMS 할당량 및 Cloud Healthcare API

Cloud Healthcare API에서 CMEK를 사용하면 프로젝트에서 Cloud KMS 암호화 요청 할당량을 사용할 수 있습니다. CMEK로 암호화된 Cloud Healthcare API 데이터 세트와 DICOM, FHIR, HL7v2 저장소는 datasets.get을 제외한 모든 작업에 이 할당량을 사용합니다. CMEK 키를 사용하는 암호화 및 복호화 작업은 하드웨어(Cloud HSM) 또는 외부(Cloud EKM) 키를 사용하는 경우에만 Cloud KMS 할당량에 영향을 미칩니다. 자세한 내용은 Cloud KMS 할당량을 참조하세요.

다음 단계