버킷의 암호화 유형 적용 또는 제한

이 문서에서는 Cloud Storage 버킷의 새 객체에 허용되거나 제한되는 암호화 방법을 구성하는 방법을 설명합니다. 버킷 내에서 생성되는 새 객체에 대해 표준 암호화(Google 기본 암호화), 고객 관리 암호화 키 (CMEK) 또는 고객 제공 암호화 키 (CSEK)의 사용을 강제하거나 제한하도록 버킷을 구성할 수 있습니다.

예를 들어 암호화 키 관리에 관한 규정 준수 요구사항을 충족하기 위해 모든 새 객체를 표준 암호화 또는 CMEK로 암호화하도록 요구하고 고객 제공 암호화 키의 사용을 제한할 수 있습니다.

사용 가능한 암호화 방법에 관한 자세한 내용은 데이터 암호화 옵션을 참고하세요.

Cloud Storage는 객체 업로드, 객체 복사, 객체 구성, 소프트 삭제 객체 복원 등 새 객체를 만드는 모든 작업에 암호화 구성을 적용합니다.

시작하기 전에

버킷의 암호화 시행을 구성하는 데 필요한 권한을 얻으려면 관리자에게 버킷에 대한 스토리지 관리자 (roles/storage.admin) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

이 사전 정의된 역할에는 버킷의 암호화 시행을 구성하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

필수 권한

버킷의 암호화 시행을 구성하려면 다음 권한이 필요합니다.

  • 새 버킷을 만들 때 구성을 설정합니다. storage.buckets.create
  • 기존 버킷의 구성을 업데이트합니다. storage.buckets.update

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

암호화 유형을 적용하는 버킷 만들기

새 버킷을 만들 때 버킷의 객체에 허용되거나 제한되는 암호화 방법을 지정할 수 있습니다.

버킷에 기본 Cloud KMS 키를 설정하는 경우 CMEK 또는 고객 제공 암호화 키를 사용한 암호화도 허용해야 합니다.

gcloud

  1. 다음 정보를 포함하는 JSON 파일을 만듭니다.

    {
      "gmekEnforcement": {"restrictionMode": "STANDARD_ENCRYPTION_RESTRICTION_MODE"},
      "cmekEnforcement": {"restrictionMode": "CMEK_RESTRICTION_MODE"},
      "csekEnforcement": {"restrictionMode": "CSEK_RESTRICTION_MODE"}
    }

    다음을 바꿉니다.

    • STANDARD_ENCRYPTION_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 표준 암호화 (Google 기본 암호화)를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 표준 암호화를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 표준 암호화를 사용할 수 없습니다.
    • CMEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 CMEK를 사용한 암호화가 허용되는지 여부입니다. 다음 값이 지원됩니다.
      • NotRestricted: 새 객체는 CMEK를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 CMEK를 사용할 수 없습니다.
    • CSEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 고객 제공 암호화 키를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 없습니다.

    하나 이상의 암호화 유형을 허용해야 합니다. 특정 암호화 유형의 시행 구성을 생략하면 해당 암호화 유형이 기본적으로 허용됩니다.

  2. gcloud storage buckets create 명령어를 --encryption-enforcement-file 플래그와 함께 사용합니다.

    gcloud storage buckets create gs://BUCKET_NAME \
      --encryption-enforcement-file=ENCRYPTION_ENFORCEMENT_FILE

    다음을 바꿉니다.

    • BUCKET_NAME: 버킷의 이름입니다.
    • ENCRYPTION_ENFORCEMENT_FILE: 이전 단계에서 만든 JSON 파일의 경로

클라이언트 라이브러리

C#

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;

