AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정 - Amazon Simple Storage Service

AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정

중요

이제 Amazon S3가 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)를 Amazon S3 내 모든 버킷 암호화의 기본 수준으로 적용합니다. 2023년 1월 5일부터 Amazon S3로의 모든 새 객체 업로드는 추가 비용 없이 성능에 영향을 미치지 않고 자동으로 암호화됩니다. S3 버킷 기본 암호화 구성에 및 신규 객체 업로드에 대한 자동 암호화 상태는 AWS CloudTrail 로그, S3 인벤토리, S3 스토리지 렌즈, Amazon S3 콘솔에서 사용할 수 있으며, AWS Command Line Interface 및 AWS SDK에서 추가 Amazon S3 API 응답 헤더로도 사용할 수 있습니다. 자세한 내용은 기본 암호화 관련 FAQ를 참조하십시오.

모든 Amazon S3 버킷에는 기본적으로 암호화가 구성되어 있으며 S3 버킷에 업로드되는 신규 객체는 모두 저장 시 자동으로 암호화됩니다. Amazon S3 관리형 키(SSE-S3)를 사용한 서버 측 암호화가 Amazon S3 내 모든 버킷의 기본 암호화 구성입니다. 다른 유형의 암호화를 사용하려면 S3 PUT 요청에 사용할 서버 측 암호화 유형을 지정하거나 대상 버킷에 기본 암호화 구성을 설정할 수 있습니다.

PUT 요청에 다른 암호화 유형을 지정하려는 경우 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS), AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 또는 고객 제공 키를 사용한 서버 측 암호화 (SSE-C)를 사용할 수 있습니다. 대상 버킷에 다른 기본 암호화 구성을 설정하려는 경우 SSE-KMS 또는 DSSE-KMS를 사용할 수 있습니다.

새 객체를 업로드하거나 기존 객체를 복사할 때 암호화를 적용할 수 있습니다.

Amazon S3 콘솔, REST API 작업, AWS SDK 및 AWS Command Line Interface(AWS CLI)를 사용하여 SSE-KMS를 지정할 수 있습니다. 자세한 내용은 다음 항목을 참조하십시오.

참고

Amazon S3에서 다중 리전 AWS KMS keys를 사용할 수 있습니다. 그러나 Amazon S3는 현재 다중 리전 키를 단일 리전 키인 것처럼 취급하며, 키의 다중 리전 기능을 사용하지 않습니다. 자세한 내용은 AWS Key Management Service 개발자 안내서에서 다중 리전 키 사용을 참조하십시오.

참고

다른 계정에서 소유한 KMS 키를 사용하려면 먼저 해당 키에 대한 사용 권한이 있어야 합니다. KMS 키의 크로스 계정 권한에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서에서 다른 계정에서 사용할 수 있는 KMS 키 만들기를 참조하십시오.

이 주제에서는 Amazon S3 콘솔을 사용하여 AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 통한 서버 측 암호화를 사용하도록 객체 암호화 유형을 설정하거나 변경하는 방법을 설명합니다.

참고
  • 객체 암호화를 변경하면 새 객체가 생성되어 이전 객체를 대체합니다. S3 버전 관리가 사용 설정된 경우 객체의 새 버전이 생성되고 기존 객체는 이전 버전이 됩니다. 또한 속성을 변경하는 역할도 새 객체(또는 객체 버전)의 소유자가 됩니다.

  • 사용자 정의 태그가 있는 객체의 암호화 유형을 변경하는 경우 s3:GetObjectTagging 권한이 있어야 합니다. 사용자 정의 태그는 없지만 크기가 16MB를 초과하는 객체의 암호화 유형을 변경하는 경우 s3:GetObjectTagging 권한도 있어야 합니다.

    대상 버킷 정책에서 s3:GetObjectTagging 작업을 거부하는 경우 객체의 암호화 유형은 업데이트되지만 사용자 정의 태그는 객체에서 제거되며 오류가 발생합니다.

