암호화 모드와 전송 구간 강제 적용

개발자를 위한 AWS 보안 활용

Rahul Singh

Technical Product Manager

두 가지 보장, 하나의 기본값

애플리케이션이 Amazon S3 버킷으로 객체를 전송합니다. 녹색 괄호 하나는 네트워크 구간을 가리키며 "전송 중"이라고 표시되어 있고, 다른 녹색 괄호는 저장된 객체를 가리키며 "저장 시"라고 표시되어 있습니다. 그 위에는 요청에서 달리 지정하지 않는 한 SSE-S3가 적용된다는 설명이 있습니다.

  • 저장 시: 디스크에 저장된 바이트
  • 전송 중: 네트워크상의 바이트
개발자를 위한 AWS 보안 활용

두 가지 보장, 하나의 기본값

애플리케이션이 Amazon S3 버킷으로 객체를 전송합니다. 녹색 괄호 하나는 네트워크 구간을 가리키며 "전송 중"이라고 표시되어 있고, 다른 녹색 괄호는 저장된 객체를 가리키며 "저장 시"라고 표시되어 있습니다. 그 위에는 요청에서 달리 지정하지 않는 한 SSE-S3가 적용된다는 설명이 있습니다.

  • 저장 시: 디스크에 저장된 바이트
  • 전송 중: 네트워크상의 바이트
  • 이미 적용됨: 모든 새 객체에 SSE-S3 적용
  • 아직 선택할 것: 어떤 모드를 사용할지, 키는 누가 보유할지는
개발자를 위한 AWS 보안 활용

평문이 끝나는 지점

서버 측

  • AWS가 읽을 수 있는 바이트를 수신
  • S3가 쓰는 동시에 암호화

 

서버 측 흐름입니다. 사용자의 프로세스가 평문을 보유한 채 TLS 연결을 통해 전송하고, Amazon S3가 쓰기 시점에 암호화합니다. 아래 막대는 바이트의 흐름을 보여주며, S3 지점에서 점선으로 구분됩니다. 그 이전 구간은 "사용자의 바이트: 여기서는 읽을 수 있음"이라고 표시되고 빨간색으로 나타나며, 이후 구간은 "암호문"이라고 표시되고 녹색으로 나타납니다.

 

개발자를 위한 AWS 보안 활용

평문이 끝나는 지점

서버 측

  • AWS가 읽을 수 있는 바이트를 수신
  • S3가 쓰는 동시에 암호화

클라이언트 측

  • 전송 전에 직접 암호화
  • AWS는 암호문만 저장

서버 측 흐름입니다. 사용자의 프로세스가 평문을 보유한 채 TLS 연결을 통해 전송하고, Amazon S3가 쓰기 시점에 암호화합니다. 아래 막대는 바이트의 흐름을 보여주며, S3 지점에서 점선으로 구분됩니다. 그 이전 구간은 "사용자의 바이트: 여기서는 읽을 수 있음"이라고 표시되고 빨간색으로 나타나며, 이후 구간은 "암호문"이라고 표시되고 녹색으로 나타납니다.

클라이언트 측 흐름입니다. 사용자의 프로세스가 먼저 암호화한 뒤 TLS 연결을 통해 암호문을 전송하고, Amazon S3는 수신한 그대로 저장합니다. 아래 막대는 바이트의 흐름을 보여주며, 프로세스 내부에서 점선으로 구분됩니다. 그 이전의 짧은 구간은 "사용자의 바이트: 여기서는 읽을 수 있음"이라고 표시되고 빨간색으로 나타나며, 이후 모든 구간은 "암호문"이라고 표시되고 녹색으로 나타납니다.

개발자를 위한 AWS 보안 활용

네 가지 모드, 한 가지 차이

동일한 알고리즘, 네 가지 키 소유자

  • 모드는 PUT 요청의 헤더로 전달됨
  • SSE-S3: AWS 키 사용, 관리할 필요 없음
  • SSE-KMS: 사용자 키, CloudTrail, 그리고 응답 대상을 지정하는 키 정책(key policy)이 키에 연결됨