public class BucketSetEncryptionEnforcementConfigSample
{
    /// <summary>
    /// Set the encryption enforcement configuration for a bucket.
    /// </summary>
    /// <param name="bucketName">The name of the bucket.</param>
    /// <param name="kmsKeyName">
    /// The full resource name of the Cloud KMS key (CMEK). 
    /// Required if <paramref name="enforceCmek"/> is true.
    /// </param>
    /// <param name="enforceCmek">If true, enforces Customer-Managed Encryption Key.</param>
    /// <param name="enforceGmek">If true, enforces Google-Managed Encryption Key.</param>
    /// <param name="enforceCsek">If true, enforces Customer-Supplied Encryption Key.</param>
    public Bucket.EncryptionData SetBucketEncryptionEnforcementConfig(
        string bucketName = "your-unique-bucket-name",
        string kmsKeyName = null,
        bool enforceCmek = false,
        bool enforceGmek = false,
        bool enforceCsek = false)
    {
        var storage = StorageClient.Create();
        var bucket = storage.GetBucket(bucketName);

        if (bucket.Encryption == null)
        {
            bucket.Encryption = new Bucket.EncryptionData();
        }

        if (!string.IsNullOrEmpty(kmsKeyName))
        {
            bucket.Encryption.DefaultKmsKeyName = kmsKeyName;
            Console.WriteLine($"Default Key Set: {kmsKeyName}");
        }
        else
        {
            bucket.Encryption.DefaultKmsKeyName = null;
            Console.WriteLine("Default Key Set: None");
        }

        string cmek = (enforceGmek || enforceCsek) ? "FullyRestricted" : "NotRestricted";
        string gmek = (enforceCmek || enforceCsek) ? "FullyRestricted" : "NotRestricted";
        string csek = (enforceCmek || enforceGmek) ? "FullyRestricted" : "NotRestricted";

        string message = enforceCmek ? "CMEK-only enforcement policy"
            : enforceGmek ? "GMEK-only enforcement policy"
            : enforceCsek ? "CSEK-only enforcement policy"
            : "no encryption enforcement policy";

        bucket.Encryption.CustomerManagedEncryptionEnforcementConfig = new Bucket.EncryptionData.CustomerManagedEncryptionEnforcementConfigData { RestrictionMode = cmek };
        bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig = new Bucket.EncryptionData.CustomerSuppliedEncryptionEnforcementConfigData { RestrictionMode = csek };
        bucket.Encryption.GoogleManagedEncryptionEnforcementConfig = new Bucket.EncryptionData.GoogleManagedEncryptionEnforcementConfigData { RestrictionMode = gmek };

        if (message != null)
        {
            Console.WriteLine($"Bucket {bucketName} updated with {message}");
        }

        var updatedBucket = storage.UpdateBucket(bucket);
        return updatedBucket.Encryption;
    }
}

Go

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/storage"
)

// setBucketEncryptionEnforcementConfig sets a bucket's encryption enforcement configuration.
func setBucketEncryptionEnforcementConfig(w io.Writer, projectID, bucketName string) error {
	// projectID := "my-project-id"
	// bucketName := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*30)
	defer cancel()

	bucket := client.Bucket(bucketName)
	if err := bucket.Create(ctx, projectID, &storage.BucketAttrs{
		GoogleManagedEncryptionEnforcementConfig: &storage.EncryptionEnforcementConfig{
			RestrictionMode: storage.FullyRestricted,
		},
		CustomerManagedEncryptionEnforcementConfig: &storage.EncryptionEnforcementConfig{
			RestrictionMode: storage.NotRestricted,
		},
		CustomerSuppliedEncryptionEnforcementConfig: &storage.EncryptionEnforcementConfig{
			RestrictionMode: storage.FullyRestricted,
		},
	}); err != nil {
		return fmt.Errorf("Bucket(%q).Create: %w", bucketName, err)
	}
	fmt.Fprintf(w, "Bucket %v encryption enforcement policies set.\n", bucketName)
	return nil
}

Java

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.