객체에 대한 암호화 추가 또는 변경
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷(Buckets) 목록에서 객체가 포함된 버킷의 이름을 선택합니다.

  4. 객체(Objects) 목록에서 암호화를 추가하거나 변경할 객체의 이름을 선택합니다.

    객체의 속성이 표시된 여러 섹션이 있는 객체의 세부 정보 페이지가 나타납니다.

  5. 속성(Properties) 탭을 선택합니다.

  6. 아래로 스크롤하여 서버 측 암호화 설정 섹션으로 이동하고 편집을 선택합니다.

    서버 측 암호화 편집(Edit server-side encryption) 페이지가 열립니다.

  7. 서버 측 암호화암호화 설정에서 기본 암호화 버킷 설정 재정의를 선택합니다.

  8. 암호화 유형에서 AWS Key Management Service  키를 사용한 서버 측 암호화(SSE-KMS)를 선택합니다.

    중요

    기본 암호화 구성에 대해 SSE-KMS 옵션을 사용할 경우 AWS KMS의 초당 요청 수(RPS) 제한이 적용됩니다. AWS KMS 할당량과 할당량 증대를 요청하는 방법에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 할당량을 참조하세요.

  9. AWS KMS 키에서 다음 중 하나를 수행하여 KMS 키를 선택합니다.

    • 사용 가능한 KMS 키 목록에서 AWS KMS keys 중에서 선택을 선택한 다음, 사용 가능한 키 목록에서 KMS 키를 선택합니다.

      AWS 관리형 키(aws/s3)와 고객 관리형 키가 모두 목록에 표시됩니다. 고객 관리형 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 고객 키 및 AWS 키를 참조하세요.

    • KMS 키 ARN을 입력하려면 AWS KMS key ARN 입력을 선택한 다음 나타나는 필드에 KMS 키 ARN을 입력합니다.

    • AWS KMS 콘솔에서 고객 관리형 키를 생성하려면 KMS 키 생성을 선택합니다.

      AWS KMS key 생성에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드키 생성을 참조하십시오.

    중요

    버킷과 동일한 AWS 리전에서 사용할 수 있는 KMS 키만 사용 가능합니다. Amazon S3 콘솔은 버킷과 동일한 리전에 있는 처음 100개의 KMS 키만 나열합니다. 목록에 없는 KMS 키를 사용하려면 KMS 키 ARN을 입력해야 합니다. 다른 계정에서 소유한 KMS 키를 사용하려면 먼저 해당 키에 대한 사용 권한이 있어야 하고, 다음 단계로 KMS 키 ARN을 입력해야 합니다.

    Amazon S3는 대칭 암호화 KMS 키만 지원하며 비대칭 KMS 키는 지원하지 않습니다. 자세한 내용은 AWS Key Management Service 개발자 안내서에서 대칭 및 비대칭 KMS 키 식별을 참조하세요.

  10. Save changes(변경 사항 저장)를 선택합니다.

참고

이 작업은 지정된 모든 객체에 암호화를 적용합니다. 폴더를 암호화할 때 폴더에 새 객체를 추가하기 전에 저장 작업이 완료될 때까지 기다립니다.

객체를 만들 때, 즉 새 객체를 업로드하거나 기존 객체를 복사할 때 AWS KMS keys(SSE-KMS)를 통한 서버 측 암호화를 사용하여 데이터를 암호화하도록 지정할 수 있습니다. 이렇게 하려면 요청에 x-amz-server-side-encryption 헤더를 추가합니다. 암호화 알고리즘 aws:kms로 헤더의 값을 설정합니다. Amazon S3는 x-amz-server-side-encryption 응답 헤더를 반환하여 객체가 SSE-KMS를 사용하여 저장됨을 확인해 줍니다.

