고객 관리 암호화 키 사용

이 페이지에서는 기능을 시작하는 방법, 버킷에서 기본 키를 사용하는 방법, 개별 객체에 키를 추가하는 방법 등 Cloud Storage에서 Cloud Key Management Service 암호화 키를 사용하는 방법을 설명합니다. Cloud KMS 암호화 키는 Cloud KMS에서 생성되고 본인이 관리하는 고객 관리 암호화 키입니다. 이 기능에 대한 자세한 내용(사용 가능한 국가 포함)은 고객 관리 암호화 키를 참조하세요. Cloud Storage의 다른 암호화 옵션은 데이터 암호화 옵션을 참조하세요.

기본 요건

Cloud Storage에서 이 기능을 사용하려면 다음 요건을 충족해야 합니다.

  1. 암호화 키를 저장할 프로젝트에 Cloud KMS API를 사용 설정합니다.

    API 사용 설정

  2. 암호화 키를 저장할 프로젝트에 대한 충분한 권한을 확보합니다.

    • 키를 저장할 프로젝트의 소유자라면 필요한 권한을 가지고 있을 가능성이 높습니다.

    • 새로운 암호화 키링과 키를 생성하려면 cloudkms.keyRings.createcloudkms.cryptoKey.create 권한이 있어야 합니다.

    • 새로운 키링과 키 또는 기존 키링과 키 사용 여부에 관계없이 암호화에 사용할 키에 대한 cloudkms.cryptoKey.setIamPolicy 권한이 있어야 합니다.

      이 권한이 있으면 Cloud Storage 서비스 계정에 Cloud KMS 키에 대한 액세스 권한을 부여할 수 있습니다.

    • 이러한 권한은 roles/cloudkms.admin 역할에 포함되어 있습니다.

      이 역할과 다른 Cloud KMS 역할을 얻는 방법은 Cloud KMS에서 IAM 사용을 참조하세요.

  3. Cloud Storage 버킷에서 객체 관련 작업을 수행할 수 있는 충분한 권한을 확보합니다.

    • 버킷이 포함된 프로젝트의 소유자라면 필요한 권한을 가지고 있을 가능성이 높습니다.

    • IAM을 사용하는 경우에는 객체를 버킷에 쓸 수 있는 storage.objects.create 권한과 버킷에서 객체를 읽을 수 있는 storage.objects.get 권한이 있어야 합니다. 이러한 권한이 있는 roles/storage.objectAdmin과 같은 역할을 얻는 방법은 IAM 권한 사용을 참조하세요.

    • ACL을 사용하는 경우에는 객체를 버킷에 쓸 수 있는 버킷 범위 WRITER 권한과 버킷에서 객체를 읽을 수 있는 객체 범위 READER 권한이 있어야 합니다. 자세한 방법은 ACL 설정을 참조하세요.

  4. Cloud KMS 키링이 있고, 키링 안에 키가 최소한 한 개 이상 있어야 합니다.

  5. Cloud Storage 버킷을 포함하고 있는 프로젝트와 연관된 서비스 계정의 이메일 주소를 확인합니다.

서비스 계정에 Cloud KMS 키 할당

고객 관리 암호화 키를 사용하려면 Cloud Storage 서비스 계정에 Cloud KMS 키를 사용할 수 있는 권한을 부여합니다.

Console

  1. Google Cloud Platform Console에서 Cloud Key Management Service 키 브라우저를 엽니다.
    Cloud KMS 키 브라우저 열기
  2. 원하는 키가 포함된 키링의 이름을 클릭합니다.

  3. 원하는 키의 체크박스를 선택합니다.

    오른쪽 창의 권한 탭이 활성화됩니다.

  4. 구성원 추가 대화상자에서 액세스 권한을 부여할 Cloud Storage 서비스 계정의 이메일 주소를 지정합니다.

  5. 역할 선택 드롭다운에서 Cloud KMS CryptoKey Encrypter/Decrypter를 선택합니다.

  6. 추가를 클릭합니다.

gsutil

gsutil kms authorize 명령어를 사용하여 Cloud KMS 키로 객체를 암호화하고 복호화할 수 있는 권한을 버킷과 연결된 서비스 계정에 부여합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

gsutil kms authorize -p [PROJECT_STORING_OBJECTS] -k [KEY_RESOURCE]

[KEY_RESOURCE]에 필요한 형식은 키 리소스를 참조하세요.