import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.BucketInfo.CustomerManagedEncryptionEnforcementConfig;
import com.google.cloud.storage.BucketInfo.CustomerSuppliedEncryptionEnforcementConfig;
import com.google.cloud.storage.BucketInfo.EncryptionEnforcementRestrictionMode;
import com.google.cloud.storage.BucketInfo.GoogleManagedEncryptionEnforcementConfig;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class SetBucketEncryptionEnforcementConfig {
  public static void setBucketEncryptionEnforcementConfig(String projectId, String bucketName)
      throws Exception {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    try (Storage storage =
        StorageOptions.newBuilder().setProjectId(projectId).build().getService()) {

      // Example 1: Enforce GMEK Only
      setGmekEnforcedPolicy(storage, "g-" + bucketName);

      // Example 2: Enforce CMEK Only
      setCmekEnforcedPolicy(storage, "c-" + bucketName);

      // Example 3: Restrict CSEK (Ransomware Protection)
      restrictCsekPolicy(storage, "rc-" + bucketName);
    }
  }

  public static void setGmekEnforcedPolicy(Storage storage, String bucketName) {
    GoogleManagedEncryptionEnforcementConfig gmekConfig =
        GoogleManagedEncryptionEnforcementConfig.of(
            EncryptionEnforcementRestrictionMode.NOT_RESTRICTED);
    CustomerManagedEncryptionEnforcementConfig cmekConfig =
        CustomerManagedEncryptionEnforcementConfig.of(
            EncryptionEnforcementRestrictionMode.FULLY_RESTRICTED);
    CustomerSuppliedEncryptionEnforcementConfig csekConfig =
        CustomerSuppliedEncryptionEnforcementConfig.of(
            EncryptionEnforcementRestrictionMode.FULLY_RESTRICTED);

    BucketInfo bucketInfo =
        BucketInfo.newBuilder(bucketName)
            .setGoogleManagedEncryptionEnforcementConfig(gmekConfig)
            .setCustomerManagedEncryptionEnforcementConfig(cmekConfig)
            .setCustomerSuppliedEncryptionEnforcementConfig(csekConfig)
            .build();

    Bucket bucket = storage.create(bucketInfo);
    System.out.println(
        "Bucket " + bucket.getName() + " created with GMEK-only enforcement policy.");
  }

  public static void setCmekEnforcedPolicy(Storage storage, String bucketName) {
    GoogleManagedEncryptionEnforcementConfig gmekConfig =
        GoogleManagedEncryptionEnforcementConfig.of(
            EncryptionEnforcementRestrictionMode.FULLY_RESTRICTED);
    CustomerManagedEncryptionEnforcementConfig cmekConfig =
        CustomerManagedEncryptionEnforcementConfig.of(
            EncryptionEnforcementRestrictionMode.NOT_RESTRICTED);
    CustomerSuppliedEncryptionEnforcementConfig csekConfig =
        CustomerSuppliedEncryptionEnforcementConfig.of(
            EncryptionEnforcementRestrictionMode.FULLY_RESTRICTED);

    BucketInfo bucketInfo =
        BucketInfo.newBuilder(bucketName)
            .setGoogleManagedEncryptionEnforcementConfig(gmekConfig)
            .setCustomerManagedEncryptionEnforcementConfig(cmekConfig)
            .setCustomerSuppliedEncryptionEnforcementConfig(csekConfig)
            .build();

    Bucket bucket = storage.create(bucketInfo);
    System.out.println(
        "Bucket " + bucket.getName() + " created with CMEK-only enforcement policy.");
  }

  public static void restrictCsekPolicy(Storage storage, String bucketName) {
    CustomerSuppliedEncryptionEnforcementConfig csekConfig =
        CustomerSuppliedEncryptionEnforcementConfig.of(
            EncryptionEnforcementRestrictionMode.FULLY_RESTRICTED);

    BucketInfo bucketInfo =
        BucketInfo.newBuilder(bucketName)
            .setCustomerSuppliedEncryptionEnforcementConfig(csekConfig)
            .build();

    Bucket bucket = storage.create(bucketInfo);
    System.out.println("Bucket " + bucket.getName() + " created with a policy to restrict CSEK.");
  }
}

PHP

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

use Google\Cloud\Storage\StorageClient;

/**
 * Creates a bucket with specific encryption enforcement (e.g., CMEK-only).
 *
 * @param string $bucketName The ID of your GCS bucket (e.g. "my-bucket").
 * @param string $kmsKeyName The name of the KMS key to be used as the default (e.g. "projects/my-project/...").
 */
