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

기본적으로 Google Compute Engine은 모든 미사용 데이터를 암호화하며 사용자의 추가 작업 없이 암호화를 처리하고 관리합니다. 하지만, 이 암호화를 직접 제어하고 관리하기 위해 자체 암호화 키를 제공할 수 있습니다.

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

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

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

시작하기 전에

사양

암호화

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

제한사항

이 기능을 사용할 때 적용되는 몇 가지 제한사항이 있습니다.

일반 제한사항

고객 제공 암호화 키를 사용할 수 없는 국가는 다음과 같습니다.

  • 브라질
  • 인도

기술 제한사항

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

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

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

필수 키 형식

사용자가 키를 생성하고 관리해야 하며, 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 Platform 서비스에만 알려집니다. RSA 인증서를 사용하여 키를 래핑하면 Google Cloud Platform 서비스에서만 키를 래핑 해제하고 해당 키를 사용하여 데이터를 보호할 수 있습니다.

자세한 내용은 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 cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
import requests

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

def get_google_public_cert_key():
    r = requests.get(GOOGLE_PUBLIC_CERT_URL)
    r.raise_for_status()

    # Load the certificate.
    certificate = x509.load_pem_x509_certificate(
        r.text.encode('utf-8'), default_backend())

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

    return public_key

def wrap_rsa_key(public_key, private_key_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.
    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):
    # 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)

    print('Base-64 encoded private key: {}'.format(
        base64.b64encode(customer_key_bytes).decode('utf-8')))
    print('Wrapped RSA key: {}'.format(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 래핑 키 사용

gcloud 명령줄 도구를 사용하면 일반 키와 RSA 래핑 키를 동일한 방식으로 입력할 수 있습니다.

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

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

설정

암호화 키는 gcloud 명령줄 도구를 통해 사용할 수 있습니다.

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

키 파일

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

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

  • 키가 보호하는 리소스에 대한 정규화된 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"
  }
]

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

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

자체 키로 새 영구 디스크 암호화

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

콘솔

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

    디스크 페이지로 이동

  2. 새 디스크를 클릭하고 새 디스크의 속성으로 이동합니다.
  3. 암호화에 있는 드롭다운 메뉴에서 고객 제공을 선택합니다.
  4. 텍스트 상자에 디스크의 암호화 키를 입력합니다. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.

gcloud

gcloud compute 도구에서 인스턴스 생성 중 --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

API

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

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

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

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

{
"machineType": "zones/us-central1-a/machineTypes/n1-standard-1",
"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
 }
],
...
}

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

POST https://www.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"
}

암호화된 디스크에서 스냅샷 생성

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

암호화된 디스크의 스냅샷은 항상 전체 스냅샷이며, 증분 스냅샷보다 저장 비용이 더 많이 듭니다.

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

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

콘솔

  1. 스냅샷 페이지로 이동합니다.

    스냅샷 페이지로 이동

  2. 새 스냅샷을 클릭합니다.
  3. 원본 디스크에서 스냅샷을 생성할 암호화된 디스크를 선택합니다.
  4. 텍스트 상자에 디스크의 암호화 키를 입력합니다. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.
  5. 암호화 섹션에 추가 암호화 키를 입력하여 새 스냅샷을 암호화합니다.

API

API에서 sourceDiskEncryptionKey 속성을 입력하여 원본 영구 디스크에 액세스합니다. 경우에 따라 snapshotEncryptionKey 속성을 사용하여 새 스냅샷을 암호화할 수도 있습니다.

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

POST https://www.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를 사용하면 스냅샷을 암호화하기 위한 키를 제공할 수 있으므로 스냅샷을 사용하여 새 영구 디스크를 생성하는 경우 일치하는 키를 제공해야 합니다. 이 키는 위에서 설명한 것과 동일한 키 형식을 따라야 합니다. 이 속성을 정의하지 않은 채로 둘 수 있으며, 스냅샷을 사용하여 키를 요청하지 않고 새 영구 디스크를 생성할 수도 있습니다.

