고객 제공 암호화 키로 디스크 암호화


이 주제에서는 고객 제공 암호화 키디스크를 암호화하는 방법을 설명합니다.

디스크 암호화에 대한 자세한 내용은 디스크 암호화 정보를 참조하세요.

고객 관리 암호화 키(CMEK)로 디스크를 암호화하는 방법은 Cloud KMS 키를 사용하여 리소스 보호를 참조하세요.

CSEK를 사용하면 자체 암호화 키를 제공하고 Compute Engine에서 키를 사용하여 데이터를 암호화 및 복호화하는 데 사용되는 Google 생성 키를 보호합니다. 올바른 키를 제공할 수 있는 사용자만 고객 제공 암호화 키(CSEK)로 보호되는 리소스를 사용할 수 있습니다.

Google은 사용자의 키를 서버에 저장하지 않으며 사용자가 키를 제공하지 않는 한 보호되는 데이터에 액세스할 수 없습니다. 즉, 사용자가 키를 잊어버리거나 손실한 경우 Google에서 해당 키를 복구하거나 손실된 키로 암호화된 데이터를 복구할 수 없습니다.

영구 디스크를 삭제하면 Google은 데이터를 복구할 수 없도록 암호화 키를 삭제합니다. 이 프로세스는 되돌릴 수 없습니다.

시작하기 전에

  • 디스크, 이미지, 디스크 스냅샷에 대해 알아봅니다.
  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음과 같이 Compute Engine에 인증하면 됩니다.

    이 페이지의 샘플 사용 방법에 대한 탭을 선택하세요.

    콘솔

    Google Cloud 콘솔을 사용하여 Google Cloud 서비스 및 API에 액세스할 때는 인증을 설정할 필요가 없습니다.

    gcloud

    1. Google Cloud CLI를 설치한 후 다음 명령어를 실행하여 초기화합니다.

      gcloud init
    2. 기본 리전 및 영역을 설정합니다.

    Python

    로컬 개발 환경에서 이 페이지의 Python 샘플을 사용하려면 gcloud CLI를 설치 및 초기화한 다음 사용자 인증 정보로 애플리케이션 기본 사용자 인증 정보를 설정하세요.

    1. Google Cloud CLI를 설치합니다.
    2. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

      gcloud init
    3. Google 계정의 로컬 인증 사용자 인증 정보를 만듭니다.

      gcloud auth application-default login

    자세한 내용은 로컬 개발 환경의 인증 설정를 참조하세요.

    REST

    로컬 개발 환경에서 이 페이지의 REST API 샘플을 사용하려면 gcloud CLI에 제공한 사용자 인증 정보를 사용합니다.

      Google Cloud CLI를 설치한 후 다음 명령어를 실행하여 초기화합니다.

      gcloud init

제한사항

CSEK에 다음 제한사항이 적용됩니다.

일반 제한사항

고객 제공 암호화 키의 가용성은 리소스 위치가 아닌 결제 계정의 위치에 따라 다릅니다.

고객 제공 암호화 키는 다음 국가의 결제 계정에 사용할 수 없습니다.

  • 브라질
  • 인도

기술 제한사항

  • 자체 키로는 새 영구 디스크만 암호화할 수 있으며, 기존 영구 디스크를 암호화할 수 없습니다.

  • 로컬 SSD는 VM의 수명보다 오래 지속되지 않으므로 로컬 SSD에 자체 키를 사용할 수 없습니다. 로컬 SSD는 Google에 보관되지 않는 임시 암호화 키로 이미 보호되어 있습니다.

  • Compute Engine은 인스턴스 템플릿에 암호화 키를 저장하지 않으므로, 사용자가 자체 키를 KMS에 저장하여 관리형 인스턴스 그룹의 디스크를 암호화해야 합니다.

  • CSEK 보호 디스크가 연결된 인스턴스는 일시정지할 수 없습니다.

사양

이 섹션에서는 암호화 사양과 CSEK의 형식을 설명합니다.

암호화