function set_bucket_encryption_enforcement_config(string $bucketName, string $kmsKeyName): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

    // This configuration enforces that all objects uploaded to the bucket
    // must use Customer Managed Encryption Keys (CMEK).
    $options = [
        'encryption' => [
            'defaultKmsKeyName' => $kmsKeyName,
            'googleManagedEncryptionEnforcementConfig' => [
                'restrictionMode' => 'FullyRestricted',
            ],
            'customerSuppliedEncryptionEnforcementConfig' => [
                'restrictionMode' => 'FullyRestricted',
            ],
            'customerManagedEncryptionEnforcementConfig' => [
                'restrictionMode' => 'NotRestricted',
            ],
        ],
    ];
    $storage->createBucket($bucketName, $options);

    printf('Bucket %s created with encryption enforcement configuration.' . PHP_EOL, $bucketName);
}

Python

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

from google.cloud import storage
from google.cloud.storage.bucket import EncryptionEnforcementConfig


def set_bucket_encryption_enforcement_config(bucket_name):
    """Creates a bucket with encryption enforcement configuration."""
    # The ID of your GCS bucket
    # bucket_name = "your-unique-bucket-name"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)

    # Setting restriction_mode to "FullyRestricted" for Google-managed encryption (GMEK)
    # means objects cannot be created using the default Google-managed keys.
    bucket.encryption.google_managed_encryption_enforcement_config = (
        EncryptionEnforcementConfig(restriction_mode="FullyRestricted")
    )

    # Setting restriction_mode to "NotRestricted" for Customer-managed encryption (CMEK)
    # ensures that objects ARE permitted to be created using Cloud KMS keys.
    bucket.encryption.customer_managed_encryption_enforcement_config = (
        EncryptionEnforcementConfig(restriction_mode="NotRestricted")
    )

    # Setting restriction_mode to "FullyRestricted" for Customer-supplied encryption (CSEK)
    # prevents objects from being created using raw, client-side provided keys.
    bucket.encryption.customer_supplied_encryption_enforcement_config = (
        EncryptionEnforcementConfig(restriction_mode="FullyRestricted")
    )

    bucket.create()

    print(f"Created bucket {bucket.name} with Encryption Enforcement Config.")

REST API

JSON API

  1. Authorization 헤더에 대한 액세스 토큰을 생성하려면 gcloud CLI가 설치 및 초기화되어 있어야 합니다.

  2. 버킷의 설정이 포함된 JSON 파일을 만듭니다. 전체 설정 목록은 Buckets: Insert 문서를 참고하세요. 다음 설정은 버킷 이름과 암호화만 정의합니다.

    {
      "name": "BUCKET_NAME",
      "encryption": {
        "googleManagedEncryptionEnforcementConfig": {
          "restrictionMode": "STANDARD_ENCRYPTION_RESTRICTION_MODE"
        },
        "customerManagedEncryptionEnforcementConfig": {
          "restrictionMode": "CMEK_RESTRICTION_MODE"
        },
        "customerSuppliedEncryptionEnforcementConfig": {
          "restrictionMode": "CSEK_RESTRICTION_MODE"
        }
      }
    }

    다음을 바꿉니다.

    • BUCKET_NAME: 버킷의 이름입니다.
    • STANDARD_ENCRYPTION_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 표준 암호화 (Google 기본 암호화)를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 표준 암호화를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 표준 암호화를 사용할 수 없습니다.
    • CMEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 CMEK를 사용한 암호화가 허용되는지 여부입니다. 다음 값이 지원됩니다.
      • NotRestricted: 새 객체는 CMEK를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 CMEK를 사용할 수 없습니다.
    • CSEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 고객 제공 암호화 키를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 없습니다.

    하나 이상의 암호화 유형을 허용해야 합니다. 특정 암호화 유형의 시행 구성을 생략하면 해당 암호화 유형이 기본적으로 허용됩니다.

  3. cURL을 사용하여 POST 버킷 요청으로 JSON API를 호출합니다.

    curl -X POST --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b?project=PROJECT_ID"

    다음을 바꿉니다.

    • JSON_FILE_NAME: 이전 단계에서 만든 JSON 파일의 경로
    • PROJECT_ID: 버킷의 프로젝트 ID 또는 번호입니다.

