Amazon S3의 403 액세스 거부 오류를 해결하려면 어떻게 해야 하나요?

8분 분량
0

사용자가 아마존 심플 스토리지 서비스(Amazon S3) 버킷의 객체에 액세스하려고 하는데 Amazon S3에서 403 액세스 거부 오류를 반환합니다.

해결 방법

AWS Systems Manager Automation 문서

AWS 시스템 관리자에서 AWS Support-TroubleshootS3PublicRead 자동화 문서를 사용하십시오. 이 자동화 문서는 지정한 퍼블릭 S3 버킷에서 객체를 읽을 때 발생하는 문제를 진단하는 데 도움이 됩니다.

버킷 및 객체 소유권 확인

GetObject또는 HeadObject 요청에서 ** 발생한 **AccessDenied 오류의 경우 해당 객체가 버킷 소유자인지 확인하십시오. 또한 버킷 소유자에게 읽기 권한 또는 전체 제어 ACL (액세스 제어 목록) 권한이 있는지 확인하십시오.

**객체를 소유한 계정을 확인하십시오. **

기본적으로 S3 객체는 업로드한 AWS 계정이 소유합니다. 이는 다른 계정이 버킷을 소유한 경우에도 마찬가지입니다. 다른 계정에서 버킷에 객체를 업로드할 수 있는 경우 사용자가 액세스할 수 없는 객체를 소유한 계정을 확인하십시오.

**참고:**AWS CLI 명령을 실행할 때 오류가 발생하면 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

1.목록 버킷 AWS 명령줄 인터페이스(AWS CLI) 명령을 실행하여 소유자 ID를 쿼리하여 계정의 Amazon S3 표준 ID를 가져오세요.

aws s3api list-buckets --query "Owner.ID"

2.list-objects 명령을 실행하여 사용자가 액세스할 수 없는 객체를 소유한 계정의 Amazon S3 표준 ID를 가져오세요. DOC-EXAMPLE-BUCKET을 버킷 이름으로 바꾸고 exampleprefix를 ** 접두사** 값으로 바꿉니다.

aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix exampleprefix

**팁:**list-objects 명령을 사용하여 여러 개체를 검사합니다.

3.표준 ID가 일치하지 않으면 객체를 소유하지 않은 것입니다. 객체 소유자는 put-object-acl 명령을 실행하여 객체에 대한 전체 제어 권한을 부여할 수 있습니다. DOC-EXAMPLE-BUCKET을 객체가 포함된 버킷의 이름으로 변경하세요. exampleobject.jpg 를 키 이름으로 변경하세요.

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key exampleobject.jpg --acl bucket-owner-full-control

4.객체 소유자가 객체의 ACL을 버킷 bucket-owner-full-control로 변경하면 버킷 소유자는 객체에 액세스할 수 있습니다. 하지만 ACL 변경만으로는 객체의 소유권이 변경되지 않습니다. 객체 소유자를 버킷 계정으로 변경하려면 버킷 계정에서 cp 명령을 실행하여 객체를 자체적으로 복사합니다.

모든 새 객체를 다른 계정의 버킷에 복사

1.버킷 소유자 전체 제어 ACL을 사용하여 객체를 업로드하도록 요구하는 버킷 정책을 설정합니다.

2.S3 객체 소유권을 활성화하고 AWS 관리 콘솔에서 선호하는 버킷 소유자로 설정합니다.

그런 다음 버킷 소유자 전체 제어 ACL을 사용하여 객체를 업로드하면 객체 소유자가 자동으로 버킷 소유자로 업데이트됩니다.

버킷에 대한 권한이 있는 IAM 역할 생성

지속적인 교차 계정 권한의 경우 버킷에 대한 권한이 있는 계정에 IAM 역할을 생성하세요. 그런 다음 다른 AWS 계정에 해당 IAM 역할을 맡을 권한을 부여합니다. 자세한 내용은 자습서를 참조하십시오. IAM 역할을 사용하여 AWS 계정 전체에 대한 액세스 위임.

