본문 바로가기
AWS

[AWS] Amazon S3 Security

by hxxyeoniii 2025. 11. 13.

Amazon S3 Security - 암호화 방식

S3에서 데이터를 보호하는 4가지 방법

 

1. SSE-S3(S3 Managed Keys)

  • AWS가 키를 완전히 관리하는 가장 간단한 방식
  • 객체는 서버 측에서 암호화됨
  • AES-256 알고리즘 사용
  • 각 개체마다 고유한 키로 암호화되고, 그 키 자체도 정기적으로 교체되는 마스터 키로 암호화됨
  • 무료
  • 헤더 : x-amz-server-side-encryption: AES256

 

2. SSE-KMS(KMS Keys)

  • AWS KMS(Key Management Service)를 통해 처리되고 관리되는 키를 사용해 암호화
  • 사용자가 키 제어 가능 + CloudTrail을 사용해 키 감사
  • 객체는 서버 측에서 암호화 됨
  • 헤더: x-amz-server-side-encryption: aws:kms
  • KMS API 호출 비용 발생
  • KMS 키 정책으로 누가 키를 사용할 수 있는지 제어 가능
  • 키에 대한 세밀한 접근 제어가 필요할 때 사용

 

3. SSE-C(Customer-Provided Keys)

  • 고객이 직접 암호화 키를 관리하고 제공
  • AWS는 키를 저장하지 않음 -> 사용 후 즉시 삭제
  • 반드시 HTTPS 사용
  • 모든 요청마다 HTTP 헤더로 암호하 키를 전달
  • AWS CLI나 SDK를 통해서만 사용 가능
  • 키를 잃어버리면 객체 볼구 불가능

 

4. Client Side Encryption

  • S3에 업로드하기 전 클라이언트 측에서 직접 암호화
  • AWS는 이미 암호화된 데이터만 받음 -> AWS는 데이터를 볼 수 없음
  • Amazon S3 Client-Side Encryption Library 사용
  • 가장 강력한 보안 수준

Encryption in Transit : 전송 중 암호화

  • HTTP : 암호화 X
  • HTTPS : SSL/TLS 암호화
  • SSE-C는 반드시 HTTPS 사용

Default Encryption vs Bucket Policies

버킷 정책은 항상 "기본 암호화" 전에 평가된다.

 

API 요청 -> Bucket Policy 평가 -> Default Encryption 적용

  • Bucket Policy가 먼저 평가
  • Bucket Policy에서 거부되면 Default Encryption까지 갈 수 없음

 

버킷 정책 예시

{
  "Effect": "Deny",
  "Action": "s3:PutObject",
  "Condition": {
    "StringNotEquals": {
      "s3:x-amz-server-side-encryption": "AES256"
    }
  }
}

-> 헤더가 AES256이 아니면 업로드 거부

 

{
  "Effect": "Deny",
  "Action": "s3:PutObject",
  "Condition": {
    "Null": {
      "s3:x-amz-server-side-encryption": "true"
    }
  }
}

-> 암호화 헤더가 아예 없으면 업로드 거부


CORS

Cross-Origin Resource Sharing 기본 개념

웹 브라우저는 보안상 Same Origin Policy를 적용한다.

  • 기본적으로 다른 Origin으로의 요청을 차단
  • JavaScript에서 다른 도메인의 리소스에 접근하려면 허가가 필요

 

Amazon S3 - CORS

상황 예시

> 웹사이트: https://www.myapp.com 

> S3 버킷: https://mybucket.s3.amazonaws.com

> 웹사이트의 JavaScript가 S3의 이미지/파일을 직접 요청

 

-> 브라우저가 다른 Origin(S3)으로의 요청을 차단하므로 S3 버킷에 CORS 설정 추가가 필요!

 

