AWS

AWS S3 권한이란?

Somaz 2023. 3. 29. 20:00
728x90
반응형

Overview

AWS S3의 권한에 대해서 공부해보려고 한다.

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example1.html

 

 

AWS S3 권한

AWS S3 권한에 종류는 아래와 같다.

  • 퍼블릭 액세스 차단(버킷 설정) (Block Public Access)
  • 버킷 정책(Bucket Policy)
  • 객체 소유권(Object Ownership)
  • ACL(액세스 제어 목록)
  • CORS(Cross-origin 리소스 공유)

 

퍼블릭 액세스 차단(버킷 설정)이란?

Amazon S3 퍼블릭 액세스 차단 기능은 Amazon S3 리소스에 대한 퍼블릭 액세스를 관리하는 데 도움이 되는 액세스 포인트, 버킷 및 계정에 대한 설정을 제공한다. 

 

기본적으로 새 버킷, 액세스 포인트 및 객체는 퍼블릭 액세스를 허용하지 않는다. 그러나 사용자는 퍼블릭 액세스를 허용하도록 버킷 정책, 액세스 포인트 정책 또는 객체 권한을 수정할 수 있다. 

 

S3 퍼블릭 액세스 차단 설정은 이러한 리소스에 대한 퍼블릭 액세스를 제한할 수 있도록 이러한 정책 및 권한을 재정의한다.

 

AWS S3 퍼블릭 액세스 차단은 버킷 및 해당 콘텐츠에 대한 퍼블릭 액세스가 차단되도록 버킷 수준에서 적용할 수 있는 설정 집합이다. 이 기능은 사용자가 S3에서 데이터의 보안 및 개인 정보 보호를 보장하도록 설계되었다.

 

AWS S3 퍼블릭 액세스 차단의 4가지 설정

  1. 퍼블릭 액세스 차단 설정: 이 설정은 객체 ACL 및 버킷 정책을 포함하여 버킷 및 해당 콘텐츠에 대한 모든 퍼블릭 액세스를 차단한다. 이 설정을 사용하면 다른 정책이나 설정으로 재정의할 수 없다.
  2. 새 퍼블릭 ACL을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단: 이 설정은 새 퍼블릭 액세스 제어 목록(ACL)이 버킷 또는 해당 콘텐츠에 적용되는 것을 차단한다. 기존 공용 ACL은 이 설정의 영향을 받지 않는다.
  3. 새로운 퍼블릭 버킷 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단: 이 설정은 새로운 퍼블릭 버킷 정책이 버킷 또는 해당 콘텐츠에 적용되는 것을 차단한다. 기존 퍼블릭 버킷 정책은 이 설정의 영향을 받지 않는다.
  4. 퍼블릭 액세스가 있는 액세스 포인트를 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단: 이 설정은 퍼블릭 액세스 포인트가 버킷 또는 해당 콘텐츠에 적용되는 것을 차단한다. 액세스 포인트는 S3 내의 버킷 및 객체에 대한 보안 액세스를 제공하는 데 사용된다.

이러한 각 설정은 독립적으로 적용할 수 있으며 함께 S3 버킷 및 해당 콘텐츠에 대한 퍼블릭 액세스를 차단하기 위한 포괄적인 도구를 제공한다.

 

AWS S3 퍼블릭 액세스 차단 설정은 버킷 정책 및 객체 ACL과 별개라는 점에 유의해야 한다. 퍼블릭 액세스 차단 설정이 활성화된 경우에도 버킷 정책 및 객체 ACL을 사용하여 버킷과 그 콘텐츠에 대한 퍼블릭 액세스 권한을 부여할 수 있다.

 

따라서 퍼블릭 액세스가 적절하게 제한되도록 S3 버킷과 관련된 모든 정책 및 설정을 검토하는 것이 중요하다.

요약하면 AWS S3 퍼블릭 액세스 차단은 S3 버킷과 해당 콘텐츠에 대한 퍼블릭 액세스를 차단하는 간단하고 효과적인 방법을 제공하여 S3에 저장된 데이터의 보안과 개인 정보 보호를 유지하는 데 도움이 된다.


