본문 바로가기
AWS/S3

[AWS] 유용한 S3 Bucket Policy

by study4me 2024. 10. 7.
반응형

1. HTTPS 기반

HTTPS(TLS)를 사용하여 암호화된 연결만 허용
HTTP 요청은 버킷에 액세스 하지 못하도록 제한

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowSSLRequestsOnly",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::s3-bucket-name-example",
        "arn:aws:s3:::s3-bucket-name-example/*"
      ],
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      },
      "Principal": "*"
    }
  ]
}

 

나쁜 예

요청이 HTTPS를 사용하는 경우 버킷의 모든 객체에 대해 s3:GetObject에 대한 익명 액세스를 허용
익명 액세스가 필요한 경우가 아니라면 이러한 유형의 버킷 정책 사용 금지

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "NOT-RECOMMENDED-FOR__AWSCONFIG-Rule_s3-bucket-ssl-requests-only",
      "Action": "s3:GetObject",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::s3-bucket-name-example/*"
      ],
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "true"
        }
      },
      "Principal": "*"
    }
  ]
}

 

2. Organization 기반

특정 Organization 내 AWS 계정의 IAM 보안 주체에 대해서만 허용

{
   "Version": "2012-10-17",
   "Statement": [{
       "Sid": "AllowGetObject",
       "Principal": {
           "AWS": "*"
       },
       "Effect": "Allow",
       "Action": "s3:GetObject",
       "Resource": "arn:aws:s3:::s3-bucket-name-example/*",
       "Condition": {
           "StringEquals": {
               "aws:PrincipalOrgID": ["o-aa111bb222"]
           }
       }
   }]
}
참고: https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/example-bucket-policies.html

 

3. Account Number 기반

특정 Account의 보안 주체를 제외하고 모든 Account의 보안 주체를 Deny 한다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyAccessFromPrincipalNotInSpecificAccount",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::s3-bucket-name-example/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:PrincipalAccount": [
            "123456789012"
          ]
        }
      }
    }
  ]
}
참고 : https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/amazon-s3-policy-keys.html#object-keys-in-amazon-s3-policies

 

4. IP 주소 기반

NotIpAddress 대역은 제외하고 IpAddress 대역에 대해서 허용

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "statement1",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/JohnDoe"
        ]
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::s3-bucket-name-example/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "192.0.2.0/24"
        },
        "NotIpAddress": {
          "aws:SourceIp": "192.0.2.188/32"
        }
      }
    }
  ]
}

 

5. 특정 VPC 엔드포인트에 대한 액세스 제한

특정 VPC Endpoint를 거치지 않고 접근할 경우 Deny

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Access-to-specific-VPCE-only",
      "Principal": "*",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::s3-bucket-name-example",
        "arn:aws:s3:::s3-bucket-name-example/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": "vpce-1a2b3c4d"
        }
      }
    }
  ]
}

 

6. 특정 VPC에 대한 액세스 제한

특정 VPC가 사용되지 않으면 버킷에 대한 모든 액세스를 거부한다.
동일한 VPC에 여러 VPC 엔드포인트가 구성되어 있으며, 모든 엔드포인트에서 Amazon S3 버킷에 대한 액세스를 관리하고자 하는 경우 유용하다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Access-to-specific-VPC-only",
      "Principal": "*",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::s3-bucket-name-example",
        "arn:aws:s3:::s3-bucket-name-example/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpc": "vpc-111bbb22"
        }
      }
    }
  ]
}
참고 : https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html
반응형

'AWS > S3' 카테고리의 다른 글

[AWS] Gateway Type의 S3 VPC Endpoint  (0) 2024.10.19