부여된 권한을 삭제하려면 gcloud 명령줄 도구 또는 Google Cloud Platform Console을 사용해야 합니다.

코드 샘플

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 참조하세요.

        public static void AddMemberToCryptoKeyPolicy(string projectId, string locationId,
            string keyRingId, string cryptoKeyId, string role, string member)
        {
            KeyManagementServiceClient client = KeyManagementServiceClient.Create();
            CryptoKeyName cryptoKeyName =
                new CryptoKeyName(projectId, locationId, keyRingId, cryptoKeyId);

            Policy policy = client.GetIamPolicy(KeyNameOneof.From(cryptoKeyName));
            policy.Bindings.Add(new Binding
            {
                Role = role,
                Members = { member }
            });

            Policy updateResult = client.SetIamPolicy(KeyNameOneof.From(cryptoKeyName), policy);

            foreach (Binding bindingResult in updateResult.Bindings)
            {
                Console.WriteLine($"Role: {bindingResult.Role}");
                foreach (string memberResult in bindingResult.Members)
                {
                    Console.WriteLine($"  Member: {memberResult}");
                }
            }
        }

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 참조하세요.

// addMemberRingPolicy adds a new member to a specified IAM role for the key ring
// example keyRingName: "projects/PROJECT_ID/locations/global/keyRings/RING_ID"
func addMemberRingPolicy(keyRingName, member string, role iam.RoleName) error {
	ctx := context.Background()
	client, err := cloudkms.NewKeyManagementClient(ctx)
	if err != nil {
		return err
	}

	// Get the KeyRing.
	keyRingObj, err := client.GetKeyRing(ctx, &kmspb.GetKeyRingRequest{Name: keyRingName})
	if err != nil {
		return err
	}
	// Get IAM Policy.
	handle := client.KeyRingIAM(keyRingObj)
	policy, err := handle.Policy(ctx)
	if err != nil {
		return err
	}
	// Add Member.
	policy.Add(member, role)
	err = handle.SetPolicy(ctx, policy)
	if err != nil {
		return err
	}
	log.Print("Added member to keyring policy.")
	return nil
}

자바

자세한 내용은 Cloud Storage 자바 API 참조 문서를 참조하세요.

/**
 * Adds the given member to the given key, with the given role.
 *
 * @param projectId The id of the project.
 * @param locationId The location id of the key.
 * @param keyRingId The id of the keyring.
 * @param cryptoKeyId The id of the crypto key.
 * @param member The member to add. Must be in the proper format, eg:
 *
 * allUsers user:$userEmail serviceAccount:$serviceAccountEmail
 *
 * See https://g.co/cloud/kms/docs/reference/rest/v1/Policy#binding for more details.
 * @param role Must be in one of the following formats: roles/[role]
 * organizations/[organizationId]/roles/[role] projects/[projectId]/roles/[role]
 *
 * See https://g.co/cloud/iam/docs/understanding-roles for available values for [role].
 */
public static Policy addMemberToCryptoKeyPolicy(
    String projectId, String locationId, String keyRingId, String cryptoKeyId, String member,
    String role)
    throws IOException {

  // Create the Cloud KMS client.
  try (KeyManagementServiceClient client = KeyManagementServiceClient.create()) {

    // The resource name of the cryptoKey version
    String keyName = CryptoKeyName.format(projectId, locationId, keyRingId, cryptoKeyId);

    // Get the current IAM policy
    Policy iamPolicy = client.getIamPolicy(keyName);

    // Create a new binding with the selected role and member
    Binding newBinding = Binding.newBuilder()
        .setRole(role)
        .addMembers(member)
        .build();

    // Create a new IAM policy containing the existing settings plus the new binding.
    Policy newPolicy = Policy.newBuilder()
        .mergeFrom(iamPolicy)
        .addBindings(newBinding)
        .build();

    // Set the new IAM Policy.
    Policy policyResult = client.setIamPolicy(keyName, newPolicy);

    return policyResult;
  }
}

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 참조하세요.