XML API

  1. Authorization 헤더에 대한 액세스 토큰을 생성하려면 gcloud CLI가 설치 및 초기화되어 있어야 합니다.

  2. 버킷의 설정이 포함된 XML 파일을 만듭니다. 전체 설정 목록은 XML: 버킷 만들기 문서를 참고하세요. 다음 설정은 암호화 시행만 정의합니다.

    <CreateBucketConfiguration>
      <EncryptionConfiguration>
        <GoogleManagedEncryptionEnforcement>
          <RestrictionMode>STANDARD_ENCRYPTION_RESTRICTION_MODE</RestrictionMode>
        </GoogleManagedEncryptionEnforcement>
        <CustomerManagedEncryptionEnforcement>
          <RestrictionMode>CMEK_RESTRICTION_MODE</RestrictionMode>
        </CustomerManagedEncryptionEnforcement>
        <CustomerSuppliedEncryptionEnforcement>
          <RestrictionMode>CSEK_RESTRICTION_MODE</RestrictionMode>
        </CustomerSuppliedEncryptionEnforcement>
      </EncryptionConfiguration>
    </CreateBucketConfiguration>

    다음을 바꿉니다.

    • STANDARD_ENCRYPTION_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 표준 암호화 (Google 기본 암호화)를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 표준 암호화를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 표준 암호화를 사용할 수 없습니다.
    • CMEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 CMEK를 사용한 암호화가 허용되는지 여부입니다. 다음 값이 지원됩니다.
      • NotRestricted: 새 객체는 CMEK를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 CMEK를 사용할 수 없습니다.
    • CSEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 고객 제공 암호화 키를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 없습니다.

    하나 이상의 암호화 유형을 허용해야 합니다. 특정 암호화 유형의 시행 구성을 생략하면 해당 암호화 유형이 기본적으로 허용됩니다.

  3. cURL을 사용하여 PUT 버킷 요청으로 XML API를 호출합니다.

    curl -X PUT --data-binary @XML_FILE_NAME \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "x-goog-project-id: PROJECT_ID" \
      "https://storage.googleapis.com/BUCKET_NAME"

    다음을 바꿉니다.

    • XML_FILE_NAME: 이전 단계에서 만든 XML 파일의 경로입니다.
    • PROJECT_ID: 버킷의 프로젝트 ID 또는 번호입니다.
    • BUCKET_NAME: 버킷의 이름입니다.

버킷에 허용되는 암호화 유형 업데이트

기존 버킷의 새 객체에 허용되는 암호화 방법을 업데이트하려면 다음 단계를 완료하세요.

버킷에 기본 KMS 키가 설정되어 있으면 새 객체가 생성되지 않으므로 CMEK와 고객 제공 암호화 키를 모두 제한할 수 없습니다. 해당 버킷에서 CMEK 또는 CSEK를 허용하거나 버킷에서 기본 Cloud KMS 키를 삭제하세요.

gcloud

  1. 다음 정보를 포함하는 JSON 파일을 만듭니다.

    {
      "gmekEnforcement": {"restrictionMode": "STANDARD_ENCRYPTION_RESTRICTION_MODE"},
      "cmekEnforcement": {"restrictionMode": "CMEK_RESTRICTION_MODE"},
      "csekEnforcement": {"restrictionMode": "CSEK_RESTRICTION_MODE"}
    }

    다음을 바꿉니다.

    • STANDARD_ENCRYPTION_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 표준 암호화 (Google 기본 암호화)를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 표준 암호화를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 표준 암호화를 사용할 수 없습니다.
    • CMEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 CMEK를 사용한 암호화가 허용되는지 여부입니다. 다음 값이 지원됩니다.
      • NotRestricted: 새 객체는 CMEK를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 CMEK를 사용할 수 없습니다.
    • CSEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 고객 제공 암호화 키를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 없습니다.

    하나 이상의 암호화 유형을 허용해야 합니다. 암호화 유형을 생략하면 기존 구성이 유지됩니다.

  2. gcloud storage buckets update 명령어를 --encryption-enforcement-file 플래그와 함께 사용합니다.

    gcloud storage buckets update gs://BUCKET_NAME \
      --encryption-enforcement-file=ENCRYPTION_ENFORCEMENT_FILE

    다음을 바꿉니다.

    • BUCKET_NAME: 버킷의 이름입니다.
    • ENCRYPTION_ENFORCEMENT_FILE: 이전 단계에서 만든 JSON 파일의 경로

    업데이트된 구성이 적용되는 데 최대 2분이 걸릴 수 있습니다.