버킷 정책 또는 IAM 사용자 정책 확인

버킷 정책 또는 관련 IAM 사용자 정책을 검토하여 액세스를 거부할 수 있는 내용이 있는지 확인. 버킷에 대한 요청이 버킷 정책 또는 IAM 정책의 조건을 충족하는지 확인. 정책에 잘못된 거부 설명, 누락된 작업 또는 잘못된 공백이 있는지 확인.

거부 진술 조건

거부 명령문에서 다음을 기준으로 액세스를 차단하는 조건을 확인.

  • 멀티 팩터 인증 (MFA)
  • 암호화 키
  • 특정 IP 주소
  • 특정 VPC 또는 VPC 엔드포인트
  • 특정 IAM 사용자 또는 역할

**참고:**MFA가 필요하고 사용자가 AWS CLI를 통해 요청을 보내는 경우, 사용자가 MFA를 사용하도록 AWS CLI를구성해야 합니다.

예를 들어, 다음 버킷 정책에서 스테이트먼트1은 공개 액세스를 통해 DOC-EXAMPLE-BUCKET에서 객체 (s3:GetObject)를 다운로드할 수 있도록 허용합니다. 하지만 스테이트먼트2는 요청이 VPC 엔드포인트 vpce-1a2b3c4d에서 오는 경우를 제외하고 DOC-EXAMPLE-BUCKET에서 객체를 다운로드하기 위한 모든 사용자의 액세스를 명시적으로 거부합니다. 이 경우 거절 명령문을 우선으로 합니다. 즉, vpce-1a2b3c4d 외부에서 객체를 다운로드하려는 사용자는 액세스가 거부됩니다.

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Statement1",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": "*"
    },
    {
      "Sid": "Statement2",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": "vpce-1a2b3c4d"
        }
      },
      "Principal": "*"
    }
  ]
}

버킷 정책 또는 IAM 정책

버킷 정책 또는 IAM 정책이 사용자에게 필요한 Amazon S3 작업을 허용하는지 확인하십시오. 예를 들어, 다음 버킷 정책에는 s3:PutObjectAcl 작업에 대한 권한이 포함되어 있지 않습니다. IAM 사용자가 객체의 ACL(액세스 제어 목록)을 수정하려고 하면 사용자에게 Access Denied 오류가 발생합니다.

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/Dave"
        ]
      }
    }
  ]
}

기타 정책 오류

버킷 정책 또는 IAM 사용자 정책에 추가 공백이나 잘못된 ARN이 없는지 확인하십시오.