async function addMemberToCryptoKeyPolicy(
  projectId = 'your-project-id', // Your GCP Project Id
  keyRingId = 'my-key-ring', // Name of the crypto key's key ring
  cryptoKeyId = 'my-key', // Name of the crypto key
  member = 'user:dev@example.com', // Member to add to the crypto key
  role = 'roles/viewer' // Role to give the member
) {
  // Import the library and create a client
  const kms = require('@google-cloud/kms');
  const client = new kms.KeyManagementServiceClient();

  // The location of the crypto key's key ring
  const locationId = 'global';

  // Get the full path to the crypto key
  const resource = client.cryptoKeyPath(
    projectId,
    locationId,
    keyRingId,
    cryptoKeyId
  );

  // Gets the IAM policy of a crypto key
  const [result] = await client.getIamPolicy({resource});
  let policy = Object.assign({bindings: []}, result);
  const index = policy.bindings.findIndex(binding => binding.role === role);

  // Add the role/member combo to the policy
  const members = [];
  const binding = Object.assign({role, members}, policy.bindings[index]);
  if (index === -1) {
    policy.bindings.push(binding);
  }
  if (!binding.members.includes(member)) {
    binding.members.push(member);
  }

  // Adds the member/role combo to the policy of the crypto key
  [policy] = await client.setIamPolicy({resource, policy});
  console.log(
    `${member}/${role} combo added to policy for crypto key ${cryptoKeyId}.`
  );
  if (policy.bindings) {
    policy.bindings.forEach(binding => {
      if (binding.members && binding.members.length) {
        console.log(`${binding.role}:`);
        binding.members.forEach(member => {
          console.log(`  ${member}`);
        });
      }
    });
  } else {
    console.log(`Policy for crypto key ${cryptoKeyId} is empty.`);
  }
}

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 참조하세요.

use Google\Cloud\Kms\V1\KeyManagementServiceClient;
use Google\Cloud\Iam\V1\Binding;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $locationId = 'The location ID of the crypto key. Can be "global", "us-west1", etc.';
// $keyRingId = 'The KMS key ring ID';
// $cryptoKeyId = 'The KMS key ID';
// $member = 'Must be in the format "user:$userEmail" or "serviceAccount:$serviceAccountEmail"';
// $role = 'Must be in the format "roles/$role", "organizations/$organizationId/roles/$role", or "projects/$projectId/roles/$role"';

$kms = new KeyManagementServiceClient();

// The resource name of the CryptoKey.
$cryptoKeyName = $kms->cryptoKeyName($projectId, $locationId, $keyRingId, $cryptoKeyId);

// Get the current IAM policy and add the new account to it.
$policy = $kms->getIamPolicy($cryptoKeyName);
$bindings = $policy->getBindings();
$bindings[] = new Binding([
    'members' => [$member],
    'role' => $role,
]);
$policy->setBindings($bindings);

// Set the new IAM Policy.
$kms->setIamPolicy($cryptoKeyName, $policy);

printf('Member %s added to policy for cryptoKey %s in keyRing %s' . PHP_EOL, $member, $cryptoKeyId, $keyRingId);

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 참조하세요.

def add_member_to_crypto_key_policy(
        project_id, location_id, key_ring_id, crypto_key_id, member, role):
    """Adds a member with a given role to the Identity and Access Management
    (IAM) policy for a given CryptoKey associated with a KeyRing."""

    # Creates an API client for the KMS API.
    client = kms_v1.KeyManagementServiceClient()

    # The resource name of the CryptoKey.
    resource = client.crypto_key_path_path(project_id, location_id,
                                           key_ring_id, crypto_key_id)
    # Get the current IAM policy.
    policy = client.get_iam_policy(resource)

    # Add member
    policy.bindings.add(
        role=role,
        members=[member])

    # Update the IAM Policy.
    client.set_iam_policy(resource, policy)

    # Print results
    print('Member {} added with role {} to policy for CryptoKey {} \
           in KeyRing {}'.format(member, role, crypto_key_id, key_ring_id))

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 참조하세요.

# project_id  = "Your Google Cloud project ID"
# location_id = "The location of the key ring"
# key_ring_id = "The ID of the key ring"
# member      = "Member to add to the key ring policy"
# role        = "Role assignment for new member"

require "google/cloud/kms/v1"
CloudKMS = Google::Cloud::Kms::V1

# Initialize the client
client = CloudKMS::KeyManagementServiceClient.new

# The key ring to use
key_ring =
  CloudKMS::KeyManagementServiceClient.key_ring_path project_id, location_id, key_ring_id

# Get the current IAM policy
policy = client.get_iam_policy key_ring

# Add new member to current bindings
policy.bindings ||= []
policy.bindings << Google::Iam::V1::Binding.new(members: [member], role: role)

# Update IAM policy
client.set_iam_policy key_ring, policy

puts "Member #{member} added to policy for " +
     "key ring #{key_ring_id}"

REST API