버킷 정책(Bucket Policy)이란?

Amazon S3 버킷 정책은 버킷 및 해당 객체에 대한 액세스를 제어하기 위해 특정 S3 버킷에 적용할 수 있는 리소스 기반 액세스 정책이다. 버킷 정책은 AWS 계정, IAM 사용자 및 역할과 익명 액세스에 대한 권한을 정의하는 데 사용된다.

 

버킷 정책은 버킷에 대한 액세스를 제어하기 위한 일련의 규칙을 정의하는 JSON 문서이다. 정책은 버킷 자체에 연결되며 S3 관리 콘솔, AWS CLI를 통해 또는 AWS SDK를 사용하여 프로그래밍 방식으로 편집할 수 있다.

 

정책 구성요소

  • Principal(보안 주체): 버킷에 대한 액세스 권한이 부여되거나 거부된 엔터티이다. 이는 AWS 계정, IAM 사용자, 역할 또는 익명 사용자일 수 있다.
  • Action(조치): 허용되거나 거부되는 특정 조치. 작업은 버킷의 객체 나열에서 객체 업로드, 삭제 및 수정에 이르기까지 무엇이든 될 수 있다.
  • Resource(리소스): 정책이 적용되는 특정 버킷 또는 개체이다.
  • Effect(효과): 허용 또는 거부되는 권한입니다. 권한은 "허용" 또는 "거부"일 수 있다.
  • Condition(조건): 정책이 적용되기 위해 충족되어야 하는 추가 조건이다. 예를 들어 요청이 HTTPS를 통해 이루어진 경우에만 버킷에 대한 액세스 권한을 부여할 수 있는 조건이 필요할 수 있다.

버킷 정책은 S3 버킷과 해당 객체에 대한 액세스를 제어하는 ​​강력한 도구이지만 복잡하고 관리하기 어려울 수도 있다.

모든 버킷 정책을 신중하게 검토하고 테스트하여 정책이 올바르게 구성되고 의도하지 않은 액세스 권한을 부여하지 않는지 확인하는 것이 중요하다.

버킷 정책은 동일한 리소스에 적용되는 모든 IAM 정책을 재정의할 수 있다는 점도 중요하다. 따라서 모든 정책이 일관되고 서로 충돌하지 않도록 하는 것이 중요하다.

 

요약하면 Amazon S3 버킷 정책은 S3 버킷 및 해당 객체에 대한 액세스를 제어하는 ​​유연하고 강력한 방법을 제공한다. 액세스 제어를 위한 일련의 규칙을 정의함으로써 버킷 정책은 승인된 사용자만 S3에 저장된 민감한 데이터에 액세스할 수 있도록 보장할 수 있다.

 


 

