버킷 수준 권한으로 PutObject 작업을 호출 할 때 액세스가 거부 됨


108

사용자에게 하나의 버킷에 대한 액세스 권한을 부여하는 방법 은 http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3 의 예제를 따랐습니다 .

그런 다음 W3 Total Cache Wordpress 플러그인을 사용하여 구성을 테스트했습니다. 테스트에 실패했습니다.

나는 또한 사용하여 문제를 재현 해 보았습니다.

aws s3 cp --acl=public-read --cache-control='max-age=604800, public' ./test.txt s3://my-bucket/

그리고 그것은 실패했습니다

upload failed: ./test.txt to s3://my-bucket/test.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied

내 버킷에 업로드 할 수없는 이유는 무엇입니까?

답변:


204

내 질문에 답하려면 :

예제 정책에서는 PutObject 액세스 권한을 부여했지만 PutObjectAcl 액세스 권한도 부여해야했습니다.

나는 변해야했다

"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"

예제에서 다음으로 :

"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"

또한 다음 두 상자를 선택 취소하여 클라이언트가 공개 액세스 가능한 ACL을 설정하도록 버킷이 구성되어 있는지 확인해야합니다.

여기에 이미지 설명 입력


2
감사합니다! Amazon의 자체 문서가 왜 꺼져 있는지 잘 모르겠습니다. 중단 된 업로드를 제대로 지울 수 있도록 "s3 : AbortMultipartUpload"도 포함 할 수 있습니다.
Hashcut

여기에 배치 된 S3 정책 샘플 docs.aws.amazon.com/IAM/latest/UserGuide/…
E.Big

1
btw 그것은 나를 위해 작동하지 않습니다. boto3 상호 작용, s3fullaccess 정책을 사용하는 경우에도 "AccessDenied for PutObject"를 얻었습니다
E.Big

2
내 경우에는 그는 AWS의 CLI 작업 있지만 BOTO와 wrokign되지 않는다
Hardik Gajjar

3
S3 전체 액세스 권한이 있었지만 새 공개 ACL 차단 및 공개 객체 업로드가 누락되었습니다. 감사합니다!
the_ccalderon

37

비슷한 문제가 발생했습니다. ACL 항목을 사용하지 않았기 때문에 s3:PutObjectAcl.

제 경우에는 ( 서버리스 프레임 워크 YML에서) 다음을 수행했습니다.

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName"