JSON API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. Playground에서 OAuth 사용자 인증 정보를 사용하도록 구성합니다.
  2. 다음 정보를 포함하는 .json 파일을 만듭니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    {
      "policy": {
        "bindings": {
          "role": "roles/cloudkms.cryptoKeyEncrypterDecrypter",
          "members": "[SERVICE_ACCOUNT_EMAIL_ADDRESS]"
        },
      }
    }
  3. cURL을 사용하여 POST setIamPolicy 요청으로 Cloud KMS API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X POST --data-binary @[JSON_FILE_NAME].json \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    -H "Content-Type: application/json" \
    "https://cloudkms.googleapis.com/v1/[KEY_RESOURCE]:setIamPolicy"

    [KEY_RESOURCE]에 필요한 형식은 키 리소스를 참조하세요.

XML API

XML API는 Cloud KMS를 서비스 계정에 할당하는 데 사용할 수 없습니다. gsutil 등의 다른 Cloud Storage 도구 중 하나를 대신 사용하세요.

기본 암호화 키 사용

버킷의 기본 키 추가 또는 변경

객체를 버킷에 작성할 때 기본적으로 사용되는 Cloud KMS 키를 추가하거나 변경하려면 다음과 같이 하세요.

Console

  1. Google Cloud Platform Console에서 Cloud Storage 브라우저를 엽니다.
    Cloud Storage 브라우저 열기
  2. 버킷 목록에서 원하는 버킷을 클릭합니다.

  3. 페이지 상단의 버킷 수정을 클릭합니다.

  4. 버킷 수정 페이지에서 고급 설정 표시를 클릭하여 펼칩니다.

  5. 버킷에서 현재 Cloud KMS 키를 사용하고 있지 않으면 고객 관리 키 라디오 버튼을 선택합니다.

  6. 고객 관리 키와 연관된 드롭다운 메뉴에서 사용 가능한 키 중 하나를 선택합니다.

  7. 저장을 클릭합니다.

gsutil

gsutil kms encryption 명령어를 사용합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

gsutil kms encryption -k [KEY_RESOURCE] gs://[BUCKET_NAME]

[KEY_RESOURCE]에 필요한 형식은 키 리소스를 참조하세요.

성공하면 다음과 같은 응답이 표시됩니다.

Authorized service account [SERVICE_ACCOUNT_NAME] to use key:
[KEY_RESOURCE]

코드 샘플

C++

자세한 내용은 Cloud Storage C++ API 참조 문서를 참조하세요.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string key_name) {
  StatusOr<gcs::BucketMetadata> updated_metadata = client.PatchBucket(
      bucket_name, gcs::BucketMetadataPatchBuilder().SetEncryption(
                       gcs::BucketEncryption{key_name}));

  if (!updated_metadata) {
    throw std::runtime_error(updated_metadata.status().message());
  }

  if (!updated_metadata->has_encryption()) {
    std::cerr << "The change to set the encryption attribute on bucket "
              << updated_metadata->name()
              << " was sucessful, but the encryption is not set."
              << "This is unexpected, maybe a concurrent change?\n";
    return;
  }

  std::cout << "Successfully set default KMS key on bucket  "
            << updated_metadata->name() << " to "
            << updated_metadata->encryption().default_kms_key_name << "."
            << "\nFull metadata: " << *updated_metadata << "\n";
}

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 참조하세요.

private void AddBucketDefaultKmsKey(string bucketName,
    string keyLocation, string kmsKeyRing, string kmsKeyName)
{
    string KeyPrefix = $"projects/{s_projectId}/locations/{keyLocation}";
    string FullKeyringName = $"{KeyPrefix}/keyRings/{kmsKeyRing}";
    string FullKeyName = $"{FullKeyringName}/cryptoKeys/{kmsKeyName}";
    var storage = StorageClient.Create();
    var bucket = storage.GetBucket(bucketName, new GetBucketOptions()
    {
        Projection = Projection.Full
    });
    bucket.Encryption = new Bucket.EncryptionData
    {
        DefaultKmsKeyName = FullKeyName
    };
    var updatedBucket = storage.UpdateBucket(bucket, new UpdateBucketOptions()
    {
        // Avoid race conditions.
        IfMetagenerationMatch = bucket.Metageneration,
    });
}

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 참조하세요.