CORS 설정 주요 항목

  • AllowedOrigins : 어떤 Origin에서의 요청을 허용할지 지정
  • AllowedMethods : 허용할 HTTP 메서드 지정 -> GET, PUT, POST
  • AllowedHeaders : 클라이언트가 보낼 수 있는 헤더 지정 -> 보통 "*"로 모든 헤더 허용

S3 Access Logs

  • S3 버킷에 대한 모든 액세스 요청을 기록
  • 누가, 언제, 무엇을, 어떻게 접근했는지 추적 가능
  • 로깅 대상 버킷은 동일한 AWS 리전에 있어야 함
  • 로깅 버킷을 모니터링하는 버킷과 동일하게 설정하면 안 됨 -> 로깅 루프가 생성되고 무한 반복되어 버킷의 크기가 기하급수적으로 증가..
  • 무료
  • 로그 분석 도구 : Amazon Athena, Amazon QuickSight

Pre-Signed URLs

  • 미리 서명된 URL
  • 임시로 S3 객체에 접근할 수 있는 URL -> S3 콘솔, AWS CLI, SDK로 생성 가능
  • IAM 자격 증명 없이도 특정 객체에 접근 가능
  • 보안을 유지하면서 제한된 시간 동안 접근 허용
  • ex) 로그인한 사용자만 S3 버킷에서 프리미엄 비디오 다운 허용

 

URL 만료 기한

  • S3 콘솔 : 1분 ~ 720분(12시간)
  • AWS CLI : 1초 ~ 168시간(7일)
  • SDK : 1초 ~ 168시간(7일)

S3 Glacier Vault Lock & Object Lock

둘다 WORM 모델 사용하나 적용 대상과 방식이 다르다.

 

1. S3 Glacier Vault Lock

  • Glacier 볼트 전체에 적용되는 정책
  • 한번 잠그면 절대 변경, 삭제 불가(AWS도 불가능)
  • 장기 아카이빙 + 규정 준수 목적
  • ex) 금융 기록 보관, 의료 기록, 법적 증거 자료 등

 

2. Object Lock

  • 개별 객체에 적용
  • 버전 관리 필수
  • 더 유연한 보호 메커니즘
  • 규정 준수 모드와 거버넌스 모드 존재

Compliance(규정 준수 모드)

  • 가장 엄격한 보호
  • 절대 삭제, 수정 불가(루트 권한도 불가)
  • 보존 기간 단축 불가 -> 연장만 가능
  • 보존 모드 변경 불가

Governance(거버넌스 모드)

  • 유연한 보호
  • 특별 권한이 있으면 수정, 삭제 가능
  • 보존 기간 변경 가능
  • 테스트나 내부 정책용

Retention Period(보관 기간)

  • 객체가 보호되는 기간으로 고정된 기간 설정
  • 연장은 언제나 가능
  • 규정 준수 모드는 단축 불가
  • 연장은 둘다 가능

Legal Hold(법적 보관)

  • 보관 기간과 무관하게 무기한 보호
  • On, Off 스위치 처럼 작동 -> 수동 해제
  • 보관 모드와는 독립적

S3 Object Lambda

  • S3에서 객체를 가져올 때 실시간으로 데이터를 변환하는 기능
  • S3 버킷 상위수준에 S3 액세스 포인트를 생성하고 람다 함수와 연결
  • ex) 분석이나 비프로덕션 환경에서 개인 식별 정보 삭제

 

* 액세스 포인트

S3 버킷에 대한 여러 진입점(Entry Point)을 만들어 접근 관리를 단순화 하는 기능

 

-> 각 액세스 포인트마다 고유의 DNS 이름과 정책을 가짐

 

 

 

 

 

출처 : https://velog.io/@gagaeun/AWS-Amazon-S3-Security

'AWS' 카테고리의 다른 글

[AWS] Advanced Storage on AWS  (0) 2025.12.01
[AWS] Global Infrastructure  (0) 2025.11.27
[AWS] Advanced S3  (0) 2025.11.12
[AWS] Amazon S3  (1) 2025.11.11
[AWS] Route 53  (0) 2025.11.11