aws:kms의 값을 사용하여 x-amz-server-side-encryption 헤더를 지정하는 경우 다음 요청 헤더를 사용할 수도 있습니다.

  • x-amz-server-side-encryption-aws-kms-key-id

  • x-amz-server-side-encryption-context

  • x-amz-server-side-encryption-bucket-key-enabled

SSE-KMS를 지원하는 Amazon S3 REST API 작업

다음 REST API 작업은 x-amz-server-side-encryption, x-amz-server-side-encryption-aws-kms-key-idx-amz-server-side-encryption-context 요청 헤더를 수락합니다.

  • PutObject - PUT API 작업을 사용하여 데이터를 업로드할 때 이러한 요청 헤더를 지정할 수 있습니다.

  • CopyObject - 객체를 복사할 때 소스 객체 및 대상 객체가 모두 있어야 합니다. CopyObject 작업을 사용하여 SSE-KMS 헤더를 전달할 경우 헤더가 대상 객체에만 적용됩니다. 기존 객체를 복사할 때 소스 객체의 암호화 여부와 관계없이 명시적으로 서버 측 암호화를 요청하지 않는 한 대상 객체는 암호화되지 않습니다.

  • POST Object - POST 작업을 사용하여 객체를 업로드할 경우에는 요청 헤더 대신 양식 필드에 동일한 정보를 제공합니다.

  • CreateMultipartUpload - 멀티파트 업로드 API 작업을 사용하여 대형 객체를 업로드할 때 이러한 헤더를 지정할 수 있습니다. CreateMultipartUpload 요청에서 이 헤더를 지정합니다.

객체가 서버 측 암호화를 사용하여 저장될 경우 다음 REST API 작업의 응답 헤더는 x-amz-server-side-encryption 헤더를 반환합니다.

중요
  • 보안 소켓 계층(SSL), 전송 계층 보안(TLS) 또는 서명 버전 4를 사용하여 요청을 수행하지 않으면 AWS KMS로 보호되는 객체에 대한 모든 GETPUT 요청이 실패합니다.

  • 객체가 SSE-KMS를 사용하는 경우 GET 요청 및 HEAD 요청에 대해 암호화 요청 헤더를 전송하면 HTTP 400 BadRequest 오류가 발생합니다.

암호화 컨텍스트(x-amz-server-side-encryption-context)

x-amz-server-side-encryption:aws:kms를 지정하면 Amazon S3 API는 x-amz-server-side-encryption-context 헤더가 있는 암호화 컨텍스트를 지원합니다. 암호화 컨텍스트는 데이터에 대한 추가 컨텍스트 정보를 포함하는 키-값 페어 집합입니다.

Amazon S3는 자동으로 객체 또는 버킷의 Amazon 리소스 이름(ARN)을 암호화 컨텍스트 쌍으로 사용합니다. S3 버킷 키를 활성화하지 않고 SSE-KMS를 사용하는 경우 객체 ARN을 암호화 컨텍스트로 사용합니다. 예: arn:aws:s3:::object_ARN. 그러나 SSE-KMS를 사용하고 S3 버킷 키를 활성화하는 경우 암호화 컨텍스트에 버킷 ARN을 사용합니다. 예: arn:aws:s3:::bucket_ARN.

필요한 경우 x-amz-server-side-encryption-context 헤더를 사용하여 추가 암호화 컨텍스트 쌍을 제공할 수 있습니다. 그러나 암호화 컨텍스트는 암호화되지 않으므로 민감한 정보를 포함하지 않도록 해야 합니다. Amazon S3는 기본 암호화 컨텍스트와 함께 이 추가 키 페어를 저장합니다.

Amazon S3의 암호화 컨텍스트에 대한 자세한 내용은 암호화 컨텍스트 단원을 참조하십시오. 암호화 컨텍스트에 대한 일반 내용은 AWS Key Management Service 개발자 안내서AWS Key Management Service 개념 - 암호화 컨텍스트를 참조하십시오.

AWS KMS 키 ID(x-amz-server-side-encryption-aws-kms-key-id)