bucket := c.Bucket(bucketName)
bucketAttrsToUpdate := storage.BucketAttrsToUpdate{
	Encryption: &storage.BucketEncryption{DefaultKMSKeyName: keyName},
}
if _, err := bucket.Update(ctx, bucketAttrsToUpdate); err != nil {
	return err
}

자바

자세한 내용은 Cloud Storage 자바 API 참조 문서를 참조하세요.

// Instantiate a Google Cloud Storage client
Storage storage = StorageOptions.getDefaultInstance().getService();

// The name of the existing bucket to set a default KMS key for, e.g. "my-bucket"
// String bucketName = "my-bucket"

// The name of the KMS-key to use as a default
// Key names are provided in the following format:
// 'projects/<PROJECT>/locations/<LOCATION>/keyRings/<RING_NAME>/cryptoKeys/<KEY_NAME>'
// String kmsKeyName = ""

BucketInfo bucketInfo =
    BucketInfo.newBuilder(bucketName).setDefaultKmsKeyName(kmsKeyName).build();

Bucket bucket = storage.update(bucketInfo);

System.out.println("Default KMS Key Name: " + bucket.getDefaultKmsKeyName());

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 참조하세요.

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const defaultKmsKeyName = 'KMS key resource id, e.g. my-key';

// Enables a default KMS key for the bucket
await storage.bucket(bucketName).setMetadata({
  encryption: {
    defaultKmsKeyName,
  },
});

console.log(
  `Default KMS key for ${bucketName} was set to ${defaultKmsKeyName}.`
);

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 참조하세요.

use Google\Cloud\Storage\StorageClient;

/**
 * Enable a bucket's requesterpays metadata.
 *
 * @param string $projectId Your Google Cloud project ID.
 * @param string $bucketName Name of your Google Cloud Storage bucket.
 * @param string $kmsKeyName KMS key ID to use as the default KMS key.
 *
 * @return void
 */
function enable_default_kms_key($projectId, $bucketName, $kmsKeyName)
{
    $storage = new StorageClient([
        'projectId' => $projectId
    ]);
    $bucket = $storage->bucket($bucketName);
    $bucket->update([
        'encryption' => [
            'defaultKmsKeyName' => $kmsKeyName
        ]
    ]);
    printf('Default KMS key for %s was set to %s' . PHP_EOL,
        $bucketName,
        $bucket->info()['encryption']['defaultKmsKeyName']);
}

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 참조하세요.

"""Sets a bucket's default KMS key."""
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
bucket.default_kms_key_name = kms_key_name
bucket.patch()

print('Set default KMS key for bucket {} to {}.'.format(
    bucket.name,
    bucket.default_kms_key_name))

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 참조하세요.

# project_id      = "Your Google Cloud project ID"
# bucket_name     = "Name of your Google Cloud Storage bucket"
# default_kms_key = "KMS key resource id"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.bucket bucket_name

bucket.default_kms_key = default_kms_key

puts "Default KMS key for #{bucket.name} was set to #{bucket.default_kms_key}"

REST API

JSON API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. Playground에서 OAuth 사용자 인증 정보를 사용하도록 구성합니다.
  2. 다음 정보를 포함하는 .json 파일을 만듭니다. 아래에서 [VALUES_IN_BRACKETS]는 적절한 값으로 바꿉니다.

    {
      "encryption": {
        "defaultKmsKeyName": "[KEY_RESOURCE]"
      }
    }

    [KEY_RESOURCE]에 필요한 형식은 키 리소스를 참조하세요.

  3. cURL을 사용하여 PATCH Bucket 요청으로 JSON API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X PATCH --data-binary @[JSON_FILE_NAME].json \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    -H "Content-Type: application/json" \
    "https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]?fields=encryption"

XML API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. Playground에서 OAuth 사용자 인증 정보를 사용하도록 구성합니다.
  2. 다음 정보를 포함하는 .xml 파일을 만듭니다. 아래에서 [VALUES_IN_BRACKETS]는 적절한 값으로 바꿉니다.

    <EncryptionConfiguration>
      <DefaultKmsKeyName>[KEY_RESOURCE]</DefaultKmsKeyName>
    </EncryptionConfiguration>

    [KEY_RESOURCE]에 필요한 형식은 키 리소스를 참조하세요.

  3. cURL을 사용하여 PUT 버킷 요청과 encryption 쿼리 문자열 매개변수로 XML API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X PUT --data-binary @[XML_FILE_NAME].xml \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    "https://storage.googleapis.com/[BUCKET_NAME]?encryptionConfig"

버킷의 기본 키 보기