예를 들어, **arn:aws:s3:::와 같이 IAM 정책의 Amazon 리소스 이름(ARN)에 추가 공백이 있지 않은 지 확인하십시오. DOC-EXAMPLE-BUCKET/\ *. ** 이 경우 ARN이 **arn:aws:s3:::%20DOC-EXAMPLE-BUCKET/**으로 잘못 평가되어 IAM 사용자에게 액세스 거부 오류가 발생합니다.

IAM 권한 범위가 Amazon S3에 대한 액세스를 허용하는지 확인

버킷에 액세스하려는 IAM ID에 설정된 IAM 권한 경계를 검토하십시오. IAM 권한 범위가 Amazon S3에 대한 액세스를 허용하는지 확인하십시오.

버킷의 Amazon S3 블록 퍼블릭 액세스 설정 확인

허용된 공개 읽기 요청에서 액세스 거부 오류가 발생하는 경우 버킷의 Amazon S3 블록 퍼블릭 액세스 설정을 확인하십시오.

계정 및 버킷 수준에서 S3 블록 퍼블릭 액세스 설정을 검토하십시오. 이러한 설정은 공개 읽기 액세스를 허용하는 권한을 무시할 수 있습니다. Amazon S3 블록 퍼블릭 액세스는 개별 버킷 또는 AWS 계정에 적용할 수 있습니다.

사용자 자격 증명 검토

사용자가 Amazon S3에 액세스하도록 구성한 자격 증명을 검토하십시오. 버킷에 액세스할 수 있는 IAM 사용자 또는 역할의 자격 증명을 사용하도록 AWS SDK 및 AWS CLI를 구성해야 합니다.

AWS CLI의 경우 configure 명령을 실행하여 구성된 자격 증명을 확인하십시오.

aws configure list

사용자가 Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스를 통해 버킷에 액세스하는 경우 인스턴스가 올바른 역할을 사용하고 있는지 확인하십시오. 인스턴스에 연결한 다음 get-caller-identity 명령을 실행하십시오.

aws sts get-caller-identity

임시 보안 자격 증명 검토

사용자가 AWS 보안 토큰 서비스(AWS STS)를 사용하여 부여한 임시 보안 자격 증명에서 액세스 거부 오류를 수신한 경우 관련 세션 정책을 검토하십시오. 관리자가 AssumeRole API 호출 또는 assume-role 명령을 사용하여 임시 보안 자격 증명을 생성하면 세션별 정책을 전달할 수 있습니다.

Amazon S3의 액세스 거부 오류와 관련된 세션 정책을 찾으려면 AWS CloudTrail 이벤트 기록에서 AssumeRole 이벤트를 찾아보십시오. Amazon S3에 액세스하려면 실패한 요청과 동일한 기간에 AssumeRole 이벤트가 발생하는지 확인하십시오. 그런 다음 관련 CloudTrail 로그의 requestParameters 필드에서 정책 또는 policyArns 파라미터를 검토하십시오. 연결된 정책 또는 정책 ARN이 필요한 Amazon S3 권한을 부여하는지 확인하십시오.

예를 들어, CloudTrail 로그의 다음 스니펫은 임시 자격 증명에 s3:GetObject 권한을 DOC-EXAMPLE-BUCKET에 부여하는 인라인 세션 정책이 포함되어 있음을 보여줍니다.

"requestParameters": {
	"roleArn": "arn:aws:iam::123412341234:role/S3AdminAccess",
	"roleSessionName": "s3rolesession",
	"policy": "{
	"Version": "2012-10-17",
	"Statement": [{
			"Effect": "Allow",
			"Action": [
				"s3:GetObject"
			],
			"Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"]
		}
	}
]
}
"
}

Amazon VPC 엔드포인트 정책에 S3 버킷 및 객체에 액세스할 수 있는 올바른 권한이 포함되어 있는지 확인

사용자가 VPC 엔드포인트를 통해 라우팅되는 EC2 인스턴스로 버킷에 액세스하는 경우 VPC 엔드포인트 정책을 확인하십시오.

예를 들어, 다음 VPC 엔드포인트 정책은 DOC-EXAMPLE-BUCKET에 대한 액세스를 허용합니다. 이 VPC 엔드포인트를 통해 요청을 보내는 사용자는 다른 버킷에 액세스할 수 없습니다.

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Principal": "*"
    }
  ]
}

Amazon S3 액세스 포인트의 IAM 정책 검토

Amazon S3 액세스 포인트를 사용하여 버킷에 대한 액세스를 관리하는 경우 액세스 포인트의 IAM 정책을 검토하십시오.

액세스 포인트 정책에서 부여된 권한은 기본 버킷 정책에서도 동일한 액세스를 허용하는 경우에만 유효합니다. 버킷 정책과 액세스 포인트 정책이 올바른 권한을 부여하는지 확인하십시오.

해당 개체에 개체가 누락되거나 특수 문자가 포함되어 있지 않은지 확인하십시오.

요청된 객체가 버킷에 있는지 확인하십시오. 그렇지 않으면 요청에서 객체를 찾지 못하고 Amazon S3는 객체가 존재하지 않는 것으로 간주합니다. 적절한 s3:ListBucket 권한이 없는 경우(404 찾을 수 없음 오류 대신) 액세스 거부 오류가 발생합니다.

특수 문자(예: 공백)가 있는 객체를 검색하려면 특수 처리가 필요합니다.

head-object AWS CLI 명령을 실행하여 버킷에 객체가 있는지 확인하십시오. DOC-EXAMPLE-BUCKET을 확인하려는 버킷의 이름으로 바꾸십시오.

aws s3api head-object --bucket DOC-EXAMPLE-BUCKET --key exampleobject.jpg

객체가 버킷에 있는 경우 Access Denied 오류는 404 찾을 수 없음 오류를 마스킹하지 않습니다. 액세스 거부 오류를 해결하려면 다른 구성 요구 사항을 확인하십시오.

객체가 버킷에 없는 경우 Access Denied 오류는 404 Not Found 오류를 마스킹하는 것입니다. 누락된 개체와 관련된 문제를 해결하십시오.

AWS KMS 암호화 구성 확인

AWS KMS (SSE-KMS) 암호화에 대해서는 다음 사항을 참조하십시오.

  • IAM 사용자가 전체 권한을 가진 객체에 액세스할 수 없는 경우, 객체가 SSE-KMS에 의해 암호화되었는지 확인하십시오. Amazon S3 콘솔을 사용하여 객체의 서버 측 암호화 정보를 포함하는 객체 속성을 볼 수 있습니다.
  • 객체가 SSE-KMS로 암호화된 경우 KMS 키 정책이 IAM 사용자에게 키 사용에 필요한 최소 권한을 부여하는지 확인하십시오. 예를 들어 IAM 사용자가 S3 객체를 다운로드하는 용도로만 키를 사용하는 경우 IAM 사용자에게 kms:Decrypt 권한이 있어야 합니다. 자세한 내용은 AWS 계정에 대한 액세스 허용 및 IAM 정책 활성화를 참조하십시오.
  • IAM ID와 키가 동일한 계정에 있는 경우 키 정책을 사용하여 kms:Decrypt 권한을 부여해야 합니다. 키 정책은 IAM 정책과 동일한 IAM ID를 참조해야 합니다.
  • IAM 사용자가 AWS KMS 키가 아닌 다른 계정에 속해 있는 경우 IAM 정책에서도 이러한 권한을 부여해야 합니다. 예를 들어 SSE-KMS로 암호화된 객체를 다운로드하려면 키 정책과 IAM 정책 모두에 kms:Decrypt 권한을 지정해야 합니다. IAM 사용자와 KMS 키 간의 교차 계정 액세스에 대한 자세한 내용은 다른 계정의 사용자에게 KMS 키 사용 허용을 참조하십시오.

사용자가 요청 지불자 매개변수를 지정했는지 확인합니다(요청자 지불을 사용하는 경우).

버킷에 요청자 지불이 활성화되어 있으면 다른 계정의 사용자가 버킷에 요청을 보낼 때 request-payer 파라미터를 지정해야 합니다. 요청자 지불이 활성화되었는지 확인하려면 Amazon S3 콘솔을 사용하여 버킷의 속성을 확인하십시오.

다음 예제 AWS CLI 명령에는 요청자 지불을 통해 교차 계정 버킷에 액세스하기 위한 올바른 파라미터가 포함되어 있습니다.

aws s3 cp exampleobject.jpg s3://DOC-EXAMPLE-BUCKET/exampleobject.jpg --request-payer requester

AWS Organizations 서비스 제어 정책 확인

AWS Organizations를 사용하는 경우 서비스 제어 정책을 확인하여 Amazon S3에 대한 액세스가 허용되는지 확인하십시오. 서비스 제어 정책은 영향을 받는 계정에 대한 최대 권한을 지정합니다. 예를 들어, 다음 정책은 Amazon S3에 대한 액세스를 명시적으로 거부하고 액세스 거부 오류가 발생합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

AWS Organizations의 기능에 대한 자세한 내용은 조직의 모든 기능 활성화를 참조하세요.

관련 정보

Amazon S3 문제 해결

AWS 지원을 위한 아마존 S3 요청 ID 가져오기

AWS 공식
AWS 공식업데이트됨 2년 전
댓글 없음

관련 콘텐츠