Compute Engine에서는 암호화 키를 사용하여 Google 암호화 키를 AES-256 암호화로 보호합니다.

필수 키 형식

사용자가 키를 생성하고 관리해야 하며, RFC 4648 표준 base64로 인코딩된 256비트 문자열인 키를 Compute Engine에 제공해야 합니다.

다음은 'Hello from Google Cloud Platform' 문자열로 생성된 base64로 인코딩된 키의 예입니다.

SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0=

다음 스크립트를 사용하여 생성할 수 있습니다.

read -sp "String:" ; \
    [[ ${#REPLY} == 32 ]] && \
        echo "$(echo -n "$REPLY" | base64)" || \
        (>&2 echo -e "\nERROR:Wrong Size"; false)

RSA 키 래핑

base64로 키를 인코딩하는 것 외에도 Google에서 제공하는 RSA 공개 키 인증서를 사용하여 키를 래핑하고 base64로 키를 인코딩한 후 요청에 해당 키를 사용할 수도 있습니다.

RSA 래핑은 공개 키를 사용하여 데이터를 암호화하는 프로세스입니다. 공개 키로 데이터를 암호화하면 각각의 비공개 키로만 복호화할 수 있습니다. 이 경우 비공개 키는 Google Cloud 서비스에만 알려집니다. RSA 인증서를 사용하여 키를 래핑하면 Google Cloud 서비스에서만 키를 래핑 해제하고 해당 키를 사용하여 데이터를 보호할 수 있습니다.

자세한 내용은 RSA 암호화를 참조하세요.

Compute Engine에 사용할 RSA 래핑 키를 생성하려면 다음을 수행합니다.

  1. Compute Engine에서 관리하는 인증서에 제공된 공개 키를 사용하여 키를 래핑합니다. PKCS #1 v1.5 패딩이 아닌 OAEP 패딩을 사용하여 키를 래핑해야 합니다.
  2. 표준 base64 인코딩을 사용하여 RSA 래핑 키를 인코딩합니다.

Compute Engine에서 유지관리하는 공개 인증서를 다음 위치에서 다운로드합니다.

https://cloud-certs.storage.googleapis.com/google-cloud-csek-ingress.pem

다양한 방법으로 키를 생성하고 RSA 래핑할 수 있습니다. 사용자에게 익숙한 방법을 사용하세요. 다음은 사용 가능한 키 RSA 래핑 방법에 관한 두 가지 예입니다.

예시 1

다음 안내에서는 openssl 명령줄 유틸리티를 사용하여 키를 RSA 래핑하고 인코딩합니다.

  1. 선택 사항: 256비트(32바이트) 임의 키를 생성합니다. 사용할 키가 이미 있는 경우 이 단계를 건너뛸 수 있습니다. 다양한 방법으로 키를 생성할 수 있습니다. 예를 들면 다음과 같습니다.

    $ head -c 32 /dev/urandom | LC_CTYPE=C tr '\n' = > mykey.txt
    
  2. 공개 키 인증서를 다운로드합니다.

    $  curl -s -O -L https://cloud-certs.storage.googleapis.com/google-cloud-csek-ingress.pem
  3. 인증서에서 공개 키를 추출합니다.

    $ openssl x509 -pubkey -noout -in google-cloud-csek-ingress.pem > pubkey.pem
    
  4. 키를 RSA 래핑하고 mykey.txt를 자체 키 파일로 대체합니다.

    $ openssl rsautl -oaep -encrypt -pubin -inkey pubkey.pem -in mykey.txt -out rsawrappedkey.txt
    
  5. RSA 래핑 키를 base64로 인코딩합니다.

    $ openssl enc -base64 -in rsawrappedkey.txt | tr -d '\n' | sed -e '$a\' > rsawrapencodedkey.txt
    

예시 2

다음은 256비트(32바이트) 임의 문자열을 생성하고 암호화 라이브러리를 사용하여 base64로 인코딩된 RSA 래핑 키를 생성하는 샘플 Python 스크립트입니다.

import argparse
import base64
import os
from typing import Optional

from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey
import requests

GOOGLE_PUBLIC_CERT_URL = (
    "https://cloud-certs.storage.googleapis.com/google-cloud-csek-ingress.pem"
)

def get_google_public_cert_key() -> RSAPublicKey:
    """
    Downloads the Google public certificate.

    Returns:
        RSAPublicKey object with the Google public certificate.
    """
    r = requests.get(GOOGLE_PUBLIC_CERT_URL)
    r.raise_for_status()

    # Load the certificate.
    certificate = x509.load_pem_x509_certificate(r.content, default_backend())

    # Get the certicate's public key.
    public_key = certificate.public_key()

    return public_key

def wrap_rsa_key(public_key: RSAPublicKey, private_key_bytes: bytes) -> bytes:
    """
    Use the Google public key to encrypt the customer private key.

    This means that only the Google private key is capable of decrypting
    the customer private key.

    Args:
        public_key: The public key to use for encrypting.
        private_key_bytes: The private key to be encrypted.

    Returns:
        private_key_bytes encrypted using the public_key. Encoded using
        base64.
    """
    wrapped_key = public_key.encrypt(
        private_key_bytes,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA1()),
            algorithm=hashes.SHA1(),
            label=None,
        ),
    )
    encoded_wrapped_key = base64.b64encode(wrapped_key)
    return encoded_wrapped_key

def main(key_file: Optional[str]) -> None:
    """
    This script will encrypt a private key with Google public key.

    Args:
        key_file: path to a file containing your private key. If not
            provided, a new key will be generated (256 bit).
    """
    # Generate a new 256-bit private key if no key is specified.
    if not key_file:
        customer_key_bytes = os.urandom(32)
    else:
        with open(key_file, "rb") as f:
            customer_key_bytes = f.read()

    google_public_key = get_google_public_cert_key()
    wrapped_rsa_key = wrap_rsa_key(google_public_key, customer_key_bytes)

    b64_key = base64.b64encode(customer_key_bytes).decode("utf-8")

    print(f"Base-64 encoded private key: {b64_key}")
    print(f"Wrapped RSA key: {wrapped_rsa_key.decode('utf-8')}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("--key_file", help="File containing your binary private key.")

    args = parser.parse_args()

    main(args.key_file)

이제 키를 사용할 준비가 되었습니다.

RSA 래핑 키 사용

Google Cloud CLI를 사용하여 일반 키와 RSA 래핑 키를 같은 방법으로 제공할 수 있습니다.

API에서 RSA 래핑 키를 대신 사용하려면 rawKey가 아니라 sha256 속성을 사용합니다.

명령줄 도구를 사용하여 CSEK로 리소스 암호화

설정

암호화 키는 Google Cloud CLI를 통해 사용될 수 있습니다.

gcloud를 다운로드하여 설치합니다.

키 파일

gcloud compute 명령줄 도구를 사용하여 키를 설정하면 JSON 목록으로 인코딩된 키를 포함하는 키 파일을 사용하여 인코딩된 키를 제공하게 됩니다. 키 파일에는 여러 키가 포함될 수 있어 단일 위치에서 여러 키를 관리할 수 있습니다. 또는, 단일 키 파일을 생성하여 각 키를 개별적으로 처리할 수 있습니다. 키 파일은 gcloud CLI를 통해서만 사용할 수 있습니다. REST를 사용할 경우 요청에 직접 키를 제공해야 합니다.

키 파일의 각 항목에 다음 사항을 입력해야 합니다.

  • 키가 보호하는 리소스에 대한 정규화된 URI
  • 해당 키
  • 키 유형(raw 또는 rsa-encrypted)

요청에 키 파일을 사용하면 도구에서는 일치하는 리소스를 찾아 해당 키를 사용합니다. 일치하는 리소스가 없는 경우 요청이 실패합니다.

키 파일 예시는 다음과 같습니다.

[
  {
  "uri": "https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/example-disk",
  "key": "acXTX3rxrKAFTF0tYVLvydU1riRZTvUNC4g5I11NY+c=",
  "key-type": "raw"
  },
  {
  "uri": "https://www.googleapis.com/compute/v1/projects/myproject/global/snapshots/my-private-snapshot",
  "key": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA==",
  "key-type": "rsa-encrypted"
  }
]

키 파일 관리에 대한 권장사항

키 파일을 사용하는 경우 파일 액세스 권한을 필요한 사용자로 제한해야 합니다. 파일에 대해 적절한 권한을 설정하고 추가 도구를 사용하여 해당 파일을 암호화하는 것이 좋습니다.

CSEK로 새 영구 디스크 암호화

VM 또는 디스크 생성 중 키를 입력하여 새 영구 디스크를 암호화할 수 있습니다.

콘솔

  1. 디스크 페이지로 이동합니다.

    디스크로 이동

  2. 새 디스크를 클릭하고 새 디스크의 속성을 입력합니다.

  3. 암호화에 있는 고객 제공 키를 선택합니다.

  4. 텍스트 상자에 디스크의 암호화 키를 입력합니다. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.

gcloud

gcloud compute 도구에서 VM 생성 중 --csek-key-file 플래그를 사용하여 디스크를 암호화합니다. RSA 래핑 키를 사용하는 경우 gcloud beta 구성요소를 사용하세요.

gcloud (beta) compute instances create example-instance --csek-key-file example-file.json

독립형 영구 디스크를 암호화하려면 다음을 사용합니다.

gcloud (beta) compute disks create example-disk --csek-key-file example-file.json

REST

diskEncryptionKey 속성을 사용하고 원시(비RSA 래핑) 키의 경우 v1 API에 요청을 수행하고 RSA 래핑 키의 경우 베타 API에 요청을 수행하여 디스크를 암호화할 수 있습니다. 요청에 다음 속성 중 하나를 입력합니다.

  • rawKey: 키가 base64로 인코딩된 경우
  • rsaEncryptedKey: 키가 RSA 래핑 키이고 base64로 인코딩된 경우

예를 들어 VM 생성 중 RSA 래핑 키로 새 디스크를 암호화하려면 다음을 수행합니다.

POST https://compute.googleapis.com/compute/beta/projects/myproject/zones/us-central1-a/instances

{
"machineType": "zones/us-central1-a/machineTypes/e2-standard-2",
"disks": [
 {
  "type": "PERSISTENT",
  "diskEncryptionKey": {
    "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  },
  "initializeParams": {
   "sourceImage": "projects/debian-cloud/global/images/debian-9-stretch-v20170619"
  },
  "boot": true
 }
],
...
}

마찬가지로, REST를 사용하여 새 독립형 영구 디스크를 생성하고 자체 키로 암호화할 수도 있습니다.

POST https://compute.googleapis.com/compute/beta/projects/myproject/zones/
us-central1-a/disks?sourceImage=https%3A%2F%2Fwww.googleapis.com%2Fcompute%2F
alpha%2Fprojects%2Fdebian-cloud%2Fglobal%2Fimages%2Fdebian-9-stretch-v20170619

{
 "name": "new-encrypted-disk-key",
 "diskEncryptionKey": {
   "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  },
 "type": "zones/us-central1-a/diskTypes/pd-standard"
}

CSEK로 암호화된 디스크에서 스냅샷 만들기

암호화된 디스크에서 스냅샷을 생성할 경우 스냅샷도 암호화해야 합니다. 스냅샷을 암호화하려면 키를 지정해야 합니다. 새로운 디스크 이미지와 새로운 영구 디스크를 생성하지 않으면 Compute Engine 기본 암호화를 사용하도록 암호화된 디스크 또는 암호화된 스냅샷을 변환할 수 없습니다.

CSEK로 암호화된 디스크의 스냅샷은 항상 전체 스냅샷입니다. 이것은 증분적으로 수행되는 고객 관리 암호화 키(CMEK)로 암호화된 디스크 스냅샷과 다릅니다. . 스냅샷은 스냅샷의 총 크기를 기준으로 가격이 책정됩니다. 따라서 전체 스냅샷은 증분 스냅샷보다 비용이 많이 들 수 있습니다.

암호화된 디스크에서 영구 디스크 스냅샷을 생성하려면 스냅샷 생성 요청에 영구 디스크를 암호화할 때 사용한 암호화 키를 입력해야 합니다.

스냅샷을 만들기 전에 영구 디스크 스냅샷 권장사항을 살펴보세요.

콘솔

  1. 스냅샷 페이지로 이동

    스냅샷으로 이동

  2. 스냅샷 만들기를 클릭합니다.

  3. 원본 디스크에서 스냅샷을 생성할 암호화된 디스크를 선택합니다.

  4. 텍스트 상자에 디스크의 암호화 키를 입력합니다. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.

  5. 암호화 섹션에 추가 암호화 키를 입력하여 새 스냅샷을 암호화합니다.

REST

요청을 수행하려면 sourceDiskEncryptionKey 속성을 제공하여 소스 영구 디스크에 액세스합니다. snapshotEncryptionKey 속성을 사용하여 새 스냅샷을 암호화해야 합니다.

원시(비RSA 래핑) 키의 경우 v1 API에 요청하고 RSA 래핑 키의 경우 베타 API에 요청합니다.

POST https://compute.googleapis.com/compute/beta/projects/myproject/zones/us-central1-a/disks/example-disk/createSnapshot

{
 "snapshotEncryptionKey":  {
   "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
 },
  "sourceDiskEncryptionKey": {
   "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  },
 "name": "snapshot-encrypted-disk"
}

sourceDiskEncryptionKey 속성은 영구 디스크를 암호화하는 데 사용된 키와 일치해야 합니다. 그렇지 않으면 요청이 실패합니다.

snapshotEncryptionKey를 사용하면 스냅샷을 사용하여 새 영구 디스크를 만드는 경우 일치하는 키를 제공하도록 스냅샷을 암호화하는 키를 제공할 수 있습니다. 이 키는 앞의 키 형식을 따라야 합니다. 이 속성을 정의하지 않은 채로 둘 수 있으며, 스냅샷을 사용하여 키를 요청하지 않고 새 영구 디스크를 만들 수도 있습니다.

디스크 또는 CSEK로 암호화된 커스텀 이미지에서 새 이미지 만들기

암호화된 영구 디스크에서 커스텀 이미지를 생성하거나 암호화된 이미지를 복사할 수 있습니다. 콘솔을 사용하여 이미지를 복사할 수는 없습니다. Google Cloud CLI 또는 REST를 사용하여 이미지를 복사합니다.

콘솔

  1. 이미지 페이지로 이동합니다.

    이미지로 이동

  2. 이미지 만들기를 클릭합니다.

  3. 원본 디스크에서 이미지를 생성할 암호화된 디스크를 선택합니다.

  4. 암호화에서 암호화 키 관리 솔루션을 선택합니다.

  5. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.

gcloud

안내에 따라 이미지를 생성하고, 암호화된 소스 객체의 암호화 키 파일 경로를 사용하여 --csek-key-file 플래그를 추가합니다. RSA 래핑 키를 사용하는 경우 gcloud beta 구성요소를 사용하세요.

gcloud (beta) compute images create .... --csek-key-file example-file.json

키를 사용하여 새 이미지를 암호화하려면 다음과 같이 키를 키 파일에 추가합니다.

[
  {
  "uri": "https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/source-disk",
  "key": "acX3RqzxrKAFTF0tYVLvydU1riRZTvUNC4g5I11NY-c=",
  "key-type": "raw"
  },
  {
  "uri": "https://www.googleapis.com/compute/v1/projects/myproject/global/snapshots/the-new-image",
  "key": "TF0t-cSfl7CT7xRF1LTbAgi7U6XXUNC4zU_dNgx0nQc=",
  "key-type": "raw"
  }
]

REST

API 생성 요청에는 원본 객체의 암호화 키 속성이 포함되어야 합니다. 예를 들어 소스 객체 유형에 따라 다음 속성 중 하나를 포함합니다.

  • 영구 디스크: sourceDiskEncryptionKey
  • 이미지: sourceImageEncryptionKey

또한 키 유형에 따라 rawKey 또는 rsaEncryptedKey 속성을 포함합니다. 원시(비 RSA 래핑) 키의 경우 v1 API에 요청하고 RSA 래핑 키의 경우 베타 API에 요청합니다. 다음 예시에서는 암호화되고 RSA 래핑된 영구 디스크를 동일한 암호화 키를 사용하는 이미지로 변환합니다.

POST https://compute.googleapis.com/compute/beta/projects/myproject/global/images

{
 "name": "image-encrypted-disk",
 "sourceDiskEncryptionKey": {
    "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  }
 "imageEncryptionKey": {
    "rsaEncryptedKey":  "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
    },
 "sourceDisk": "projects/myproject/zones/us-central1-a/disks/source-disks"
}

선택사항인 imageEncryptionKey 속성을 사용하면 이미지를 사용하여 새 영구 디스크를 만드는 경우 일치하는 키를 제공하도록 이미지를 암호화하는 키를 제공할 수 있습니다. 이 키는 위에서 설명한 것과 동일한 키 형식을 따라야 합니다. 이 속성을 정의하지 않은 채로 둘 수 있으며, 이미지를 사용하여 키를 요청하지 않고 새 영구 디스크를 만들 수도 있습니다.

CSEK로 가져온 이미지 암호화

Compute Engine으로 커스텀 이미지를 수동으로 가져올 때 새 이미지를 암호화할 수 있습니다. 이미지를 가져오려면 먼저 디스크 이미지 파일을 만들고 압축한 다음 압축된 파일을 Cloud Storage에 업로드해야 합니다.

암호화할 커스텀 Compute Engine 이미지를 가져옵니다. 압축된 파일에 URI를 지정하고 암호화 키 파일 경로도 지정합니다.

콘솔

  1. 이미지 페이지로 이동합니다.

    이미지로 이동

  2. 이미지 만들기를 클릭합니다.

  3. 소스에서 Cloud Storage 파일을 선택합니다.

  4. Cloud Storage 파일에 Cloud Storage URI를 입력합니다.

  5. 암호화에서 고객 제공 키를 선택하고 텍스트 상자에 이미지를 암호화하는 암호화 키를 지정합니다.

gcloud

compute images create 명령어를 사용하여 새 이미지를 만들고 암호화 키 파일로 --csek-key-file 플래그를 지정합니다. RSA 래핑 키를 사용하는 경우 gcloud beta 구성요소를 사용하세요.

gcloud (beta) compute images create [IMAGE_NAME] \
    --source-uri gs://[BUCKET_NAME]/[COMPRESSED_FILE] \
    --csek-key-file [KEY_FILE]

다음을 바꿉니다.

  • [IMAGE_NAME]: 새 커스텀 이미지의 이름입니다.
  • [BUCKET_NAME]: 압축된 이미지 파일을 보유한 Cloud Storage 버킷의 이름입니다.
  • [COMPRESSED_FILE]: 압축된 이미지 파일의 이름입니다.
  • [KEY_FILE]: 로컬 워크스테이션의 암호화 키 파일에 대한 경로입니다.

REST

RAW 파일에서 생성된 새 이미지를 암호화하려면 새 imageEncryptionKey 속성을 이미지 생성 요청에 추가하고 rawKey 또는 rsaEncryptedKey를 추가합니다. 원시(비 RSA 래핑) 키의 경우 v1 API에 요청하고 RSA 래핑 키의 경우 베타 API에 요청합니다.

POST https://compute.googleapis.com/compute/beta/projects/myproject/global/images

{
"rawDisk": {
 "source": "http://storage.googleapis.com/example-image/example-image.tar.gz"
},
"name": "new-encrypted-image",
"sourceType": "RAW",
"imageEncryptionKey": {
  "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  }
}

CSEK로 암호화된 리소스에서 영구 디스크 만들기

CSEK로 암호화된 스냅샷에서 디스크 만들기

콘솔

  1. 디스크 페이지로 이동합니다.

    디스크로 이동

  2. 디스크 만들기를 클릭합니다.

  3. 소스 유형에서 스냅샷을 선택합니다.

  4. 암호화에서 암호화 키 관리 솔루션을 선택합니다.

  5. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.

gcloud

gcloud compute 도구에서 디스크를 만들 때 --csek-key-file 플래그를 사용하여 스냅샷의 암호화 키를 입력합니다. RSA 래핑 키를 사용하는 경우 gcloud beta 구성요소를 사용하세요.

gcloud (beta) compute disks create ... --source-snapshot example-snapshot --csek-key-file example-file.json

REST

암호화된 스냅샷을 사용하려면 요청에 sourceSnapshotEncryptionKey를 입력한 다음 rawKey 또는 rsaEncryptedKey를 입력합니다. 원시(비 RSA 래핑) 키의 경우 v1 API에 요청하고 RSA 래핑 키의 경우 베타 API에 요청합니다. 암호화된 스냅샷을 사용하여 새 독립형 영구 디스크로 제공하는 예시는 다음과 같습니다.

POST https://compute.googleapis.com/compute/beta/projects/myproject/zones/us-central1-a/disks

{
"name": "disk-from-encrypted-snapshot",
"sourceSnapshot": "global/snapshots/encrypted-snapshot",
"sourceSnapshotEncryptionKey": {
  "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  }
}

CSEK로 암호화된 이미지에서 디스크 만들기

콘솔

  1. 디스크 페이지로 이동합니다.

    디스크로 이동

  2. 디스크 만들기를 클릭합니다.

  3. 소스 유형에서 이미지를 선택합니다.

  4. 암호화에서 암호화 키 관리 솔루션을 선택합니다.

  5. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.

gcloud

gcloud compute 도구에서 디스크를 만들 때 --csek-key-file 플래그를 사용하여 이미지의 암호화 키를 입력합니다. RSA 래핑 키를 사용하는 경우 gcloud beta 구성요소를 사용하세요.

gcloud (beta) compute disks create ... --image example-image --csek-key-file example-file.json

REST

암호화된 이미지를 사용하려면 sourceImageEncryptionKey를 입력한 다음 rawKey 또는 rsaEncryptedKey를 입력합니다. 원시(비 RSA 래핑) 키의 경우 v1 API에 요청하고 RSA 래핑 키의 경우 베타 API에 요청합니다.

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks

{
"name": "disk-from-encrypted-image",
"sourceImageEncryptionKey": {
  "rsaEncryptedKey": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA=="
  },
"sourceImage": "global/images/encrypted-image"
}

CSEK로 암호화된 디스크를 새 VM에 연결

콘솔

  1. 인스턴스 만들기 페이지로 이동

    인스턴스 만들기로 이동

  2. 부팅 디스크 섹션에서 변경을 클릭하고 다음을 수행합니다.

    1. 부팅 디스크 페이지에서 기존 디스크 탭을 클릭합니다.
    2. 디스크 목록에서 VM에 연결할 기존 암호화된 디스크를 선택합니다.
    3. 텍스트 상자에 암호화 키를 입력합니다. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.

    4. 선택을 클릭합니다.

  3. VM 만들기 프로세스를 계속 진행합니다.

gcloud

VM을 만들고 암호화된 디스크를 연결하려면 키 파일을 만든 다음 VM을 만들 때 --csek-key-file 플래그를 사용하여 키를 제공합니다. RSA 래핑 키를 사용하는 경우 gcloud beta 구성요소를 사용하세요.

gcloud (beta) compute instances create example-instance \
    --disk name=example-disk,boot=yes \
    --csek-key-file example-file.json

REST

Compute Engine API를 사용하여 VM을 만들고 디스크 사양과 함께 rawKey 또는 rsaEncryptedKey를 제공합니다. 원시(비 RSA 래핑) 키의 경우 v1 API에 요청하고 RSA 래핑 키의 경우 베타 API에 요청합니다.

다음은 디스크 사양 예시의 스니펫입니다.

"disks": [
{
  "deviceName": "encrypted-disk",
  "source": "projects/myproject/zones/us-central1-f/disks/encrypted-disk",
  "diskEncryptionKey": {
    "rawKey": "SGVsbG8gZnJvbSBHb29nbGUgQ2xvdWQgUGxhdGZvcm0="
  }
 }
]

CSEK로 암호화된 디스크가 있는 VM 시작 또는 다시 시작

암호화된 디스크가 있는 VM의 중지 또는 시작에 대한 자세한 내용은 암호화된 디스크가 있는 VM 다시 시작을 참조하세요.

명령줄을 사용하여 혼합된 리소스 생성

Google Cloud CLI를 사용하여 단일 요청으로 고객 암호화 및 표준 암호화 리소스를 혼합하여 만들려는 경우 요청에서 키 파일이 있는 --csek-key-file 플래그와 --no-require-csek-key-create 플래그를 사용할 수 있습니다. 두 플래그를 모두 입력하면 gcloud CLI가 키 파일에 명시적으로 정의된 고객 암호화 리소스를 만들고, 사용자가 지정하는 표준 리소스도 만듭니다.

예를 들어 키 파일에 다음 사항이 포함되어 있다고 가정해 보겠습니다.

[
  {
  "uri": "https://www.googleapis.com/compute/beta/projects/myproject/zones/us-central1-a/disks/example-disk",
  "key": "ieCx/NcW06PcT7Ep1X6LUTc/hLvUDYyzSZPPVCVPTVEohpeHASqC8uw5TzyO9U+Fka9JFHz0mBibXUInrC/jEk014kCK/NPjYgEMOyssZ4ZINPKxlUh2zn1bV+MCaTICrdmuSBTWlUUiFoDD6PYznLwh8ZNdaheCeZ8ewEXgFQ8V+sDroLaN3Xs3MDTXQEMMoNUXMCZEIpg9Vtp9x2oeQ5lAbtt7bYAAHf5l+gJWw3sUfs0/Glw5fpdjT8Uggrr+RMZezGrltJEF293rvTIjWOEB3z5OHyHwQkvdrPDFcTqsLfh+8Hr8g+mf+7zVPEC8nEbqpdl3GPv3A7AwpFp7MA==",
  "key-type": "rsa-encrypted"
  }
]

키 파일을 사용하여 고객 암호화 디스크가 있는 VM을 만드는 동시에 동일한 요청에서 표준 암호화 디스크가 있는 VM을 만들려면 다음과 같이 할 수 있습니다.

gcloud beta compute instances create example-disk example-disk-2 \
    --csek-key-file mykeyfile.json --no-require-csek-key-create

일반적으로 --csek-key-file 플래그를 지정한 경우 디스크가 키 파일에 명시적으로 정의되지 않았으므로 example-disk-2를 만들 수 없습니다. --no-require-csek-key-create를 추가하면 키 파일을 사용하여 암호화된 디스크와 Google 암호화를 사용하여 암호화된 디스크가 모두 생성됩니다.

영구 디스크에서 CSEK 삭제

고객 암호화 디스크의 콘텐츠를 복호화하고, 대신 Compute Engine 기본 암호화를 사용하는 새 디스크를 만들 수 있습니다.

  1. 암호화된 디스크의 이미지를 생성하고 새 이미지에 자동 암호화를 지정합니다.
  2. 새 이미지를 사용하여 새 영구 디스크를 생성합니다.

새 영구 디스크를 생성하면 이 디스크에서는 Compute Engine 기본 암호화를 사용하여 디스크 콘텐츠를 보호합니다. 이 디스크에서 만드는 스냅샷도 기본 암호화를 사용해야 합니다.