버킷의 기본값으로 현재 설정된 Cloud KMS 키를 보려면 다음과 같이 하세요.

Console

  1. Google Cloud Platform Console에서 Cloud Storage 브라우저를 엽니다.
    Cloud Storage 브라우저 열기
  2. 버킷 목록에서 원하는 버킷을 클릭합니다.

  3. 버킷 세부정보 페이지에서 개요 탭을 클릭합니다.

  4. 버킷의 현재 기본 키가 암호화 키 필드에 표시됩니다.

gsutil

gsutil kms encryption 명령어를 사용합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

gsutil kms encryption gs://[BUCKET_NAME]

성공하면 다음과 같은 응답이 표시됩니다.

Default encryption key for gs://[BUCKET_NAME]:
[KEY_RESOURCE]

REST API

JSON API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. OAuth 사용자 인증 정보를 사용할 수 있도록 플레이그라운드를 구성합니다.
  2. cURL을 사용하여 원하는 fields가 포함된 GET Bucket 요청으로 JSON API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X GET -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    "https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]?fields=encryption"

    다음 예와 같은 응답이 표시됩니다.

    {
      "encryption" : {
         "defaultKmsKeyName": "[KEY_RESOURCE]"
       },
    }

XML API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. OAuth 사용자 인증 정보를 사용할 수 있도록 플레이그라운드를 구성합니다.
  2. cURL을 사용하여 encryption 쿼리 매개변수가 포함된 GET Bucket 요청으로 XML API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X GET -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    "https://storage.googleapis.com/[BUCKET_NAME]?encryptionConfig"

    다음 예와 같은 응답이 표시됩니다.

    <EncryptionConfiguration>
      <DefaultKmsKeyName>[KEY_RESOURCE]</DefaultKmsKeyName>
    </EncryptionConfiguration>

버킷에서 기본 키 삭제

버킷에 설정된 기본 Cloud KMS 키를 삭제하려면 다음과 같이 하세요.

Console

  1. Google Cloud Platform Console에서 Cloud Storage 브라우저를 엽니다.
    Cloud Storage 브라우저 열기
  2. 버킷 목록에서 원하는 버킷을 클릭합니다.

  3. 페이지 상단의 버킷 수정을 클릭합니다.

  4. 버킷 수정 페이지에서 고급 설정 표시를 클릭하여 펼칩니다.

  5. Google 관리 키 라디오 버튼을 선택합니다.

  6. 저장을 클릭합니다.

gsutil

gsutil kms encryption 명령어를 사용합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

gsutil kms encryption -d gs://[BUCKET_NAME]

성공하면 다음과 같은 응답이 표시됩니다.

Clearing default encryption key for gs://[BUCKET_NAME]...

REST API

JSON API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. Playground에서 OAuth 사용자 인증 정보를 사용하도록 구성합니다.
  2. 다음 정보를 포함하는 .json 파일을 만듭니다.

    {
      "encryption": {
        "defaultKmsKeyName": null
      }
    }
  3. cURL을 사용하여 PATCH Bucket 요청으로 JSON API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X PATCH --data-binary @[JSON_FILE_NAME].json \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    -H "Content-Type: application/json" \
    "https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]?fields=encryption"

XML API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. Playground에서 OAuth 사용자 인증 정보를 사용하도록 구성합니다.
  2. 다음 정보를 포함하는 .xml 파일을 만듭니다.

    <EncryptionConfiguration></EncryptionConfiguration>
  3. cURL을 사용하여 PUT 버킷 요청과 encryption 쿼리 문자열 매개변수로 XML API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X PUT --data-binary @[XML_FILE_NAME].xml \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    "https://storage.googleapis.com/[BUCKET_NAME]?encryptionConfig"

Cloud KMS 키로 객체 암호화

Cloud KMS 키로 개별 객체를 암호화할 수 있습니다. 버킷에 설정된 기본 키와 다른 키를 사용하려는 경우 또는 버킷에 설정된 기본 키가 없을 경우에 유용합니다.

Console

GCP Console은 개별 객체를 암호화하는 데 사용할 수 없습니다. 대신 gsutil 또는 클라이언트 라이브러리를 사용하세요.

gsutil

  1. .boto 구성 파일[GSUtil] 섹션에 다음 옵션을 추가합니다.

    encryption_key = [KEY_RESOURCE]

    키에 필요한 형식은 키 리소스를 참조하세요.

  2. gsutil cp 또는 gsutil rewrite와 같이 평소처럼 버킷에 객체를 씁니다.