x-amz-server-side-encryption-aws-kms-key-id 헤더를 사용하여 데이터를 보호하는 데 사용되는 고객 관리형 키의 ID를 지정할 수 있습니다. x-amz-server-side-encryption:aws:kms 헤더를 지정하지만 x-amz-server-side-encryption-aws-kms-key-id 헤더를 제공하지 않는 경우 Amazon S3는 AWS 관리형 키(aws/s3)를 사용하여 데이터를 보호합니다. 고객 관리형 키를 사용하려면 고객 관리형 키의 x-amz-server-side-encryption-aws-kms-key-id 헤더를 제공해야 합니다.

중요

Amazon S3에서 서버 측 암호화에 AWS KMS key을 사용하는 경우 대칭 암호화 KMS 키를 선택해야 합니다. Amazon S3는 대칭 암호화 KMS 키만 지원합니다. 이들 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서대칭 암호화 KMS 키를 참조하십시오.

S3 버킷 키(x-amz-server-side-encryption-aws-bucket-key-enabled)

x-amz-server-side-encryption-aws-bucket-key-enabled 요청 헤더를 사용하여 객체 수준에서 S3 버킷 키를 활성화하거나 비활성화할 수 있습니다. S3 버킷 키는 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS KMS 요청 비용을 줄입니다. 자세한 내용은 Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감 단원을 참조하십시오.

x-amz-server-side-encryption:aws:kms 헤더를 지정하되 x-amz-server-side-encryption-aws-bucket-key-enabled 헤더를 제공하지 않은 경우 객체는 대상 버킷에 대한 S3 버킷 키 설정을 사용하여 객체를 암호화합니다. 자세한 내용은 객체 수준에서 S3 버킷 키 구성 단원을 참조하십시오.

다음 예시 AWS CLI 명령을 사용하려면 user input placeholders를 실제 정보로 대체하세요.

새 객체를 업로드하거나 기존 객체를 복사할 때 AWS KMS 키를 사용하여 서버 측 암호화를 통해 데이터를 암호화하도록 지정할 수 있습니다. 이렇게 하려면 요청에 --server-side-encryption aws:kms 헤더를 추가합니다. --ssekms-key-id example-key-id를 사용하여, 생성해둔 고객 관리형 AWS KMS 키를 추가합니다. AWS KMS를 지정했지만 --server-side-encryption aws:kms 키 ID를 제공하지 않으면, Amazon S3가 AWS 관리형 키를 사용합니다.

aws s3api put-object --bucket amzn-s3-demo-bucket --key example-object-key --server-side-encryption aws:kms --ssekms-key-id example-key-id --ssekms-encryption-context example-encryption-context --body filepath

--bucket-key-enabled 또는 --no-bucket-key-enabled를 추가하면 put-object 또는 copy-object 작업에서 Amazon S3 버킷 키를 활성화하거나 비활성화할 수 있습니다. S3 버킷 키는 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS KMS 요청 비용을 줄일 수 있습니다. 자세한 내용은 S3 버킷 키를 사용하여 SSE-KMS 비용 절감을 참조하세요.

aws s3api put-object --bucket amzn-s3-demo-bucket --key example-object-key --server-side-encryption aws:kms --bucket-key-enabled --body filepath

소스 버킷의 객체를 새 버킷으로 복사하고 SSE-KMS 암호화를 지정할 수 있습니다.

aws s3api copy-object --copy-source amzn-s3-demo-bucket/example-object-key --bucket amzn-s3-demo-bucket2 --key example-object-key --server-side-encryption aws:kms --sse-kms-key-id example-key-id --ssekms-encryption-context example-encryption-context

AWS SDK를 사용하는 경우 서버 측 암호화에 AWS KMS keys를 사용하도록 Amazon S3에 요청할 수 있습니다. 다음 예시에서는 Java 및 .NET용 AWS SDK와 함께 SSE-KMS를 사용하는 방법을 보여줍니다. 다른 SDK 사용에 대한 자세한 내용은 AWS 개발자 센터의 샘플 코드 및 라이브러리를 참조하세요.