SSE-S3, SSE-KMS, DSSE-KMS, SSE-C를 나타내는 네 개의 카드가 쌓여 있습니다. 왼쪽 레일은 위쪽의 AWS 제어에서 아래쪽의 사용자 제어로 이어지며, 각 카드에는 해당 모드를 선택하는 요청 헤더 값만 표시됩니다.

개발자를 위한 AWS 보안 활용

네 가지 모드, 한 가지 차이

동일한 알고리즘, 네 가지 키 소유자

  • 모드는 PUT 요청의 헤더로 전달됨
  • SSE-S3: AWS 키 사용, 관리할 필요 없음
  • SSE-KMS: 사용자 키, CloudTrail, 그리고 응답 대상을 지정하는 키 정책(key policy)이 키에 연결됨
  • DSSE-KMS: 독립된 두 개의 암호화 계층
  • SSE-C: 요청마다 사용자 키 필요, 분실 책임도 사용자

SSE-S3, SSE-KMS, DSSE-KMS, SSE-C를 나타내는 네 개의 카드가 쌓여 있습니다. 왼쪽 레일은 위쪽의 AWS 제어에서 아래쪽의 사용자 제어로 이어지며, 각 카드에는 해당 모드를 선택하는 요청 헤더 값만 표시됩니다.

개발자를 위한 AWS 보안 활용

SSE-KMS의 비용 문제

두 개의 행이 있습니다. Bucket Keys를 사용하지 않을 경우, 객체 요청마다 Amazon S3에서 AWS KMS로 화살표가 하나씩, 총 여섯 개가 이어집니다. Bucket Keys를 사용할 경우, S3 내부에 보관된 버킷 수준 키에서 화살표 하나만 나갑니다. 아래 설명에는 Bucket Keys가 DSSE-KMS에서는 사용할 수 없다고 나와 있습니다.

  • 사용하지 않을 경우: 객체마다 KMS 호출 1회
  • Bucket Keys 사용 시: 단기 키 하나를 재사용
  • DSSE-KMS에서는 사용 불가
  • KMS 요청을 최대 99%까지 절감
개발자를 위한 AWS 보안 활용

테이블이 아니라 필드를 암호화

저장 시 암호화는 이미 적용됨

  • 읽기 권한이 있는 사용자라면 쿼리 결과로 평문을 받음

속성 다섯 개로 구성된 DynamoDB 항목 하나입니다. 두 속성은 암호문을 담고 있으며 파란색 레일로 표시되고, 파티션 키·정렬 키·타임스탬프는 평문 상태로 유지됩니다. 아래 녹색 상자에는 테이블 전체가 저장 시 암호화된다고 나와 있습니다.

개발자를 위한 AWS 보안 활용

테이블이 아니라 필드를 암호화

저장 시 암호화는 이미 적용됨

  • 읽기 권한이 있는 사용자라면 쿼리 결과로 평문을 받음

AWS Database Encryption SDK

  • 코드에서 선택한 속성만 암호화
  • DynamoDB가 항목을 찾는 데 사용하는 파티션 키와 정렬 키는 인덱싱 대상이라 평문으로 유지됨

속성 다섯 개로 구성된 DynamoDB 항목 하나입니다. 두 속성은 암호문을 담고 있으며 파란색 레일로 표시되고, 파티션 키·정렬 키·타임스탬프는 평문 상태로 유지됩니다. 아래 녹색 상자에는 테이블 전체가 저장 시 암호화된다고 나와 있습니다.

개발자를 위한 AWS 보안 활용

TLS는 제공될 뿐 필수는 아님

제공될 뿐, 강제되지 않음

  • S3는 HTTP와 HTTPS 요청 모두에 응답

두 가지 시나리오입니다. 버킷에 조건이 없으면 HTTPS 클라이언트와 HTTP 클라이언트 모두 객체에 접근할 수 있습니다. 거부 조건이 있으면 HTTP 경로는 빨간 X 표시에서 멈추고 연결되지 않습니다.

