2026-05-02 AWS S3 암호화 클라우드 보안 컴플라이언스

AWS S3 보안 완전 가이드 — 암호화·접근 제어·가용성·컴플라이언스

S3는 가장 널리 쓰이는 AWS 스토리지인 동시에 가장 많은 보안 침해 사고가 발생한 서비스입니다. 암호화 방식 4가지, 안전한 접근 경로, 버전 관리와 복제를 통한 가용성 확보, 실전 버킷 정책, Capital One 사고 분석, 그리고 주요 컴플라이언스 대응 설정까지 한 번에 정리합니다.

1. S3 암호화 방식

S3의 암호화는 크게 서버 사이드 암호화(SSE)클라이언트 사이드 암호화(CSE)로 나뉩니다. 서버 사이드는 AWS가 데이터를 저장할 때 자동으로 암호화하고, 클라이언트 사이드는 데이터를 업로드하기 전에 사용자가 직접 암호화합니다.

SSE-S3 기본값

AWS가 관리하는 키(AES-256)로 자동 암호화합니다. 2023년 1월부터 모든 신규 버킷에 기본 적용됩니다.

✔ 설정 불필요, 추가 비용 없음
✘ 키 관리·감사 권한 없음

SSE-KMS 권장

AWS KMS CMK(Customer Managed Key)로 암호화합니다. 키 정책, CloudTrail 로그로 모든 복호화 이벤트 추적이 가능합니다.

✔ 세밀한 키 권한, 감사 로그
✘ KMS 요청 비용 발생 ($0.03/10,000 req)

SSE-C 고급

고객이 직접 키를 제공합니다. PUT/GET 요청 시 HTTP 헤더에 키를 포함해야 하며 AWS는 키를 저장하지 않습니다.

✔ 키를 AWS에 맡기지 않음
✘ 키 분실 시 데이터 복구 불가, S3 콘솔 미지원

CSE 클라이언트

S3에 업로드하기 전에 애플리케이션에서 직접 암호화합니다. AWS Encryption SDK 또는 자체 라이브러리 사용.

✔ AWS에서도 평문 노출 없음
✘ 구현 복잡, 서버 사이드 검색 불가
방식 키 관리 주체 감사 로그 콘솔 지원 주요 사용 사례
SSE-S3 AWS (완전 관리) 미지원 지원 기본 암호화, 규정 없음
SSE-KMS 고객 (KMS CMK) CloudTrail 지원 ISMS-P, PCI-DSS, 금융권
SSE-KMS (DSSE) 고객 (KMS CMK) CloudTrail 지원 이중 암호화 요구 규정 (FIPS 140-3)
SSE-C 고객 (외부 키) 제한적 미지원 온프레미스 HSM 연동
CSE 고객 (완전 자체) 자체 구현 미지원 최고 기밀 데이터, 주권 클라우드
SSE-KMS를 선택해야 하는 이유: ISMS-P 2.7.1 "암호키 관리", PCI-DSS 요건 3.6 "키 관리 절차"는 단순 암호화뿐 아니라 키 생명주기 관리와 접근 감사를 요구합니다. SSE-S3는 이 요건을 충족하기 어렵습니다. 규제 대상 업체라면 SSE-KMS + CMK 조합을 기본으로 사용하세요.

전송 중 암호화 (Encryption in Transit)

저장 시 암호화 외에 전송 중 암호화도 필수입니다. S3는 HTTP와 HTTPS를 모두 허용하므로 버킷 정책으로 HTTPS를 강제해야 합니다.

// 버킷 정책 — HTTP 요청 거부 (전송 중 암호화 강제)
{
  "Sid": "DenyNonHTTPS",
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:*",
  "Resource": [
    "arn:aws:s3:::my-bucket",
    "arn:aws:s3:::my-bucket/*"
  ],
  "Condition": {
    "Bool": { "aws:SecureTransport": "false" }
  }
}

2. S3 접근 경로와 제어

S3에 접근하는 경로는 크게 퍼블릭 인터넷VPC 내부로 나뉩니다. 접근 경로를 최소화하고 VPC 엔드포인트를 통해 트래픽이 퍼블릭 인터넷을 경유하지 않도록 하는 것이 보안의 핵심입니다.

🌐

퍼블릭 인터넷 접근

  • HTTPS endpoint: s3.amazonaws.com
  • 버킷 정책 + IAM으로 접근 제한
  • 퍼블릭 액세스 차단 설정 필수
  • 정적 웹사이트 호스팅 시 사용
  • CloudFront OAC와 함께 사용 권장
🔒

