S3 버킷 정책의 출발지 IP 제한과 서비스 예외 검토하기

목차

S3 버킷에 인증된 요청을 허용하면서 특정 공인 출발지로 제한하려는 상황의 정책 검토입니다. 원노트의 명시적 Deny 예제를 정리했습니다. IP 조건은 권한을 새로 부여하지 않으며 별도의 IAM·버킷 허용 권한이 있어야 합니다.

적용 조건 먼저 확인

S3 Block Public Access는 유지합니다. 버킷 정책과 IAM 정책의 명시적 Deny는 Allow보다 우선하므로 잘못 적용하면 관리자·자동화 작업도 막힐 수 있습니다. 기존 정책을 보관하고 허용할 공인 IP와 AWS 서비스 연동 경로를 확인합니다.

직접 요청의 IP 제한 예시

아래는 독립된 Statement를 포함한 정책 예시입니다. lieper-manual-example은 실제 버킷명으로, IP는 실제 허용 공인 주소로 교체합니다. AWS 서비스 주체의 직접 요청은 이 Deny에서 제외하는 조건을 함께 둡니다.

TERMINAL / CONFIG
{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "DenyOutsideApprovedPublicIP",
    "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": [
      "arn:aws:s3:::lieper-manual-example",
      "arn:aws:s3:::lieper-manual-example/*"
    ],
    "Condition": {
      "NotIpAddress": {"aws:SourceIp": ["192.0.2.10/32"]},
      "Bool": {"aws:PrincipalIsAWSService": "false"}
    }
  }]
}

서비스 역할과 VPC Endpoint 구분

서비스 주체를 제외했다고 모든 AWS 서비스·위임 역할의 요청이 자동 허용되는 것은 아닙니다. SourceArn을 조건에 덧붙이는 것만으로 특정 서비스가 허용된다고 가정하지 않습니다. 해당 서비스의 공식 버킷 정책과 필요한 Allow를 함께 확인합니다.
VPC Endpoint 경유 요청은 aws:SourceIp 기반의 공인 IP 경로와 다르므로 SourceVpce·SourceVpc 등의 조건을 별도로 설계합니다. 내부망 사설 주소를 공인 출발지 조건에 넣지 않습니다.

검증

허용망·비허용망·자동화 역할·로그 전달 서비스를 각각 시험합니다. ListBucket과 객체 Get·Put처럼 작업 범위도 나누어 확인하고 CloudTrail 등에서 실제 주체와 거부 원인을 확인합니다.
참고: https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazon-s3-policy-keys.html

AWS › S3
S3 목록