클라이언트 라이브러리

C#

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;

public class BucketUpdateEncryptionEnforcementConfigSample
{
    /// <summary>
    /// Updates the encryption enforcement configuration of the bucket.
    /// </summary>
    /// <param name="bucketName">The name of the bucket.</param>
    /// <param name="encryptionData">The encryption configuration for the bucket.</param>
    public Bucket.EncryptionData BucketUpdateEncryptionEnforcementConfig(string bucketName = "your-unique-bucket-name", Bucket.EncryptionData encryptionData = null)
    {
        var storage = StorageClient.Create();
        var bucket = storage.GetBucket(bucketName);

        if (bucket.Encryption is null
            || (bucket.Encryption.CustomerManagedEncryptionEnforcementConfig is null
                && bucket.Encryption.CustomerSuppliedEncryptionEnforcementConfig is null
                && bucket.Encryption.GoogleManagedEncryptionEnforcementConfig is null))
        {
            Console.WriteLine($"No Encryption Enforcement Configuration found for bucket {bucketName}");
            return bucket.Encryption;
        }

        bucket.Encryption = encryptionData;
        bucket = storage.UpdateBucket(bucket);
        Console.WriteLine($"The Encryption Enforcement Configuration has been updated for the bucket {bucketName}");
        return bucket.Encryption;
    }
}

Go

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/storage"
)

// updateBucketEncryptionEnforcementConfig updates a bucket's encryption enforcement configuration.
func updateBucketEncryptionEnforcementConfig(w io.Writer, bucketName string) error {
	// bucketName := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*30)
	defer cancel()

	bucket := client.Bucket(bucketName)
	if _, err := bucket.Update(ctx, storage.BucketAttrsToUpdate{
		GoogleManagedEncryptionEnforcementConfig: &storage.EncryptionEnforcementConfig{
			RestrictionMode: storage.NotRestricted,
		},
		CustomerManagedEncryptionEnforcementConfig: &storage.EncryptionEnforcementConfig{
			RestrictionMode: storage.FullyRestricted,
		},
		CustomerSuppliedEncryptionEnforcementConfig: &storage.EncryptionEnforcementConfig{
			RestrictionMode: storage.FullyRestricted,
		},
	}); err != nil {
		return fmt.Errorf("Bucket(%q).Update: %w", bucketName, err)
	}
	fmt.Fprintf(w, "Bucket %v encryption enforcement policies updated.\n", bucketName)
	return nil
}

Java

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.


import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo.CustomerManagedEncryptionEnforcementConfig;
import com.google.cloud.storage.BucketInfo.CustomerSuppliedEncryptionEnforcementConfig;
import com.google.cloud.storage.BucketInfo.EncryptionEnforcementRestrictionMode;
import com.google.cloud.storage.BucketInfo.GoogleManagedEncryptionEnforcementConfig;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class UpdateBucketEncryptionEnforcementConfig {
  public static void updateBucketEncryptionEnforcementConfig(String projectId, String bucketName)
      throws Exception {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket with CMEK and CSEK restricted
    // String bucketName = "your-unique-bucket-name";

    try (Storage storage =
        StorageOptions.newBuilder().setProjectId(projectId).build().getService()) {

      Bucket bucket = storage.get(bucketName);
      if (bucket == null) {
        System.out.println("Bucket " + bucketName + " not found.");
        return;
      }

      // 1. Update a specific type (e.g., change GMEK to FULLY_RESTRICTED)
      GoogleManagedEncryptionEnforcementConfig newGmekConfig =
          GoogleManagedEncryptionEnforcementConfig.of(
              EncryptionEnforcementRestrictionMode.FULLY_RESTRICTED);

      // 2. Remove a specific type (e.g., remove CMEK enforcement)
      CustomerManagedEncryptionEnforcementConfig newCmekConfig =
          CustomerManagedEncryptionEnforcementConfig.of(
              EncryptionEnforcementRestrictionMode.NOT_RESTRICTED);

      // For the update, need to specify all three configs, so keeping this same as before
      CustomerSuppliedEncryptionEnforcementConfig sameCsekConfig =
          CustomerSuppliedEncryptionEnforcementConfig.of(
              EncryptionEnforcementRestrictionMode.FULLY_RESTRICTED);

      bucket.toBuilder()
          .setGoogleManagedEncryptionEnforcementConfig(newGmekConfig)
          .setCustomerManagedEncryptionEnforcementConfig(newCmekConfig)
          .setCustomerSuppliedEncryptionEnforcementConfig(sameCsekConfig)
          .build()
          .update();

      System.out.println("Encryption enforcement policy updated for bucket " + bucketName);
      System.out.println("GMEK is now fully restricted, and CMEK enforcement has been removed.");
    }
  }
}

