

# 암호화로 전송 중 데이터 보호
<a name="UsingEncryptionInTransit"></a>

Amazon S3는 데이터 전송에 HTTP 및 HTTPS 프로토콜을 모두 지원합니다. HTTP는 일반 텍스트로 데이터를 전송하는 반면, HTTPS는 Transport Layer Security(TLS)를 사용해 데이터를 암호화하여 보안 계층을 추가합니다. TLS는 도청, 데이터 변조 및 중간자 공격으로부터 보호합니다. HTTP 트래픽은 허용되지만 대부분의 구현에서는 HTTPS 및 TLS를 사용한 전송 중 암호화를 사용하여 클라이언트와 Amazon S3 간에 이동하는 데이터를 보호합니다.

## TLS 1.2 및 TLS 1.3 지원
<a name="UsingEncryptionInTransit.TLS-support"></a>

Amazon S3는 모든 AWS 리전의 모든 API 엔드포인트에서 HTTPS 연결에 TLS 1.2 및 TLS 1.3을 지원합니다. S3는 클라이언트 소프트웨어에서 지원하는 가장 강력한 TLS 보호와 액세스 중인 S3 엔드포인트를 자동으로 협상합니다. AWS SDK 및 AWS CLI를 포함한 현재 AWS 도구(2014 이상)는 자동으로 TLS 1.3으로 기본 설정되며 별도의 조치가 필요하지 않습니다. TLS 1.2와의 이전 버전 호환성이 필요한 경우 클라이언트 구성 설정을 통해 이 자동 협상을 재정의하여 특정 TLS 버전을 지정할 수 있습니다. TLS 1.3을 사용하는 경우 선택적으로 Amazon S3에 양자 방지 요청을 하도록 하이브리드 양자 내성 키 교환(ML-KEM)을 구성할 수 있습니다. 자세한 내용은 [클라이언트에 대한 하이브리드 양자 내성 TLS 구성](pqtls-how-to.md) 섹션을 참조하세요.

**참고**  
TLS 1.3은 AWS PrivateLink for Amazon S3 및 다중 리전 액세스 포인트를 제외한 모든 S3 엔드포인트에서 지원됩니다.

## TLS 사용 모니터링
<a name="UsingEncryptionInTransit.monitoring"></a>

Amazon S3 서버 액세스 로그 또는 AWS CloudTrail을 사용하여 Amazon S3 버킷에 대한 요청을 모니터링할 수 있습니다. 두 로깅 옵션 모두 각 요청에 사용된 TLS 버전과 암호 제품군을 기록합니다.
+ **Amazon S3 서버 액세스 로그** – 서버 액세스 로깅은 버킷에 수행된 요청에 대한 상세 레코드를 제공합니다. 예를 들어 액세스 로그 정보는 보안 및 액세스 감사에 유용할 수 있습니다. 자세한 내용은 [Amazon S3 서버 액세스 로그 형식](LogFormat.md) 섹션을 참조하세요.
+ **AWS CloudTrail** – [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)은 사용자, 역할 또는 AWS 서비스가 수행한 작업 기록을 제공하는 서비스입니다. CloudTrail은 Amazon S3에 대한 모든 API 직접 호출을 이벤트로 캡처합니다. 자세한 내용은 [Amazon S3 CloudTrail 이벤트](cloudtrail-logging-s3-info.md) 섹션을 참조하세요.

## 전송 중 암호화 적용
<a name="UsingEncryptionInTransit.enforcement"></a>

Amazon S3로 전송 중인 데이터의 암호화를 적용하는 것이 보안 모범 사례입니다. 다양한 정책 메커니즘을 통해 HTTPS 전용 통신 또는 특정 TLS 버전 사용을 적용할 수 있습니다. 여기에는 S3 버킷에 대한 IAM 리소스 기반 정책([버킷 정책](bucket-policies.md)), [서비스 제어 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)(SCP), [리소스 제어 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)(RCP) 및 [VPC 엔드포인트 정책](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)이 포함됩니다.

### 전송 중 암호화를 적용하기 위한 버킷 정책 예제
<a name="UsingEncryptionInTransit.bucket-policy-example"></a>

