특정 Amazon VPC에 대한 액세스를 제한했지만 퍼블릭 IP 주소에서 계속 Amazon S3의 정적 웹 사이트에 액세스할 수 있는 이유는 무엇입니까?

최종 업데이트 날짜: 2020년 3월 13일

Amazon Simple Storage Service(Amazon S3)를 사용하여 정적 웹 사이트를 호스팅하고 있습니다. 그리고 특정 Amazon Virtual Private Cloud(Amazon VPC)만 액세스하도록 버킷에 액세스를 제한하는 버킷 정책을 연결했습니다. 하지만 여전히 퍼블릭 IP 주소에서 웹 사이트에 액세스할 수 있습니다. 이 문제를 어떻게 해결해야 합니까?

​해결 방법

문제 해결을 시작하기 전에 다음을 확인해야 합니다.

  • 최신 구성을 보도록 웹 브라우저 또는 프록시 캐시를 지웁니다.
  • 버킷에 액세스하는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스가 버킷과 동일한 AWS 리전에 있습니다.
  • VPC 엔드포인트가 사용 중인 EC2 인스턴스의 라우팅 테이블에 연결되어 있으므로, 트래픽은 버킷 정책에서 참조하는 VPC ID에 연결됩니다.

버킷 정책 확인

버킷 정책의 명령문을 검토하여 정책이 VPC에서 버킷에 대한 액세스를 허용하는지 확인합니다. 예를 들어, 다음 버킷 정책 명령문은 vpc-id123456에서 요청이 수신되는 조건에 따라 s3:GetObject를 허용합니다.

참고: 정적 웹 사이트 호스팅에서 무단(익명) 요청을 허용해도, 사용자를 인증하면 자격 증명에 기반하여 액세스 권한을 사용자에게 부여할 수 있습니다. 예를 들어, Amazon S3에 대한 전체 액세스 권한을 보유한 AWS Identity and Access Management(IAM) 역할로 인증된 사용자는 다음 버킷 정책을 사용해도 VPC 외부의 객체를 다운로드할 수 있습니다. 보다 엄격한 버킷 정책이 필요하면 특정 VPC에 대한 액세스 제한을 참조하십시오. 그러면 VPC의 요청이 아닌 경우 관리자나 AWS 계정 루트 사용자도 액세스가 거부됩니다.

{
  "Version": "2012-10-17",
  "Id": "Policy1",
  "Statement": [{
    "Sid": "Access-to-Trusted-VPC-only",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject*",
    "Resource": "arn:aws:s3:::awsexamplebucket/*",
    "Condition": {
      "StringEquals": {
        "aws:sourceVpc": "vpc-id123456"
      }
    }
  }]
}

객체 ACL(액세스 제어 목록) 확인

버킷 정책이 올바른지 확인한 후에 모든 객체 ACL이 퍼블릭 액세스를 허용하는지 확인합니다. 일부 객체 ACL이 퍼블릭 액세스를 허용하고 ACL을 재정의하려는 경우 다음 중 하나를 수행할 수 있습니다.

  • 개별 버킷 또는 AWS 계정에 대한 퍼블릭 액세스 설정 구성
  • 버킷 정책에 명시적 거부 명령문 추가

Amazon S3 콘솔을 사용하여 개별 버킷의 퍼블릭 액세스 설정 또는 계정의 퍼블릭 액세스 설정을 구성하여 객체 ACL을 재정의하려면 다음 옵션을 선택합니다.

  • Block public access to buckets and objects granted through new access control lists (ACLs)(새 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 액세스 권한 차단)
  • Block public access to buckets and objects granted through any access control lists (ACLs)(ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단)

참고: 또한 AWS Command Line Interface(AWS CLI), AWS SDK 또는 Amazon S3 REST API를 사용하여 버킷의 퍼블릭 액세스 설정을 구성할 수도 있습니다. 자세한 내용은 Amazon S3 퍼블릭 액세스 차단 사용을 참조하십시오.

버킷 정책을 사용하여 객체 ACL을 재정의하려면 VPC의 요청이 아닌 경우 명시적으로 작업을 거부하는 명령문을 추가합니다. 예를 들어, 다음 버킷 정책은 vpc-id123456의 요청이 아닌 경우 s3:GetObject를 명시적으로 거부하는 명령문을 포함합니다.

경고: 이 예제 버킷 정책에는 명시적 거부 명령문이 포함되어 있으므로, 정책을 저장하기 전에 명시적 액세스 거부에 대한 파라미터를 신중하게 검토해야 합니다. 실수로 잠근 경우 실수로 모든 사용자의 Amazon S3 버킷 액세스를 거부했습니다. 액세스 권한을 다시 얻으려면 어떻게 해야 합니까?를 참조하십시오.

{
  "Version": "2012-10-17",
  "Id": "Policy1",
  "Statement": [{
      "Sid": "Access-to-Trusted-VPC-only",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::awsexamplebucket/*",
      "Condition": {
        "StringEquals": {
          "aws:sourceVpc": "vpc-id123456"
        }
      }
    },
    {
      "Sid": "Deny-Access-Except-For-Trusted-VPC",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::awsexamplebucket/*",
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpc": "vpc-id123456"
        }
      }
    }
  ]
}

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?