버킷 정책 예시

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/somaz"
      },
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::somaz-bucket/*",
        "arn:aws:s3:::somaz-bucket"
      ],
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "10.0.0.0/16"
        },
        "StringEquals": {
          "s3:x-amz-acl": "public-read"
        }
      }
    },
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::somaz-bucket/secret/*"
      ]
    }
  ]
}

 

 

  • Version: 사용 중인 정책 언어의 버전이다.
  • Statement: 부여되거나 거부되는 권한을 정의하는 하나 이상의 개별 Statement 배열이다.
  • Effect: "허용" 또는 "거부"가 될 수 있는 Statement의 효과이다.
  • Principal: 설명이 적용되는 AWS 사용자, 역할 또는 계정이다.
  • Action: 승인 또는 거부되는 특정 조치
  • Resource: 문이 적용되는 특정 S3 버킷 또는 객체이다.
  • Condition: 명세서가 적용되기 위해 충족되어야 하는 추가 조건이다.

 

이 정책은 IAM 사용자 "somaz"에게 "somaz-bucket" 버킷의 객체를 읽고 쓸 수 있는 권한을 부여하지만 요청이 10.0.0.0/16 범위의 IP 주소에서 와야하고 객체의 ACL이 " public read"  이다. 그리고 모든 보안 주체에 대해 버킷의 "secret" 디렉터리에 있는 개체에 대한 액세스를 거부한다.

 

 

버킷 정책 주의할점

버킷 정책은 버킷을 소유한 동일한 AWS 계정이 소유한 객체에만 적용된다. 객체가 다른 계정에서 소유된 경우 버킷 정책이 적용되지 않는다. 이 경우 개체 소유자는 자신의 액세스 정책을 설정하거나 원하는 경우 개체를 공개할 수 있다. 따라서 S3 버킷 정책을 설계하고 적용할 때 객체의 소유권을 염두에 두는 것이 중요하다.

 


객체 소유권((Object Ownership))이란?

Amazon S3에서 객체 소유권은 버킷에 업로드된 객체를 소유한 사람과 결과적으로 해당 객체를 관리하고 액세스할 권한이 있는 사람을 결정한다. S3 객체 소유권은 버킷 소유자 선호(Bucket Owner Preferred) 또는 객체 라이터(Object Writer)로 설정할 수 있다.

  1. 버킷 소유자 선호(Bucket Owner Preferred): 이 설정은 S3 버킷에 업로드되는 객체의 소유권을 결정한다. 버킷 소유자 선호 설정이 활성화되면 S3 버킷을 소유한 AWS 계정도 해당 버킷에 업로드된 모든 객체의 소유자가 된다. 이렇게 하면 버킷 소유자가 객체를 삭제하고 액세스를 제어하는 ​​기능을 포함하여 버킷 내에 저장된 객체를 완전히 제어할 수 있다. 그러나 버킷 소유자 기본 설정이 비활성화된 경우 객체 소유자는 객체를 업로드한 AWS 계정에 의해 결정되며 버킷 소유자와 동일하지 않을 수 있다.
  2. 객체 라이터(Object Writer): 객체 작성자는 객체를 S3 버킷에 업로드하는 AWS 계정 또는 IAM 사용자이다. Object Writer는 업로드 작업을 수행하는 데 사용되는 자격 증명에 따라 결정되며 AWS 계정, IAM 사용자 또는 익명 사용자(버킷의 ACL 설정에 따라 다름)일 수 있다. 개체 작성자는 수정 또는 삭제 기능을 포함하여 개체에 대한 모든 권한을 가진다.
  3. ACL 설정: 개체에 대한 ACL(액세스 제어 목록) 설정은 개체에 대한 액세스 권한이 있는 사람과 해당 개체의 액세스 수준을 결정한다. ACL 설정이 비활성화되면 객체에 대한 액세스는 버킷 정책에 의해서만 결정된다. ACL 설정이 활성화되면 객체 소유자는 버킷 정책을 재정의하여 특정 사용자 또는 사용자 그룹에 대한 권한을 설정할 수 있다.

AWS 권장사항

 

이 두 설정의 주요 차이점은 누가 버킷에 업로드된 객체의 소유권을 맡느냐이다. "버킷 소유자 선호(Bucket Owner Preferred)"는 모든 개체의 버킷 소유자 소유권을 부여하는 반면 "객체 라이터(Object Writer)"는 업로드 계정이 해당 개체의 소유권을 유지할 수 있도록 한다. 

 

요약하면 S3 객체 소유권은 버킷 소유자 선호, 객체 라이터 및 ACL 설정을 포함한 설정 조합에 의해 결정된다. 버킷 소유자 선호 설정을 활성화하면 버킷 소유자가 버킷에 저장된 객체를 완전히 제어할 수 있는 반면 객체 라이터 및 ACL 설정은 버킷 내의 특정 객체에 액세스하고 수정할 수 있는 권한이 있는 사람을 결정한다.

 

따라서 개체 소유권이 적절하게 관리되고 개체에 대한 액세스가 적절하게 제한되도록 이러한 설정을 신중하게 검토하고 구성하는 것이 중요하다.


CORS(Cross-origin 리소스 공유)란?

CORS(Cross-Origin Resource Sharing)는 웹 애플리케이션이 웹 페이지를 제공하는 도메인 또는 출처가 아닌 다른 도메인 또는 출처에 요청할 수 있도록 하는 보안 기능이다.

 

AWS S3에서 CORS는 S3 버킷에 저장된 객체에 액세스할 수 있는 도메인 또는 오리진을 제어하는 ​​데 사용할 수 있다.

S3 버킷에서 CORS를 활성화하려면 버킷의 권한에 CORS 구성을 추가해야 한다. 이 구성은 버킷에 교차 출처 요청을 할 수 있는 도메인 또는 출처를 지정하는 JSON 문서이다.

 


CORS 구성의 예

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "POST"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]
  • AllowedHeaders: 원본 간 요청에서 S3 버킷으로 보낼 수 있는 헤더 목록이다. 이 구성에서 ["*"] 값은 모든 헤더를 허용한다.
  • AllowedMethods: S3 버킷에 대한 교차 출처 요청에서 허용되는 HTTP 메서드 목록이다. 이 구성에서는 GET 및 POST 메서드가 허용됩니다.
  • AllowedOrigins: S3 버킷에 교차 출처 요청을 할 수 있는 도메인 또는 오리진 목록이다. 이 구성에서는 모든 원본이 허용됩니다.
  • ExposeHeaders: 클라이언트 JavaScript 코드에 노출되도록 허용된 헤더 목록이다. 이 구성에서는 헤더가 노출되지 않는다.

이 CORS 구성을 사용하면 모든 도메인 또는 오리진이 요청에 포함된 모든 헤더와 함께 S3 버킷에 대한 GET 또는 POST 요청을 할 수 있다. 그러나 클라이언트 JavaScript 코드에는 헤더가 노출되지 않는다.

 


 

HTTP 메서드 설명

 

HTTP 메서드는 리소스 검색 또는 처리할 데이터 제출과 같이 웹 서버에서 수행할 수 있는 작업이다. 다음은 일반적으로 사용되는 일부 HTTP 메서드와 해당 설명이다.

  • GET: 서버에서 리소스(예: 웹 페이지 또는 파일)를 검색한다. 요청 매개변수는 요청의 URL에 포함된다.
  • POST: 처리할 데이터를 서버로 보낸다. 데이터는 URL이 아닌 요청 본문에 포함된다.
  • PUT: 서버의 기존 리소스를 업데이트한다.
  • DELETE: 서버에서 리소스를 제거한다.
  • HEAD: 리소스 자체를 검색하지 않고 리소스의 헤더를 검색한다. 리소스가 마지막으로 액세스된 이후 수정되었는지 확인하는 데 자주 사용된다.
  • OPTIONS: 자원에 대해 허용된 메소드 및 헤더를 검색한다.
  • PATCH: 서버에 있는 기존 리소스의 일부를 업데이트한다.

S3 버킷에서 이러한 HTTP 메서드는 CORS 구성과 함께 사용되어 버킷에 저장된 객체에 액세스할 수 있는 도메인 또는 오리진을 제어할 수 있다. 예를 들어 CORS 구성은 모든 도메인의 GET 요청을 허용하지만 POST 요청을 특정 도메인 또는 도메인 집합으로 제한할 수 있다.

 


 

도메인의 GET 요청을 허용하지만 특정 도메인에 대한 POST 요청을 제한하는 JSON 구문의 CORS 구성 예

[  
    {
        "AllowedOrigins": [
            "*"
        ],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedHeaders": [
            "*"
        ],
        "MaxAgeSeconds": 3000
    },
    {
        "AllowedOrigins": [
            "https://example.com"
        ],
        "AllowedMethods": [
            "POST"
        ],
        "AllowedHeaders": [
            "*"
        ],
        "MaxAgeSeconds": 3000
    }
]

 


Reference

Amazon S3 스토리지에 대한 공개 액세스 차단

 

AWS S3의 정책 및 권한

 

객체 소유권 제어 및 버킷에 대한 ACL 비활성화

Configuring cross-origin resource sharing (CORS)

 

https://aws.amazon.com/ko/s3/

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example1.html

728x90
반응형

'AWS' 카테고리의 다른 글

AWS CLI 정리  (0) 2023.03.31
AWS IAM이란?  (0) 2023.03.30
AWS S3란?(개념, 속성)  (0) 2023.03.28
AWS S3 맛보기  (0) 2022.02.13
AWS IAM MFA 맛보기  (0) 2022.02.13