개발자를 위한 AWS 보안 활용

TLS는 제공될 뿐 필수는 아님

제공될 뿐, 강제되지 않음

  • S3는 HTTP와 HTTPS 요청 모두에 응답

필수 조건으로 설정하기

  • 버킷 정책: aws:SecureTransport가 false이면 거부
  • 정상적인 클라이언트는 아무 영향도 받지 않음

두 가지 시나리오입니다. 버킷에 조건이 없으면 HTTPS 클라이언트와 HTTP 클라이언트 모두 객체에 접근할 수 있습니다. 거부 조건이 있으면 HTTP 경로는 빨간 X 표시에서 멈추고 연결되지 않습니다.

개발자를 위한 AWS 보안 활용

어떤 기관이 이름을 보증하는가

공개 이름

  • ACM: 공개적으로 신뢰되고, 무료이며, 자동 갱신

사용자 네트워크에서만 확인되는 이름

  • AWS Private CA: 자체 인증 기관
  • 공용 인터넷에서는 신뢰되지 않음

인증서를 발급할 수 있는 주체를 보여주는 카드 두 개가 쌓여 있습니다. 위쪽 카드인 공개 이름은 reports.example.com을 확인 대상 이름으로, ACM을 발급 기관으로 제시하며 어디서나 신뢰됩니다. 아래쪽 카드인 내부 이름은 admin.example.internal을 제시하며 VPC 내부에서만 확인되고, AWS Private CA가 발급 기관입니다.

개발자를 위한 AWS 보안 활용

비공개 절반의 분실 책임은 사용자에게

누가 보유하는가

  • ACM: AWS가 보관
  • EC2 키 페어 또는 모든 SSH 키: 비공개 부분은 사용자가 단 한 번 보유

어느 쪽이 어느 절반을 보유하는지 보여주는 카드 두 개가 쌓여 있습니다. 위쪽 카드인 공개 절반은 AWS나 인스턴스에 저장된다고 설명합니다. 아래쪽 주황색 카드인 비공개 절반은 세 가지 항목을 보여줍니다. 사본은 단 하나뿐이며 여분이 없다는 것, Secrets Manager에 보관해야 한다는 것(녹색 체크 표시), 그리고 저장소나 노트북, 채팅에는 절대 두면 안 된다는 것(주황색 X 표시)입니다.

개발자를 위한 AWS 보안 활용

비공개 절반의 분실 책임은 사용자에게

누가 보유하는가

  • ACM: AWS가 보관
  • EC2 키 페어 또는 모든 SSH 키: 비공개 부분은 사용자가 단 한 번 보유

사용자 소유라면

  • 저장소가 아닌 Secrets Manager에 보관
  • 일정 주기로 교체

어느 쪽이 어느 절반을 보유하는지 보여주는 카드 두 개가 쌓여 있습니다. 위쪽 카드인 공개 절반은 AWS나 인스턴스에 저장된다고 설명합니다. 아래쪽 주황색 카드인 비공개 절반은 세 가지 항목을 보여줍니다. 사본은 단 하나뿐이며 여분이 없다는 것, Secrets Manager에 보관해야 한다는 것(녹색 체크 표시), 그리고 저장소나 노트북, 채팅에는 절대 두면 안 된다는 것(주황색 X 표시)입니다.

개발자를 위한 AWS 보안 활용

하나가 아닌 세 가지 답

모드, 키 제어, 전송이라는 세 가지 항목에 번호가 매겨진 카드가 있으며, 각 카드는 해당 항목에 답하는 헤더나 조건 키를 보여줍니다. 아래 설명에는 세 번째 확인 항목만 암호화 설정 밖에 있다고 나와 있습니다.

  1. 모드: 객체를 작성한 주체
  2. 키 제어: 이 계정이든 다른 계정이든 복호화할 수 있는 주체
  3. 전송: 필수인지, 제공되기만 하는지
개발자를 위한 AWS 보안 활용

연습해 봅시다!

개발자를 위한 AWS 보안 활용

Preparing Video For Download...