PHP

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

use Google\Cloud\Storage\StorageClient;

/**
 * Updates or removes encryption enforcement configurations from a bucket.
 *
 * @param string $bucketName The ID of your GCS bucket (e.g. "my-bucket").
 */
function update_bucket_encryption_enforcement_config(string $bucketName): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);

    // Update a specific encryption type's restriction mode
    // This partial update preserves other existing encryption settings.
    $updateOptions = [
        'encryption' => [
            'googleManagedEncryptionEnforcementConfig' => [
                'restrictionMode' => 'FullyRestricted'
            ]
        ]
    ];
    $bucket->update($updateOptions);
    printf('Google-managed encryption enforcement set to FullyRestricted for %s.' . PHP_EOL, $bucketName);

    // Remove all encryption enforcement configurations altogether
    // Setting these values to null removes the policies from the bucket metadata.
    $clearOptions = [
        'encryption' => [
            'defaultKmsKeyName' => null,
            'googleManagedEncryptionEnforcementConfig' => null,
            'customerSuppliedEncryptionEnforcementConfig' => null,
            'customerManagedEncryptionEnforcementConfig' => null,
        ],
    ];

    $bucket->update($clearOptions);
    printf('All encryption enforcement configurations removed from bucket %s.' . PHP_EOL, $bucketName);
}

Python

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

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

from google.cloud import storage
from google.cloud.storage.bucket import EncryptionEnforcementConfig


def update_bucket_encryption_enforcement_config(bucket_name):
    """Updates the encryption enforcement policy for a bucket."""
    # The ID of your GCS bucket with GMEK and CSEK restricted
    # bucket_name = "your-unique-bucket-name"

    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)

    # Update a specific type (e.g., change GMEK to NotRestricted)
    bucket.encryption.google_managed_encryption_enforcement_config = (
        EncryptionEnforcementConfig(restriction_mode="NotRestricted")
    )

    # Update another type (e.g., change CMEK to FullyRestricted)
    bucket.encryption.customer_managed_encryption_enforcement_config = (
        EncryptionEnforcementConfig(restriction_mode="FullyRestricted")
    )

    # Keeping CSEK unchanged
    bucket.encryption.customer_supplied_encryption_enforcement_config = (
        EncryptionEnforcementConfig(restriction_mode="FullyRestricted")
    )

    bucket.patch()

    print(f"Encryption enforcement policy updated for bucket {bucket.name}.")

    gmek = bucket.encryption.google_managed_encryption_enforcement_config
    cmek = bucket.encryption.customer_managed_encryption_enforcement_config
    csek = bucket.encryption.customer_supplied_encryption_enforcement_config

    print(f"GMEK restriction mode: {gmek.restriction_mode if gmek else 'None'}")
    print(f"CMEK restriction mode: {cmek.restriction_mode if cmek else 'None'}")
    print(f"CSEK restriction mode: {csek.restriction_mode if csek else 'None'}")

REST API