코드 샘플

C++

자세한 내용은 Cloud Storage C++ API 참조 문서를 참조하세요.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name, std::string object_name,
   std::string kms_key_name) {
  gcs::ObjectWriteStream stream = client.WriteObject(
      bucket_name, object_name, gcs::KmsKeyName(kms_key_name));

  // Line numbers start at 1.
  for (int lineno = 1; lineno <= 10; ++lineno) {
    stream << lineno << ": placeholder text for CMEK example.\n";
  }

  stream.Close();

  StatusOr<gcs::ObjectMetadata> metadata = std::move(stream).metadata();

  if (!metadata) {
    throw std::runtime_error(metadata.status().message());
  }

  std::cout << "Successfully wrote to object " << metadata->name()
            << " its size is: " << metadata->size()
            << "\nFull metadata: " << *metadata << "\n";
}

C#

자세한 내용은 Cloud Storage C# API 참조 문서를 참조하세요.

        private void UploadEncryptedFileWithKmsKey(string bucketName,
            string keyLocation, string kmsKeyRing, string kmsKeyName,
            string localPath, string objectName = null)
        {
            string KeyPrefix = $"projects/{s_projectId}/locations/{keyLocation}";
            string FullKeyringName = $"{KeyPrefix}/keyRings/{kmsKeyRing}";
            string FullKeyName = $"{FullKeyringName}/cryptoKeys/{kmsKeyName}";

            var storage = StorageClient.Create();
            using (var f = File.OpenRead(localPath))
            {
                objectName = objectName ?? Path.GetFileName(localPath);
                storage.UploadObject(bucketName, objectName, null, f,
                    new UploadObjectOptions()
                    {
                        KmsKeyName = FullKeyName
                    });
                Console.WriteLine($"Uploaded {objectName}.");
            }
        }

Go

자세한 내용은 Cloud Storage Go API 참조 문서를 참조하세요.

obj := client.Bucket(bucket).Object(object)
// Encrypt the object's contents
wc := obj.NewWriter(ctx)
wc.KMSKeyName = keyName
if _, err := wc.Write([]byte("top secret")); err != nil {
	return err
}
if err := wc.Close(); err != nil {
	return err
}

자바

자세한 내용은 Cloud Storage 자바 API 참조 문서를 참조하세요.

byte[] data = "Hello, World!".getBytes(UTF_8);

// The name of the existing bucket to set a default KMS key for, e.g. "my-bucket"
// String bucketName = "my-bucket"

// The name of the KMS-key to use as a default
// Key names are provided in the following format:
// 'projects/<PROJECT>/locations/<LOCATION>/keyRings/<RING_NAME>/cryptoKeys/<KEY_NAME>'
// String kmsKeyName = ""

BlobId blobId = BlobId.of(bucketName, blobName);
BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build();
Blob blob = storage.create(blobInfo, data, BlobTargetOption.kmsKeyName(kmsKeyName));

Node.js

자세한 내용은 Cloud Storage Node.js API 참조 문서를 참조하세요.

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const filename = 'Local file to upload, e.g. ./local/path/to/file.txt';
// const kmsKeyName = 'KMS key resource id, e.g. my-key';

// Uploads a local file to the bucket with the kms key
await storage.bucket(bucketName).upload(filename, {
  kmsKeyName,
});

console.log(`${filename} uploaded to ${bucketName} using ${kmsKeyName}.`);

PHP

자세한 내용은 Cloud Storage PHP API 참조 문서를 참조하세요.

use Google\Cloud\Storage\StorageClient;

/**
 * Upload a file using KMS encryption.
 *
 * @param string $projectId Your Google Cloud project ID.
 * @param string $bucketName the name of your Google Cloud bucket.
 * @param string $objectName the name of the object.
 * @param string $source the path to the file to upload.
 * @param string $kmsKeyName KMS key ID used to encrypt objects server side.
 *
 * @return Psr\Http\Message\StreamInterface
 */
function upload_with_kms_key($projectId, $bucketName, $objectName, $source, $kmsKeyName)
{
    $storage = new StorageClient([
        'projectId' => $projectId,
    ]);
    $file = fopen($source, 'r');
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->upload($file, [
        'name' => $objectName,
        'destinationKmsKeyName' => $kmsKeyName,
    ]);
    printf('Uploaded %s to gs://%s/%s using encryption key %s' . PHP_EOL,
        basename($source),
        $bucketName,
        $objectName,
        $kmsKeyName);
}

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 참조하세요.