[S3 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#amazons3-policy-keys) `s3:TlsVersion`을 사용하여 클라이언트에서 사용하는 TLS 버전에 따라 Amazon S3 버킷에 대한 액세스를 제한할 수 있습니다. 자세한 내용은 [예시 6: 최소 TLS 버전 요구](amazon-s3-policy-keys.md#example-object-tls-version) 섹션을 참조하세요.

**Example `S3:TlsVersion` 조건 키를 사용하여 TLS 1.3을 적용하는 버킷 정책**  

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyInsecureConnections",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket1",
        "arn:aws:s3:::amzn-s3-demo-bucket1/*"
      ],
      "Condition": {
        "NumericLessThan": {
          "s3:TlsVersion": "1.3"
        }
      }
    }
  ]
}
```

S3 버킷 정책의 `aws:SecureTransport` [전역 조건 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 사용하여 요청이 HTTPS(TLS)를 통해 전송되었는지 확인할 수 있습니다. 이전 예제와 달리 이 조건은 특정 TLS 버전을 확인하지 않습니다. 자세한 내용은 [HTTPS 요청으로만 액세스 제한](example-bucket-policies.md#example-bucket-policies-use-case-HTTP-HTTPS-1) 섹션을 참조하세요.

**Example `aws:SecureTransport` 전역 조건 키를 사용하여 HTTPS를 적용하는 버킷 정책**  

```
{
    "Version":"2012-10-17",		 	 	 		 	 	 
    "Statement": [
     {
        "Sid": "RestrictToTLSRequestsOnly",		 	 	 
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket1",
            "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        ],
        "Condition": {
            "Bool": {
                "aws:SecureTransport": "false"
            }
        },
        "Principal": "*"
    }
  ]
}
```

**키와 추가 예제를 모두 기반으로 하는 예제 정책**  
하나의 정책에서 이전 예제의 두 가지 유형의 조건 키를 모두 사용할 수 있습니다. 자세한 내용과 추가 적용 방법은 AWS 스토리지 블로그 문서 [Amazon S3에서 TLS 1.2 이상을 사용하여 전송 중 암호화 적용](https://aws.amazon.com/blogs/storage/enforcing-encryption-in-transit-with-tls1-2-or-higher-with-amazon-s3/)을 참조하세요.

# Amazon S3와 함께 하이브리드 양자 내성 TLS 사용
<a name="UsingEncryptionInTransit.PQ-TLS"></a>

Amazon S3는 TLS 네트워크 암호화 프로토콜에 대한 하이브리드 양자 내성 키 교환 옵션을 지원합니다. TLS 1.3을 사용하여 Amazon S3 엔드포인트에 요청할 때 이 TLS 옵션을 사용할 수 있습니다. S3가 TLS 세션에 대해 지원하는 클래식 암호 제품군으로 인해 현재 기술로는 키 교환 메커니즘에 대한 무차별 암호 대입 공격이 불가능합니다. 그러나 앞으로 암호화 방식의 관련 양자 컴퓨팅이 실용화된다면 TLS 키 교환 메커니즘에 사용되는 클래식 암호 제품군은 이러한 공격에 취약해질 것입니다. 현재 업계에서는 기존 암호화 방식과 양자 컴퓨팅 요소를 결합한 하이브리드 양자 컴퓨팅 키 교환 방식을 채택하여 TLS 연결의 보안 강도를 기존 암호화 방식만큼 또는 그 이상으로 강화하고 있습니다. Amazon S3는 현재 업계 표준 IANA 사양을 준수하여 하이브리드 PQ-TLS를 지원합니다.

TLS 연결을 통해 전달되는 데이터의 장기 기밀성에 의존하는 애플리케이션을 개발 중인 경우 대규모 양자 컴퓨터가 실용화되기 전에 양자 내성 암호화로 마이그레이션할 계획을 고려해야 합니다. 공동 책임 모델의 일환으로 S3는 서비스 엔드포인트에서 양자 내성 암호화를 활성화합니다. 브라우저와 애플리케이션이 동시에 PQ-TLS를 활성화하면 S3는 전송 중 데이터를 보호하기 위해 가능한 가장 강력한 구성을 선택합니다.

**지원되는 엔드포인트 유형 및 AWS 리전**

Amazon S3용 양자 내성 TLS는 모든 AWS 리전에서 사용할 수 있습니다. 각 AWS 리전의 S3 엔드포인트 목록은 *Amazon Web Services 일반 참조*의 [Amazon Simple Storage Service 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/s3.html)을 참조하세요.

**참고**  
하이브리드 양자 내성 TLS는 Amazon S3용 AWS PrivateLink 및 다중 리전 액세스 포인트, S3 Vectors를 제외한 모든 S3 엔드포인트에서 지원됩니다.

## Amazon S3와 함께 하이브리드 양자 내성 TLS 사용
<a name="pqtls-details"></a>

Amazon S3에 요청하는 클라이언트를 구성할 때 하이브리드 양자 내성 TLS를 지원하도록 해야 합니다. HTTP 클라이언트 테스트 환경 또는 프로덕션 환경을 설정할 때는 다음 정보에 유의합니다.

**전송 중 데이터 암호화**

하이브리드 양자 내성 TLS는 전송 중 암호화에만 사용됩니다. 이렇게 하면 클라이언트에서 S3 엔드포인트로 이동하는 데이터가 보호됩니다. 이 새로운 지원은 기본적으로 AES-256 알고리즘을 활용하는 Amazon S3의 서버 측 암호화와 결합되어 고객에게 전송 중 및 저장 중 양자 내성 암호화를 제공합니다. Amazon S3의 서버 측 암호화에 대한 자세한 내용은 [서버 측 암호화를 사용하여 데이터 보호](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)를 참조하세요.

**지원되는 클라이언트**

하이브리드 양자 내성 TLS를 사용하려면 이 기능을 지원하는 클라이언트를 사용해야 합니다. AWS SDK와 도구에는 언어와 런타임에 따라 다른 암호화 기능과 구성이 있습니다. 특정 도구의 양자 내성 암호화에 대한 자세한 내용은 [하이브리드 양자 내성 TLS 활성화](https://docs.aws.amazon.com/payment-cryptography/latest/userguide/pqtls-details.html)를 참조하세요.

**참고**  
Amazon S3에 대한 요청과 관련된 PQ-TLS 키 교환 세부 정보는 AWS CloudTrail 이벤트 또는 S3 서버 액세스 로그에서 사용할 수 없습니다.

## 양자 내성 TLS에 대해 자세히 알아보기
<a name="pqtls-see-also"></a>

하이브리드 양자 내성 TLS 사용에 대한 자세한 내용은 다음 리소스를 참조하세요.
+ AWS에서 블로그 게시물 및 연구 논문에 대한 링크와 양자 내성 암호화에 대해 알아보려면 [AWS의 양자 내성 암호화](https://aws.amazon.com/security/post-quantum-cryptography/)를 참조하세요.
+ s2n-tls에 대한 자세한 내용은 [새 오픈 소스 TLS 구현, 즉 s2n-tls 소개](https://aws.amazon.com/blogs/security/introducing-s2n-a-new-open-source-tls-implementation/) 및 [s2n-tls 사용](https://github.com/aws/s2n-tls/tree/main/docs/usage-guide)을 참조하세요.
+ AWS 공용 런타임 HTTP 클라이언트에 대한 자세한 내용을 확인하려면 **AWS SDK for Java 2.x 개발자 안내서의 [AWS CRT 기반 HTTP 클라이언트 구성](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/http-configuration-crt.html) 섹션을 참조하세요.
+ 국립 표준 기술 연구소(NIST)의 포스트 양자 암호화 프로젝트에 대한 자세한 내용은 [포스트 양자 암호화](https://csrc.nist.gov/Projects/Post-Quantum-Cryptography)를 참조하세요.
+ NIST 양자 내성 암호화 표준화에 대한 자세한 내용을 확인하려면 [NIST의 양자 내성 암호화 표준화](https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization)를 참조하세요.

# 클라이언트에 대한 하이브리드 양자 내성 TLS 구성
<a name="pqtls-how-to"></a>

Amazon S3에서 PQ-TLS를 사용하려면 양자 내성 키 교환 알고리즘을 지원하도록 클라이언트를 구성해야 합니다. 또한 클라이언트가 기존의 타원 곡선 암호와 ML-KEM(Module-Lattice-Based Key Encapsulation Mechanism) 같은 양자 내성 알고리즘을 결합하는 하이브리드 접근 방식을 지원하는지 확인합니다.

특정 구성은 클라이언트 라이브러리 및 프로그래밍 언어에 따라 다릅니다. 자세한 내용은 [하이브리드 양자 내성 TLS 활성화](https://docs.aws.amazon.com/payment-cryptography/latest/userguide/pqtls-details.html)를 참조하세요.

## 클라이언트 구성 예제: AWS SDK for Java 2
<a name="UsingEncryptionInTransit.PQ-TLS.configuration.java2-sdk"></a>

이 절차에서는 AWS 공통 런타임 HTTP 클라이언트에 대한 Maven 종속성을 추가합니다. 다음으로 포스트 양자 TLS를 선호하는 HTTP 클라이언트를 구성하세요. 그런 다음 HTTP 클라이언트를 사용하는 Amazon S3 클라이언트를 생성합니다.

**참고**  
평가판으로 제공되었던 AWS 공통 런타임 HTTP 클라이언트는 2023년 2월에 정식 버전으로 제공되었습니다. 해당 릴리스에서는 `tlsCipherPreference` 클래스와`tlsCipherPreference()` 메서드 파라미터가 `postQuantumTlsEnabled()` 메서드 파라미터로 대체되었습니다. 평가판 사용 중에 이 예제를 사용했다면 코드를 업데이트해야 합니다.

1. Maven 종속성에 AWS 공통 런타임 클라이언트를 추가합니다. 사용 가능한 최신 버전을 사용하는 것이 좋습니다.

   예를 들어 이 문은 AWS 공통 런타임 클라이언트의 `2.30.22` 버전을 Maven 종속성에 추가합니다.

   ```
   <dependency>
       <groupId>software.amazon.awssdk</groupId>
       <artifactId>aws-crt-client</artifactId>
       <version>2.30.22</version>
   </dependency>
   ```

1. 하이브리드 포스트 양자 암호 제품군을 활성화하려면 AWS SDK for Java 2.x를 프로젝트에 추가한 후 초기화하세요. 이어서 다음 예제와 같이 HTTP 클라이언트에서 하이브리드 포스트 양자 암호 제품군을 활성화합니다.

   이 코드는 `postQuantumTlsEnabled()` 메서드 파라미터를 사용하여 권장되는 하이브리드 양자 내성 암호 제품군인 ML-KEM이 포함된 ECDH를 선호하는 [AWS 공용 런타임 HTTP 클라이언트](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/http-configuration-crt.html)를 구성합니다. 그런 다음 구성된 HTTP 클라이언트를 사용하여 Amazon S3 비동기 클라이언트인 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3AsyncClient.html)의 인스턴스를 구축합니다. 이 코드가 완료된 후에 `S3AsyncClient` 인스턴스의 모든 [Amazon S3 API](https://docs.aws.amazon.com/AmazonS3/latest/API/) 요청은 하이브리드 양자 내성 TLS를 사용합니다.
**중요**  
v2.35.11부터 호출자는 클라이언트에 하이브리드 양자 내성 TLS를 활성화하도록 `.postQuantumTlsEnabled(true)`를 더 이상 설정할 필요가 없습니다. v2.35.11 이상의 모든 버전은 기본적으로 양자 내성 TLS를 활성화합니다.

   ```
   // Configure HTTP client
   SdkAsyncHttpClient awsCrtHttpClient = AwsCrtAsyncHttpClient.builder()
             .postQuantumTlsEnabled(true)
             .build();
   
   // Create the Amazon S3 async client
   S3AsyncClient s3Async = S3AsyncClient.builder()
            .httpClient(awsCrtHttpClient)
            .build();
   ```

1. 하이브리드 양자 내성 TLS를 사용하여 Amazon S3 직접 호출을 테스트합니다.

   구성된 Amazon S3 클라이언트에서 Amazon S3 API 작업을 호출하면 호출은 하이브리드 양자 내성 TLS를 사용하여 Amazon S3 엔드포인트로 전송됩니다. 구성을 테스트하려면 Amazon S3 API(예: `[ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html)`)을 직접 호출합니다.

   ```
   ListBucketsResponse reponse = s3Async.listBuckets();
   ```

### 하이브리드 포스트 퀀텀 TLS 구성 테스트
<a name="pqtls-testing"></a>

Amazon S3를 직접 호출하는 애플리케이션에서 하이브리드 암호 제품군을 사용하여 다음 테스트를 실행하는 것을 고려하세요.
+ 로드 테스트 및 벤치마크를 실행합니다. 하이브리드 암호 제품군은 기존 키 교환 알고리즘과 다르게 작동합니다. 핸드셰이크 시간이 길어지도록 연결 제한 시간을 조정해야 할 수도 있습니다. AWS Lambda 함수 내에서 실행 중인 경우 실행 제한 시간 설정 값을 늘리세요.
+ 다른 위치에서 연결해 보세요. 요청이 지나는 네트워크 경로에 따라 DPI(심층 패킷 검사)가 있는 중간 호스트, 프록시 또는 방화벽으로 인해 요청이 차단됨을 알 수 있습니다. TLS 핸드셰이크의 [ClientHello](https://tools.ietf.org/html/rfc5246#section-7.4.1.2) 부분에서 새 암호 제품군을 사용하는 것 또는 키 교환 메시지가 더 큰 것이 원인일 수 있습니다. 이러한 문제를 해결하는 데 문제가 있는 경우 보안 팀 또는 IT 관리자와 협력하여 관련 구성을 업데이트하고 새 TLS 암호 제품군을 차단 해제하세요.