S3 & CloudFront 알아보기

S3 & CloudFront 알아보기

Category
Published
August 3, 2024
Last updated
Last updated September 7, 2024
💡
이 포스트는 현재 작성중입니다

개요

S3를 많이 사용은 해보았으나 여러 권한과 ACL, 퍼블릭 엑세스등에 대해서 제대로 알지 못한 상태로 사용하고 있었다.
여기에 CloudFront와 정적 웹사이트 배포까지 사용해보니 여러 문제를 트러블 슈팅을 할때도 어떤것이 문제가 되는건지 확실히 장담하지 못하고 찜찜하게 넘어가는 경우가 많아 S3를 분석하고 정리해보았다.

S3

객체 소유권(Object Ownership)

notion image
notion image
ACL 활성화 여부는 ‘객체 소유권’에서 설정할 수 있습니다. ACL 비활성화시 객체 엑세스 제어를 버킷 정책(bucket policy)으로 관리할 수 있습니다.
  • ACL 비활성화(권장)
    • ACL을 비활성화하면 모든 객체는 버킷의 소유자가 소유합니다
    • ACL은 버킷 데이터 권한에 영향을 주지 않고, 데이터 권한은 정책(Policy)로 관리됩니다
  • ACL 활성화
    • 버킷 소유자 선호
      • 새 객체를 작성할 때 bucket-owner-full-control ACL을 지정하면 새 객체를 버킷 보유자가 소유합니다. 그렇지 않으면 객체 라이터가 소유합니다
      • aws s3 cp file.txt s3://DOC-EXAMPLE-BUCKET --acl bucket-owner-full-control
      • 버킷 정책을 이용해 bucket-owner-full-control 지정시에만 객체를 작성할 수 있게 설정할 수 있습니다.
    • 객체 라이터
      • 객체 라이터가 객체를 소유합니다
 
S3의 대부분의 최신 사례에서는 더이상 ACL을 사용할 필요가 없습니다. 각 객체에 대해서 엑세스를 개별적으로 제어해야 하는 상황을 제외하고는 버킷 정책을 사용하는 것을 권장합니다.

ACL(Access Control List, 엑세스 제어 목록)

notion image
ACL(Access Control List, 엑세스 제어 목록)은 S3 버킷과 객체에 대한 권한을 관리하는 방법 중 하나입니다. 각 객체와 버킷에 대해 별도의 권한을 설정할 수 있으며, 이를 통해 세부적인 액세스 제어가 가능합니다.
다른 객체 엑세스 권한 관리 방법으로는 버킷 정책이 있습니다. 대부분의 상황에서 ACL보다는 버킷 정책을 사용하는것을 권장합니다.

버킷 정책(Bucket Policy)

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

notion image
notion image
퍼블릭 엑세스 차단은 ACL이나 버킷 정책에 우선하여 작동하는 설정입니다. 이는 ACL, 버킷 정책, 엑세스 지점등을 통해 부여된 퍼블릭 엑세스를 효과적으로 차단하기 위함입니다.
AWS가 IAM Access Analyzer등의 버킷 퍼블릭 접근 여부 체크 서비스를 제공할 정도로 공개 버킷은 지양해야 할 대상이기에, 특정 사용 사례를 제외하고는 버킷 퍼블릭 접근 허용을 금지하고 공개가 필요할 때는 CloudFront등을 사용하는 것이 좋습니다.
 
4개의 설정이 있으며 상위 2개는 ACL을 차단하는 설정, 아래 2개는 버킷 정책과 엑세스 지점에 관한 설정입니다.
설정에서 ‘새 ~~~’로 정의된 것은 기존 객체의 퍼블릭 엑세스 여부에 영향을 미치지 않습니다. ‘임의의 ~~~’로 정의된 것은 모든 객체에 적용됩니다.
이때 ‘새 ~~~’의 작동 방식은 퍼블릭 엑세스를 허용하는 버킷 정책을 추가 할때 이를 차단하는 방식으로 보입니다.
notion image
// 퍼블릭 엑세스를 허용하는 버킷 정책 예시 { "Sid": "Stmt1507637391106", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket-name/*" },
‘임의의 ~~~’는 정책은 자유롭게 추가할 수 있게 하고, 정책과 관련없이 무조건 퍼블릭 엑세스를 막는 방식입니다.
 
  • ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
  • 임의의 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
  • 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
  • 임의의 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 및 교차 계정 액세스 차단

CloudFront

S3에서 퍼블릭 엑세스를 차단해도 CloudFront에서 원본 엑세스 제어(Origin Access Control, OAC)를 설정하고 S3 버킷 정책을 설정하면 CloudFront로 객체에 접근할 수 있습니다. 이를 권장합니다.
notion image
notion image
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::basak-image-bucket/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::123456789101:distribution/ABCDEFGHIJKLMN" } } } ] }

Reference