VPC 엔드포인트 (권장)

  • Gateway 엔드포인트 — 무료, 라우팅 테이블에 추가
  • Interface 엔드포인트 — 유료, DNS 통해 PrivateLink 사용
  • 트래픽이 AWS 내부 네트워크만 통과
  • 엔드포인트 정책으로 허용 버킷 제한 가능
  • VPC Flow Logs로 S3 트래픽 모니터링

S3 Gateway 엔드포인트 vs Interface 엔드포인트

항목 Gateway 엔드포인트 Interface 엔드포인트 (PrivateLink)
비용 무료 시간당 요금 + 데이터 처리 요금
DNS 해석 라우팅 테이블 기반 Private DNS (VPC DNS 해석)
온프레미스 연동 불가 (VPC 내부만) 가능 (Direct Connect/VPN 경유)
엔드포인트 정책 지원 지원
적합한 환경 VPC 내 EC2/Lambda 온프레미스 연동, 멀티 VPC

퍼블릭 액세스 차단 (Block Public Access)

S3에는 4가지 퍼블릭 액세스 차단 설정이 있습니다. 특별한 이유가 없다면 모두 활성화해야 합니다.

설정차단 대상권장
BlockPublicAcls 퍼블릭 ACL 추가 및 PUT 요청 차단 활성화
IgnorePublicAcls 기존 퍼블릭 ACL 무시 활성화
BlockPublicPolicy 퍼블릭 액세스를 허용하는 버킷 정책 차단 활성화
RestrictPublicBuckets 퍼블릭 정책이 있는 버킷에서 퍼블릭·교차 계정 액세스 제한 활성화
AWS Organizations SCP로 계정 전체 차단: 개별 버킷 설정에 의존하지 말고 SCP로 s3:PutBucketPublicAccessBlock을 제어해 조직 내 모든 계정에서 퍼블릭 액세스 차단을 강제하는 것이 안전합니다.

3. 버전 관리 & 크로스 리전 복제로 가용성 확보

S3는 99.999999999%(11 9's) 내구성을 제공하지만, 랜섬웨어·실수 삭제·리전 장애에 대비하려면 버전 관리(Versioning)복제(Replication)를 함께 사용해야 합니다.

버전 관리 (Versioning)

항목설명
동작 방식 같은 키로 업로드 시 새 버전 ID 부여 — 기존 버전 보존
삭제 동작 DELETE 요청 시 삭제 마커(Delete Marker) 생성 — 이전 버전 유지
MFA Delete 버전 영구 삭제 시 MFA 토큰 필요 — 랜섬웨어·내부자 공격 대응
수명 주기 정책 오래된 버전을 Glacier로 전환하거나 자동 삭제해 비용 절감
Object Lock WORM(쓰기 1회·읽기 다수) 모드 — Compliance 또는 Governance 모드
Object Lock Compliance 모드: 설정된 보존 기간 동안 루트 계정을 포함한 누구도 객체를 삭제하거나 덮어쓸 수 없습니다. 금융·의료 등 규제 데이터의 불변 보관에 적합합니다.

복제 (Replication)

유형설명사용 사례
CRR (Cross-Region Replication) 다른 리전의 버킷으로 자동 복제 재해 복구(DR), 지역 규정(데이터 주권), 지연 시간 감소
SRR (Same-Region Replication) 같은 리전 내 다른 버킷으로 복제 로그 집계, 개발/운영 환경 데이터 동기화, 계정 간 복제
RTC (Replication Time Control) 99.99% 객체를 15분 내 복제 SLA 보장 RPO 15분이 요구되는 규정 환경
복제 주의사항: CRR/SRR은 규칙 활성화 이후에 업로드된 객체만 복제합니다. 기존 객체를 복제하려면 S3 Batch Operations의 Copy 작업을 별도로 실행해야 합니다. 또한 소스 버킷에서 삭제 마커는 기본적으로 복제되지 않으므로 명시적으로 활성화해야 합니다.

4. 버킷 정책 실전 예시

버킷 정책은 JSON 기반의 리소스 기반 정책으로, IAM 정책과 함께 S3 접근의 핵심 제어 수단입니다. 아래는 실무에서 자주 사용하는 패턴입니다.

패턴 1 — 특정 VPC 엔드포인트에서만 접근 허용

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowVPCEOnly",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::my-private-bucket",
        "arn:aws:s3:::my-private-bucket/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpce": "vpce-0123456789abcdef0"
        }
      }
    }
  ]
}

패턴 2 — SSE-KMS 암호화 강제 (암호화되지 않은 PUT 차단)

{
  "Sid": "DenyUnencryptedObjectUploads",
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:PutObject",
  "Resource": "arn:aws:s3:::my-bucket/*",
  "Condition": {
    "StringNotEquals": {
      "s3:x-amz-server-side-encryption": "aws:kms"
    }
  }
}