암호화된 디스크 또는 암호화된 커스텀 이미지에서 새 이미지 생성

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

콘솔

  1. Google Cloud Platform 콘솔에서 이미지 만들기 페이지로 이동합니다.
    이미지 생성 페이지로 이동
  2. 새 이미지를 클릭합니다.
  3. 원본 디스크에서 이미지를 생성할 암호화된 디스크를 선택합니다.
  4. 텍스트 상자에 디스크의 암호화 키를 입력합니다. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.
  5. 경우에 따라 암호화 섹션에 암호화 키를 입력하여 새 이미지를 암호화할 수도 있습니다.

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"
  }
]

API

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

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

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

POST https://www.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 속성을 사용하면 이미지를 암호화하기 위한 키를 제공할 수 있으므로 이미지를 사용하여 새 영구 디스크를 생성하는 경우 일치하는 키를 제공해야 합니다. 이 키는 위에서 설명한 것과 동일한 키 형식을 따라야 합니다. 이 속성을 정의하지 않은 채로 둘 수 있으며, 이미지를 사용하여 키를 요청하지 않고 새 영구 디스크를 생성할 수도 있습니다.

가져온 이미지 암호화

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

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

콘솔

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

    이미지 페이지로 이동

  2. 새 이미지를 클릭합니다.
  3. 소스 유형에서 Cloud Storage 객체를 선택합니다.
  4. 암호화에서 고객 제공을 선택하고 텍스트 상자에 이미지를 암호화하는 암호화 키를 지정합니다.
  5. Cloud Storage 객체 경로 섹션에 Cloud Storage URI를 입력합니다.

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]은 로컬 워크스테이션의 암호화 키 파일에 대한 경로입니다.

API

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

POST https://www.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=="
  }
}

암호화된 리소스에서 영구 디스크 생성

암호화된 스냅샷에서 디스크 생성

콘솔

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

    디스크 페이지로 이동

  2. 새 디스크를 클릭합니다.
  3. 원본 유형에서 스냅샷을 선택합니다.
  4. 텍스트 상자에 스냅샷의 암호화 키를 입력합니다. 키가 공개 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

API

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

POST https://www.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=="
  }
}

암호화된 이미지에서 디스크 생성

콘솔

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

    디스크 페이지로 이동

  2. 새 디스크를 클릭합니다.
  3. 원본 유형에서 이미지를 선택합니다.
  4. 텍스트 상자에 이미지의 암호화 키를 입력합니다. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.

gcloud

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

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

API

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

POST https://www.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"
}

새 인스턴스에 암호화된 디스크 연결

콘솔

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 새 인스턴스를 클릭합니다.
  3. 부팅에서 변경을 클릭합니다.
  4. 기존 디스크를 선택합니다.
  5. 기존 디스크를 선택하여 인스턴스에 연결합니다.
  6. 텍스트 상자에 암호화 키를 입력합니다. 키가 공개 RSA 키로 래핑된 경우 래핑된 키를 선택합니다.
  7. 인스턴스 생성 프로세스를 계속 진행합니다.

gcloud

인스턴스를 생성하고 암호화된 디스크에 연결하려면 키 파일을 생성하고 인스턴스를 생성할 때 --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

API

Compute Engine API를 사용하여 인스턴스를 생성하고 디스크 사양과 함께 rawKey 또는 rsaEncryptedKey를 지정합니다. 원시(비 RSA 래핑) 키의 경우 v1 API에 요청하고 RSA 래핑 키의 경우 베타 API에 요청합니다.

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

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

암호화된 디스크가 있는 인스턴스 시작 또는 다시 시작

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

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

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

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

[
  {
  "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"
  }
]

키 파일을 사용하여 고객 암호화 디스크가 있는 인스턴스를 생성하는 동시에 동일한 요청에서 표준 암호화 디스크가 있는 인스턴스를 생성하려는 경우 다음과 같이 할 수 있습니다.

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 암호화를 사용하여 암호화된 디스크가 모두 생성됩니다.

영구 디스크에서 고객 제공 암호화 키 삭제

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

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

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

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Compute Engine 문서