대신에:

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName/*"

/*버킷 ARN 끝에를 추가합니다 .

도움이 되었기를 바랍니다.


2
나는 / *와 함께 하나 필요
cyrf

이것은 나에게도 해당됩니다
Visualspark

10

나는 단지 큰 파일로 작업하기 위해 S3 업로드를 얻기 위해 벽에 머리를 부딪 히고 있었다. 처음에 내 오류는 다음과 같습니다.

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

그런 다음 더 작은 파일을 복사 해 보았습니다.

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

객체를 잘 나열 할 수 있지만 s3:*역할 정책에 권한 이 있어도 다른 작업을 수행 할 수 없습니다 . 나는 이것에 대한 정책을 재 작업했습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "*"
        }
    ]
}

이제 모든 파일을 업로드 할 수 있습니다. my-bucket버킷 이름으로 바꿉니다 . 나는 이것이 이것을 겪는 다른 누군가에게 도움이되기를 바랍니다.


2
이것은 다음을 제공합니다 : 필수 필드 누락 교장 :(
Sameera K

2
또한 다음 오류가 표시됩니다. 필수 필드 누락 Principal
Karan Sharma

yml에서이 작업을 수행하는 방법
ichimaru

주의 : 이렇게하면 IAM 사용자 / 역할에 모든 버킷의 키를 나열 할 수있는 액세스 권한이 부여됩니다. 주의해서 사용하십시오. 이상적으로는 "Resource": "*".
Darian Moody

추가- "Principal": "*",-아래에 "Effect": "Allow", 누락 된 필수 필드 문제 해결
meck373

9

이것이 다른 사람에게 도움이되는 경우, 제 경우에는 CMK를 사용하고있었습니다 (기본 aws / s3 키를 사용하여 정상적으로 작동 함).

IAM의 암호화 키 정의로 이동하여 boto3에 로그인 한 프로그래밍 방식 사용자를 "이 키를 사용하여 애플리케이션 내에서 그리고 KMS와 통합 된 AWS 서비스를 사용할 때 데이터를 암호화하고 해독 할 수있는"사용자 목록에 추가해야했습니다.


이것은 나를 도왔다. 감사! 권한과 동일한 오류이지만 실제로는 암호화였습니다.
Vicente Rocha

6

KWS 암호화로 보호되는 S3 버킷에 업로드 할 때 유사한 문제가 발생했습니다. 특정 s3 키 아래에 개체를 추가 할 수있는 최소한의 정책이 있습니다.

역할이 버킷에 객체를 넣을 수 있도록 정책에 다음 KMS 권한을 추가해야했습니다. (엄격하게 요구되는 것보다 약간 더 많을 수 있음)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys",
                "kms:GenerateRandom",
                "kms:ListAliases",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:ImportKeyMaterial",
                "kms:ListKeyPolicies",
                "kms:ListRetirableGrants",
                "kms:GetKeyPolicy",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:ListResourceTags",
                "kms:ReEncryptFrom",
                "kms:ListGrants",
                "kms:GetParametersForImport",
                "kms:TagResource",
                "kms:Encrypt",
                "kms:GetKeyRotationStatus",
                "kms:GenerateDataKey",
                "kms:ReEncryptTo",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:<MY-REGION>:<MY-ACCOUNT>:key/<MY-KEY-GUID>"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
            <The S3 actions>
            ],
            "Resource": [
                "arn:aws:s3:::<MY-BUCKET-NAME>",
                "arn:aws:s3:::<MY-BUCKET-NAME>/<MY-BUCKET-KEY>/*"
            ]
        }
    ]
}

대박. 기본 관리 형 aws/s3키 의 권한을 역할 (KMS 정책이 아님)에 연결된 IAM 정책 으로 복사 했는데 제대로 작동합니다. 나는 KMS ARN을에 필요한 조치 만이었다 : kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, kms:GenerateDataKey*, kms:DescribeKey. 그런 다음 표준 S3 권한 만 있으면됩니다.
z0r

3

내가 만든 실수에 대해 동일한 오류 메시지가 표시되었습니다. 다음과 같은 올바른 s3 uri를 사용하는지 확인하십시오. s3://my-bucket-name/

(my-bucket-name이 분명히 aws s3의 루트에있는 경우)

브라우저에서 s3 버킷을 복사하여 붙여 넣으면 다음과 같은 결과를 얻을 수 있기 때문입니다. https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

따라서 나는 다음을 발생시키는 실수를했습니다 s3://buckets/my-bucket-name.

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied


1

나를 위해 만료 된 인증 키를 사용하고있었습니다. 새로운 것들과 붐을 일으켰습니다.


1

위의 한 게시물과 유사합니다 (관리자 자격 증명을 사용하는 경우 제외).

처음에 내 오류는 다음과 같습니다.

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

multipart_threshold를 50M 이상으로 전환했습니다.

aws configure set default.s3.multipart_threshold 64MB

그리고 나는 얻었다 :

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

버킷 퍼블릭 액세스 설정을 확인했는데 모두 허용되었습니다. 그래서 모든 S3 버킷에 대해 계정 수준에서 퍼블릭 액세스를 차단할 수 있음을 발견했습니다 .

S3는 계정 수준에서 공용 ACL을 차단할 수 있습니다.


1

버킷에 대한 퍼블릭 액세스를 설정했지만 여전히 작동하지 않는 경우 bucker 정책을 편집하고 다음을 붙여 넣습니다.

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::yourbucketnamehere",
                "arn:aws:s3:::yourbucketnamehere/*"
            ],
            "Effect": "Allow",
            "Principal": "*"
        }
    ]
}

저를 위해 일하면서 새로운 S3 버킷을 만들어 완전히 공개했습니다. 쓰기 가능한 put_object이지만 ACL = 옵션을 사용하여 put_object를 수행하면 실패합니다. 이상해?
Doug F

0

S3 암호화를 위해 자체 고객 관리 KMS 키를 지정한 경우 플래그도 제공해야합니다 --server-side-encryption aws:kms. 예를 들면 다음과 같습니다.

aws s3api put-object --bucket bucket --key objectKey --body /path/to/file --server-side-encryption aws:kms

플래그를 추가하지 않으면 --server-side-encryption aws:kmscli가 AccessDenied오류를 표시합니다.


0

정책에서 Lambda에 대한 완전한 s3 액세스 권한을 부여하여 문제를 해결할 수있었습니다. Lambda에 대한 새 역할을 만들고 완전한 S3 액세스 권한이있는 정책을 여기에 연결합니다.

이것이 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.