패턴 3 — CloudFront OAC를 통한 정적 웹사이트 배포

{
  "Sid": "AllowCloudFrontOAC",
  "Effect": "Allow",
  "Principal": {
    "Service": "cloudfront.amazonaws.com"
  },
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::my-website-bucket/*",
  "Condition": {
    "StringEquals": {
      "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/EDFDVBD6EXAMPLE"
    }
  }
}

패턴 4 — 특정 IAM 역할만 허용 + 다른 모든 접근 차단

{
  "Sid": "DenyAllExceptSpecificRole",
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:*",
  "Resource": [
    "arn:aws:s3:::my-sensitive-bucket",
    "arn:aws:s3:::my-sensitive-bucket/*"
  ],
  "Condition": {
    "ArnNotLike": {
      "aws:PrincipalArn": [
        "arn:aws:iam::123456789012:role/DataAccessRole",
        "arn:aws:iam::123456789012:role/AuditRole"
      ]
    }
  }
}

패턴 5 — 교차 계정 접근 (백업 계정으로 데이터 전송)

{
  "Sid": "CrossAccountBackup",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::BACKUP-ACCOUNT-ID:role/BackupRole"
  },
  "Action": [
    "s3:GetObject",
    "s3:PutObject",
    "s3:ListBucket"
  ],
  "Resource": [
    "arn:aws:s3:::my-backup-bucket",
    "arn:aws:s3:::my-backup-bucket/*"
  ]
}

5. S3 보안 침해 사례

S3 보안 사고의 대부분은 잘못된 설정(Misconfiguration)에서 비롯됩니다. 대표적인 실제 사례를 통해 어떤 설정이 공격 경로가 되는지 살펴봅니다.

⚠ Capital One 데이터 침해 (2019)
피해 규모
미국·캐나다 고객 1억 명 이상의 신용카드 신청 데이터 유출
공격 경로
SSRF(Server-Side Request Forgery) → EC2 인스턴스 메타데이터(IMDS v1) 접근 → IAM 역할 자격증명 탈취 → S3 버킷 데이터 다운로드
근본 원인
1) WAF 규칙 오설정으로 SSRF 허용
2) EC2 인스턴스 역할에 과도한 S3 권한 부여 (s3:GetObject 전체 허용)
3) IMDSv2 미적용 (토큰 없이 메타데이터 접근 가능)
4) S3 Access Logs 미사용으로 유출 지연 탐지
벌금
미국 금융 당국(OCC)으로부터 $80M(약 1,040억 원) 제재
⚠ Twitch 소스코드 유출 (2021)
피해 규모
소스코드 전체, 스트리머 수익 데이터, 내부 문서 125GB 유출
공격 경로
서버 오설정으로 인한 내부 Git 저장소 및 S3 버킷 접근
근본 원인
내부 시스템의 네트워크 분리 미흡 및 접근 권한 과다 부여
⚠ Accenture S3 버킷 노출 (2017)
피해 규모
클라우드 플랫폼 마스터 키, 비밀 API 데이터, 암호화 키 등 포함된 버킷 4개 공개 노출
공격 경로
버킷 퍼블릭 접근 차단 미설정 — 누구나 URL만 알면 접근 가능
근본 원인
S3 Block Public Access 미적용, 버킷 내 민감 데이터 분류 체계 부재

사례에서 얻는 교훈

공격 패턴대응 방법
SSRF + IMDS 자격증명 탈취 IMDSv2 강제 적용, EC2 역할에 최소 권한만 부여
퍼블릭 버킷 노출 Block Public Access 4개 설정 전체 활성화, AWS Config 규칙으로 지속 감시
과도한 IAM 권한 특정 버킷·접두사 단위 권한 부여, IAM Access Analyzer 사용
유출 지연 탐지 S3 Server Access Logging + CloudTrail Data Events + GuardDuty S3 보호 활성화
민감 데이터 무분별 저장 Macie로 PII/민감 데이터 자동 탐지 및 분류

6. 컴플라이언스별 S3 설정

주요 보안 규정은 S3에 저장·전송되는 데이터에 대해 구체적인 기술 요건을 요구합니다. 아래 체크리스트는 ISMS-P, PCI-DSS v4, 금융보안원 클라우드 가이드 기준입니다.

🔐 암호화 SSE-KMS + TLS 강제
필수
모든 버킷에 기본 암호화 활성화 (SSE-KMS CMK)
ISMS-P 2.7.1 / PCI-DSS 3.5 — 저장 중 데이터 암호화 요건
필수
버킷 정책으로 HTTP 요청 차단 (aws:SecureTransport: false → Deny)
전송 중 암호화 강제 — ISMS-P 2.7.2 / PCI-DSS 4.2.1
필수
KMS CMK 키 로테이션 활성화 (연 1회 이상)
ISMS-P 2.7.4 암호키 생명주기 관리
권장
버킷 정책으로 SSE-KMS 외 PUT 요청 차단
SSE-S3 또는 암호화 없는 업로드 방지
🚫 접근 제어 IAM + 버킷 정책 + Block Public Access
필수
모든 버킷 Block Public Access 4개 설정 활성화
AWS Foundational Security Best Practices / ISMS-P 2.6.2
필수
VPC 엔드포인트 배포 후 퍼블릭 인터넷 경유 접근 차단
금융보안원 클라우드 가이드 — 내부 트래픽은 AWS 내부 경로 사용
필수
IAM 최소 권한 원칙 — 특정 버킷·접두사 단위 권한 부여
ISMS-P 2.5.1 / PCI-DSS 7.2 최소 권한 접근
권장
EC2 인스턴스 IMDSv2 강제 적용 (HttpTokens: required)
Capital One 유형 SSRF 공격 방지
권장
AWS Organizations SCP로 퍼블릭 버킷 생성 방지
계정 단위 거버넌스 — 설정 오류를 구조적으로 예방
🗂️ 가용성 & 데이터 보호 Versioning + Replication + Object Lock
필수
중요 버킷 버전 관리(Versioning) 활성화
ISMS-P 2.9.2 백업 및 복구 — 실수 삭제·랜섬웨어 대응
필수
MFA Delete 활성화 (루트 계정)
버전 영구 삭제를 위한 2차 인증 요구
권장
CRR으로 DR 리전에 자동 복제 설정
RPO/RTO 목표에 따른 재해 복구 전략 — 금융보안원 DR 요건
권장
규제 데이터에 Object Lock (Compliance 모드) 적용
전자금융감독규정 / 의료법 — 데이터 불변성 보장
권장
수명 주기 정책으로 오래된 버전 Glacier 이전
비용 효율적인 장기 보존 — 데이터 보존 규정 준수
📋 감사 & 모니터링 CloudTrail + Access Logs + Macie + GuardDuty
필수
CloudTrail Data Events (S3 GetObject/PutObject/DeleteObject) 활성화
ISMS-P 2.11.1 로그 수집 — 객체 수준 접근 이력 기록
필수
S3 Server Access Logging 활성화 (별도 로그 버킷)
HTTP 요청 수준 로그 — 이상 트래픽 분석 근거
권장
GuardDuty S3 Protection 활성화
비정상 API 호출, 의심스러운 IP, 자격증명 오용 자동 탐지
권장
Amazon Macie로 버킷 내 민감 데이터(PII) 자동 탐지
ISMS-P 개인정보 처리 항목 — 주민번호·카드번호 등 민감 데이터 식별
권장
AWS Config 규칙 적용 (s3-bucket-public-read-prohibited 등)
지속적 컴플라이언스 모니터링 및 자동 알림
권장
IAM Access Analyzer로 외부 접근 가능 버킷 탐지
의도치 않은 교차 계정·퍼블릭 접근 주기적 검토
한 번에 점검하는 방법 — AWS Security Hub: Security Hub의 AWS Foundational Security Best Practices 표준을 활성화하면 S3 관련 20개 이상의 보안 점검 항목이 자동으로 실행되어 미준수 항목과 심각도를 대시보드로 확인할 수 있습니다.

마무리

S3는 설정이 쉬운 만큼 보안 실수도 쉽게 발생합니다. 핵심 원칙을 정리하면 다음과 같습니다.

영역핵심 원칙
암호화 SSE-KMS CMK + HTTP 차단 버킷 정책 = 저장·전송 모두 암호화
접근 제어 Block Public Access 전체 활성화 + VPC 엔드포인트 + 최소 권한 IAM
가용성 Versioning + MFA Delete + CRR = 삭제·랜섬웨어·리전 장애 대응
감사 CloudTrail Data Events + Macie + GuardDuty = 탐지·분류·대응
거버넌스 AWS Config + Security Hub + SCP = 지속적 컴플라이언스 자동화
S3 보안은 "한 번 설정"이 아닙니다: 새 버킷이 생성될 때마다, 권한이 변경될 때마다, 새 팀원이 합류할 때마다 설정 오류가 발생할 수 있습니다. AWS Config + Security Hub로 지속적으로 모니터링하고, 분기별로 IAM Access Analyzer 결과를 검토하는 운영 체계를 갖추는 것이 중요합니다.

이 글이 도움이 되셨나요? S3 보안 설정이나 컴플라이언스 대응에 대해 궁금한 점이 있으시면 문의하기로 연락 주세요.