중요

Amazon S3에서 서버 측 암호화에 AWS KMS key을 사용하는 경우 대칭 암호화 KMS 키를 선택해야 합니다. Amazon S3는 대칭 암호화 KMS 키만 지원합니다. 이들 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서대칭 암호화 KMS 키를 참조하십시오.

CopyObject 작업

객체를 복사할 때 동일한 요청 속성(ServerSideEncryptionMethodServerSideEncryptionKeyManagementServiceKeyId)을 추가하여 Amazon S3에서 AWS KMS key를 사용하도록 요청합니다. 객체 복사에 대한 자세한 내용은 객체 복사, 이동, 이름 변경 단원을 참조하십시오.

PUT 작업

Java

AWS SDK for Java를 사용하여 객체를 업로드할 때 다음 요청에 표시된 대로 SSEAwsKeyManagementParams 속성을 추가하여 Amazon S3에서 AWS KMS key를 사용하도록 요청할 수 있습니다.

PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams());

이 경우 Amazon S3는 AWS 관리형 키(aws/s3)를 사용합니다. 자세한 내용은 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용 단원을 참조하십시오. 필요한 경우 대칭 암호화 KMS 키를 생성하고 다음 예시와 같이 요청에서 지정할 수 있습니다.

PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(keyID));

고객 관리형 키 생성에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드AWS KMS API 프로그래밍을 참조하십시오.

객체를 업로드하는 사용 가능한 코드 예제는 다음 주제를 참조하십시오. 이 예시를 사용하려면 코드 예시를 업데이트하고 이전 코드 조각에서 표시된 바와 같이 암호화 정보를 제공해야 합니다.

.NET

AWS SDK for .NET를 사용하여 객체를 업로드할 때 다음 요청에 표시된 대로 ServerSideEncryptionMethod 속성을 추가하여 Amazon S3에서 AWS KMS key를 사용하도록 요청할 수 있습니다.

PutObjectRequest putRequest = new PutObjectRequest { BucketName = amzn-s3-demo-bucket, Key = keyName, // other properties ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS };

이 경우 Amazon S3는 AWS 관리형 키를 사용합니다. 자세한 내용은 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용 단원을 참조하십시오. 필요한 경우 자체적인 대칭 암호화 고객 관리형 키를 생성하고 다음 예시와 같이 요청에서 지정할 수 있습니다.

PutObjectRequest putRequest1 = new PutObjectRequest { BucketName = amzn-s3-demo-bucket, Key = keyName, // other properties ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS, ServerSideEncryptionKeyManagementServiceKeyId = keyId };

고객 관리형 키 생성에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드AWS KMS API 프로그래밍을 참조하십시오.

객체를 업로드하는 사용 가능한 코드 예제는 다음 주제를 참조하십시오. 이 예시를 사용하려면 코드 예시를 업데이트하고 이전 코드 조각에서 표시된 바와 같이 암호화 정보를 제공해야 합니다.

미리 서명된 URL

Java

AWS KMS key를 사용하여 암호화된 객체에 대해 미리 서명된 URL을 생성할 때 다음 예시와 같이 서명 버전 4를 명시적으로 지정해야 합니다.

ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setSignerOverride("AWSS3V4SignerType"); AmazonS3Client s3client = new AmazonS3Client( new ProfileCredentialsProvider(), clientConfiguration); ...

코드에 대한 예는 미리 서명된 URL을 통해 객체 공유 단원을 참조하십시오.

.NET

AWS KMS key를 사용하여 암호화된 객체에 대해 미리 서명된 URL을 생성할 때 다음 예시와 같이 서명 버전 4를 명시적으로 지정해야 합니다.

AWSConfigs.S3Config.UseSignatureVersion4 = true;

코드에 대한 예는 미리 서명된 URL을 통해 객체 공유 단원을 참조하십시오.