JSON API

  1. Authorization 헤더에 대한 액세스 토큰을 생성하려면 gcloud CLI가 설치 및 초기화되어 있어야 합니다.

  2. 다음 정보를 포함하는 JSON 파일을 만듭니다.

    {
      "encryption": {
        "googleManagedEncryptionEnforcementConfig": {
          "restrictionMode": "STANDARD_ENCRYPTION_RESTRICTION_MODE"
        },
        "customerManagedEncryptionEnforcementConfig": {
          "restrictionMode": "CMEK_RESTRICTION_MODE"
        },
        "customerSuppliedEncryptionEnforcementConfig": {
          "restrictionMode": "CSEK_RESTRICTION_MODE"
        }
      }
    }

    다음을 바꿉니다.

    • STANDARD_ENCRYPTION_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 표준 암호화 (Google 기본 암호화)를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 표준 암호화를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 표준 암호화를 사용할 수 없습니다.
    • CMEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 CMEK를 사용한 암호화가 허용되는지 여부입니다. 다음 값이 지원됩니다.
      • NotRestricted: 새 객체는 CMEK를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 CMEK를 사용할 수 없습니다.
    • CSEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 고객 제공 암호화 키를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 없습니다.

    하나 이상의 암호화 유형을 허용해야 합니다. 암호화 유형을 생략하면 기존 구성이 유지됩니다.

  3. cURL을 사용하여 PATCH 버킷 요청으로 JSON API를 호출합니다.

    curl -X PATCH --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME?fields=encryption"

    다음을 바꿉니다.

    • JSON_FILE_NAME: 이전 단계에서 만든 JSON 파일의 경로
    • BUCKET_NAME: 버킷의 이름입니다.

    업데이트된 구성이 적용되는 데 최대 2분이 걸릴 수 있습니다.

XML API

  1. Authorization 헤더에 대한 액세스 토큰을 생성하려면 gcloud CLI가 설치 및 초기화되어 있어야 합니다.

  2. 버킷의 암호화 설정이 포함된 XML 파일을 만듭니다. 다음 설정은 암호화 시행 구성만 정의합니다.

    <EncryptionConfiguration>
      <GoogleManagedEncryptionEnforcement>
        <RestrictionMode>STANDARD_ENCRYPTION_RESTRICTION_MODE</RestrictionMode>
      </GoogleManagedEncryptionEnforcement>
      <CustomerManagedEncryptionEnforcement>
        <RestrictionMode>CMEK_RESTRICTION_MODE</RestrictionMode>
      </CustomerManagedEncryptionEnforcement>
      <CustomerSuppliedEncryptionEnforcement>
        <RestrictionMode>CSEK_RESTRICTION_MODE</RestrictionMode>
      </CustomerSuppliedEncryptionEnforcement>
    </EncryptionConfiguration>

    다음을 바꿉니다.

    • STANDARD_ENCRYPTION_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 표준 암호화 (Google 기본 암호화)를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 표준 암호화를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 표준 암호화를 사용할 수 없습니다.
    • CMEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 CMEK를 사용한 암호화가 허용되는지 여부입니다. 다음 값이 지원됩니다.
      • NotRestricted: 새 객체는 CMEK를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 CMEK를 사용할 수 없습니다.
    • CSEK_RESTRICTION_MODE: 이 버킷에서 객체를 만들 때 고객 제공 암호화 키를 사용한 암호화가 허용되는지 여부입니다. 다음과 같은 값이 지원됩니다.
      • NotRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 있습니다.
      • FullyRestricted: 새 객체는 고객 제공 암호화 키를 사용할 수 없습니다.

    하나 이상의 암호화 유형을 허용해야 합니다.

  3. cURL을 사용하여 범위가 ?encryptionConfigPUT 버킷 요청으로 XML API를 호출합니다.

    curl -X PUT --data-binary @XML_FILE_NAME \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      "https://storage.googleapis.com/BUCKET_NAME?encryptionConfig"

    다음을 바꿉니다.

    • XML_FILE_NAME: 이전 단계에서 만든 XML 파일의 경로입니다.
    • BUCKET_NAME: 버킷의 이름입니다.

    업데이트된 구성이 적용되는 데 최대 2분이 걸릴 수 있습니다.

버킷의 암호화 설정 보기

버킷에 허용되는 암호화 방법을 확인하는 단계는 버킷 메타데이터 가져오기를 참고하세요.

다음 단계