AWS Identity and Access Management(IAM) 사용자는 Amazon Simple Storage Service(Amazon S3) 버킷에서 s3:PutObject 작업에 대한 권한이 있습니다. 하지만 객체를 업로드하려고 하면 HTTP 403: Access Denied 오류가 발생합니다.
간략한 설명
IAM 사용자에게 버킷에 업로드할 수 있는 올바른 권한이 있는 경우 다음 정책에서 업로드를 방지하는 설정이 있는지 확인하십시오.
- s3:PutObjectAcl에 대한 IAM 사용자 권한
- 버킷 정책의 조건
- Amazon Virtual Private Cloud(Amazon VPC) 엔드포인트 정책에서 허용하는 액세스
- AWS KMS 암호화
해결 방법
s3:PutObjectAcl에 대한 IAM 사용자 권한
IAM 사용자가 업로드 중에 객체의 액세스 제어 목록(ACL)을 업데이트해야 하는 경우 사용자는 IAM 정책에서 s3:PutObjectAcl에 대한 권한도 있어야 합니다. 사용자의 IAM 정책을 업데이트하는 방법에 대한 설명은 IAM 사용자의 권한 변경을 참조하십시오.
버킷 정책의 조건
버킷 정책을 검토하여 버킷에 대한 업로드를 제한하는 다음 조건 예시를 확인하십시오. 버킷 정책에 조건이 있고 해당 조건이 유효한 경우 업로드가 작동하려면 IAM 사용자가 조건을 충족해야 합니다.
중요: 조건을 검토할 때 해당 조건이 Allow 문("Effect": "Allow") 또는 거부 문("Effect": "Deny")과 연결되어 있는지 확인하십시오. 업로드가 작동하려면 사용자는 Allow 문 조건을 준수하거나 Deny 문 조건을 피해야 합니다.
다음과 같이 특정 IP 주소에서만 업로드를 허용하는 조건이 있는지 확인하십시오.
"Condition": {
"IpAddress": {
"aws:SourceIp": "54.240.143.0/24"
}
}
버킷 정책에 이 조건이 있는 경우 IAM 사용자는 허용된 IP 주소에서 버킷에 액세스해야 합니다.
다음과 같이 객체가 특정 스토리지 클래스인 경우에만 업로드를 허용하는 조건이 있는지 확인하십시오.
"Condition": {
"StringEquals": {
"s3:x-amz-storage-class": [
"STANDARD_IA"
]
}
정책에 이 조건이 있는 경우 사용자는 허용된 스토리지 클래스로 객체를 업로드해야 합니다. 예를 들어, 이전 조건문에는 STANDARD_IA 스토리지 클래스가 필요합니다. 즉, 사용자는 다음과 유사한 AWS Command Line Interface(AWS CLI) 명령을 사용하여 객체를 업로드해야 합니다.
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --storage-class STANDARD_IA
참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하십시오.
다음과 같이 객체에 특정 액세스 제어 목록(ACL)이 할당된 경우에만 업로드를 허용하는 조건이 있는지 확인하십시오.
"Condition": {
"StringEquals": {
"s3:x-amz-acl":["public-read"]
}
}
정책에 이 조건이 있는 경우 사용자는 허용된 ACL을 사용하여 객체를 업로드해야 합니다. 예를 들어, 이전 조건에는 public-read ACL이 필요하므로 사용자는 다음과 유사한 명령을 사용하여 객체를 업로드해야 합니다.
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --acl public-read
다음과 같이 업로드를 통해 버킷 소유자(정식 사용자 ID)에게 객체에 대한 전체 제어 권한을 부여해야 하는 조건이 있는지 확인하십시오.
"Condition": {
"StringEquals": {
"s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
}
}
정책에 이 조건이 있는 경우 사용자는 다음과 유사한 명령을 사용하여 객체를 업로드해야 합니다.
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --grant-full-control id=CanonicalUserID
다음과 같이 AWS Key Management System(AWS KMS) 키로 객체를 암호화한 경우에만 업로드를 허용하는 조건이 있는지 확인하십시오.
"Condition": {
"StringEquals": {
"s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd"
}
}
정책에 이 조건이 있는 경우 사용자는 다음과 유사한 명령을 사용하여 객체를 업로드해야 합니다.
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption aws:kms --ssekms-key-id arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd
다음과 같이 객체가 특정 유형의 서버 측 암호화를 사용하는 경우에만 업로드를 허용하는 조건이 있는지 확인하십시오.
"Condition": {
"StringEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
정책에 이 조건이 있는 경우 사용자는 다음과 유사한 명령을 사용하여 객체를 업로드해야 합니다.
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption "AES256"
VPC 엔드포인트 정책에서 허용하는 액세스
IAM 사용자가 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 사용하여 Amazon S3에 객체를 업로드하고 해당 인스턴스가 VPC 엔드포인트를 사용하여 Amazon S3로 라우팅되는 경우, VPC 엔드포인트 정책을 확인해야 합니다. 엔드포인트 정책이 버킷에 업로드를 허용하는지 확인하십시오.
예를 들어, 다음 VPC 엔드포인트 정책은 DOC-EXAMPLE-BUCKET에 대한 액세스를 허용합니다. 버킷이 허용된 리소스로 나열되지 않은 경우 사용자는 VPC의 인스턴스를 사용하여 버킷에 업로드할 수 없습니다.
{
"Statement": [{
"Sid": "Access-to-specific-bucket-only",
"Principal": "*",
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}]
}
또한 사용자가 ACL을 사용하여 객체를 업로드하는 경우 VPC 엔드포인트 정책은 다음과 같이 s3:PutObjectAcl 작업에 대한 액세스 권한도 부여해야 합니다.
{
"Statement": [{
"Sid": "Access-to-specific-bucket-only",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}]
}
AWS KMS 암호화
표시된 오류 메시지에 따라 IAM 사용자 또는 역할의 AWS KMS 권한을 업데이트하십시오. 이러한 Access Denied 오류를 해결하려면 AWS KMS 기본 암호화가 있는 Amazon S3 버킷에 파일을 업로드할 때 Access Denied 오류 메시지가 표시되는 이유는 무엇입니까?를 참조하십시오.
중요: AWS KMS 키와 IAM 역할이 서로 다른 AWS 계정에 속해 있는 경우 IAM 정책과 KMS 키 정책을 업데이트해야 합니다. IAM 정책과 KMS 키 정책에 모두 KMS 권한을 추가해야 합니다. 또한 교차 계정 IAM 위탁자가 객체를 업로드하는 경우 별칭이 ‘aws/s3’인 AWS KMS 키는 기본 버킷 암호화에 사용할 수 없습니다. SSE-KMS용 S3 버킷 키를 사용하도록 구성된 모든 객체 업로드, 복사 또는 버킷에는 kms:Decrypt 권한이 있어야 합니다. AWS KMS 키 및 정책 관리에 대한 자세한 내용은 AWS KMS 키를 통한 서버 측 암호화(SSE-KMS) 사용을 참조하십시오.
관련 정보
조건 키를 사용한 버킷 정책 예시
Amazon S3 버킷의 기본 서버 측 암호화 동작 설정