"""Uploads a file to the bucket, encrypting it with the given KMS key."""
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.blob(destination_blob_name, kms_key_name=kms_key_name)
blob.upload_from_filename(source_file_name)

print('File {} uploaded to {} with encryption key {}.'.format(
    source_file_name,
    destination_blob_name,
    kms_key_name))

Ruby

자세한 내용은 Cloud Storage Ruby API 참조 문서를 참조하세요.

# project_id        = "Your Google Cloud project ID"
# bucket_name       = "Your Google Cloud Storage bucket name"
# local_file_path   = "Path to local file to upload"
# storage_file_path = "Path to store the file in Google Cloud Storage"
# kms_key           = "KMS key resource id"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id

bucket = storage.bucket bucket_name

file = bucket.create_file local_file_path, storage_file_path,
                          kms_key: kms_key

puts "Uploaded #{file.name} and encrypted service side using #{file.kms_key}"

REST API

JSON API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. Playground에서 OAuth 사용자 인증 정보를 사용하도록 구성합니다.
  2. 객체 데이터를 요청 본문에 추가합니다.

  3. cURL을 사용하여 POST Object 요청으로 JSON API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X POST --data-binary @[OBJECT] \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    -H "Content-Type: [OBJECT_CONTENT_TYPE]" \
    "https://www.googleapis.com/upload/storage/v1/b/[BUCKET_NAME]/o?uploadType=media&name=[OBJECT_NAME]&kmsKeyName=[KEY_RESOURCE]"

    [KEY_RESOURCE]에 필요한 형식은 키 리소스를 참조하세요.

XML API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. Playground에서 OAuth 사용자 인증 정보를 사용하도록 구성합니다.
  2. 객체 데이터를 요청 본문에 추가합니다.

  3. cURL을 사용하여 PUT Object 요청으로 XML API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X PUT --data-binary @[OBJECT] \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    -H "Content-Type: [OBJECT_CONTENT_TYPE]" \
    -H "x-goog-encryption-kms-key-name: [KEY_RESOURCE]" \
    "https://storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME]"

    [KEY_RESOURCE]에 필요한 형식은 키 리소스를 참조하세요.

객체를 암호화하는 데 사용된 키 확인

객체를 암호화하는 데 사용된 Cloud KMS 키의 이름을 찾으려면 다음과 같이 하세요.

Console

  1. Google Cloud Platform Console에서 Cloud Storage 브라우저를 엽니다.
    Cloud Storage 브라우저 열기
  2. 관련 버킷의 원하는 객체로 이동합니다.

  3. 암호화 열에서 원하는 객체 항목 위에 마우스를 놓습니다.

    키 이름이 다음 형식으로 나타납니다.

    [LOCATION]/[KEY_RING_NAME]/[KEY_NAME]

gsutil

gsutil ls 명령어를 -L 플래그와 함께 사용합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

gsutil ls -L gs://[BUCKET_NAME]/[OBJECT_NAME]

성공하면 응답에 키 이름이 포함됩니다.

gs://[BUCKET_NAME]/[OBJECT_NAME]:
...
KMS key: [KEY_RESOURCE]
...

REST API

JSON API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. OAuth 사용자 인증 정보를 사용할 수 있도록 플레이그라운드를 구성합니다.
  2. cURL을 사용하여 GET Object 요청으로 JSON API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X GET \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    "https://www.googleapis.com/storage/v1/b/[BUCKET_NAME]/o/[OBJECT_NAME]?fields=kmsKeyName"

XML API

  1. OAuth 2.0 Playground에서 승인 액세스 토큰을 가져옵니다. OAuth 사용자 인증 정보를 사용할 수 있도록 플레이그라운드를 구성합니다.
  2. cURL을 사용하여 GET Object 요청으로 XML API를 호출합니다. 여기서 [VALUES_IN_BRACKETS]를 적절한 값으로 바꿉니다.

    curl -X GET \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    "https://storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME]?encryption"

객체 복호화

고객 관리 암호화 키로 암호화된 객체를 복호화하는 작업이 자동으로 수행됩니다. 단, 관련 서비스 계정이 키에 액세스할 수 있어야 합니다. 자세한 내용은 고객 관리 암호화 키를 포함하는 서비스 계정을 참조하세요.

다음 단계

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

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

도움이 필요하시나요? 지원 페이지를 방문하세요.