Quyền truy cập bị từ chối khi gọi hoạt động PutObject với quyền cấp nhóm


107

Tôi đã làm theo ví dụ trên http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3 để biết cách cấp cho người dùng quyền truy cập chỉ vào một nhóm.

Sau đó, tôi đã kiểm tra cấu hình bằng plugin W3 Total Cache Wordpress. Thử nghiệm không thành công.

Tôi cũng đã thử tái tạo sự cố bằng cách sử dụng

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

và điều đó không thành công với

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

Tại sao tôi không thể tải lên nhóm của mình?

Câu trả lời:


203

Để trả lời câu hỏi của riêng tôi:

Chính sách mẫu đã cấp quyền truy cập PutObject, nhưng tôi cũng phải cấp quyền truy cập PutObjectAcl.

Tôi đã phải thay đổi

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

từ ví dụ thành:

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

Bạn cũng cần đảm bảo rằng nhóm của mình được định cấu hình để khách hàng đặt ACL có thể truy cập công cộng bằng cách bỏ chọn hai hộp sau:

nhập mô tả hình ảnh ở đây


2
Cảm ơn bạn! Không chắc tại sao tài liệu riêng của Amazon bị tắt. Bạn cũng có thể muốn bao gồm "s3: AbortMultipartUpload" để tệp tải lên đã hủy bỏ có thể được xóa đúng cách.
Hashcut

mẫu cho các chính sách S3 được đặt tại đây docs.aws.amazon.com/IAM/latest/UserGuide/…
E.Big

1
btw nó không làm việc cho tôi. tương tác boto3, ngay cả với chính sách s3fullaccess Tôi nhận được thông báo "AccessDenied for PutObject"
E.Big

2
Trong trường hợp của tôi, nó hoạt động với AWS cli, nhưng nó không wrokign với boto
Hardik Gajjar.

3
Tôi đã có toàn quyền truy cập S3 nhưng thiếu phần Chặn ACL công khai mới và tải lên các đối tượng công cộng. Cảm ơn bạn!
the_ccalderon

36

Tôi đã gặp một vấn đề tương tự. Tôi đã không sử dụng công cụ ACL, vì vậy tôi không cần s3:PutObjectAcl.

Trong trường hợp của tôi, tôi đã làm (trong Serverless Framework YML):

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

Thay vì:

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

Điều này sẽ thêm a /*vào cuối ARN nhóm.

Hi vọng điêu nay co ich.


2
Tôi cần một với / *
cyrf

đây cũng là trường hợp của tôi
Visualspark

10

Tôi vừa đập đầu vào tường chỉ cố gắng tải lên S3 để hoạt động với các tệp lớn. Ban đầu lỗi của tôi là:

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

Sau đó, tôi đã thử sao chép một tệp nhỏ hơn và nhận được:

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

Tôi có thể liệt kê các đối tượng tốt nhưng tôi không thể làm gì khác mặc dù tôi có s3:*quyền trong chính sách Vai trò của mình. Tôi đã kết thúc việc làm lại chính sách này:

{
    "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": "*"
        }
    ]
}

Bây giờ tôi có thể tải lên bất kỳ tệp nào. Thay thế my-bucketbằng tên nhóm của bạn. Tôi hy vọng điều này sẽ giúp ai đó khác đang làm thông qua điều này.


2
Điều này cho phép: Thiếu trường bắt buộc :( Principal
Sameera K

2
Tôi cũng gặp phải lỗi sau: Thiếu trường bắt buộc Hiệu trưởng
Karan Sharma

làm thế nào để bạn làm điều này trong yml
ichimaru

Lưu ý: điều này sẽ cấp cho Người dùng / vai trò IAM của bạn để liệt kê các khóa trong tất cả các nhóm. Sử dụng cẩn thận; lý tưởng nhất là tránh sử dụng "Resource": "*".
Darian Moody

Thêm - "Hiệu trưởng": "*", - bên dưới "Hiệu ứng": "Cho phép", để giải quyết vấn đề với trường bắt buộc bị thiếu
meck373

9

Trong trường hợp điều này giúp đỡ bất kỳ ai khác, trong trường hợp của tôi, tôi đang sử dụng CMK (nó hoạt động tốt khi sử dụng khóa aws / s3 mặc định)

Tôi đã phải đi vào định nghĩa khóa mã hóa của mình trong IAM và thêm người dùng lập trình đã đăng nhập vào boto3 vào danh sách người dùng "có thể sử dụng khóa này để mã hóa và giải mã dữ liệu từ bên trong các ứng dụng và khi sử dụng các dịch vụ AWS được tích hợp với KMS.".


Điều này đã giúp tôi. Cảm ơn! Lỗi tương tự như quyền, nhưng thực tế là do mã hóa.
Vicente Rocha

6

Tôi đã gặp sự cố tương tự khi tải lên nhóm S3 được bảo vệ bằng mã hóa KWS. Tôi có một chính sách tối thiểu cho phép thêm các đối tượng dưới một khóa s3 cụ thể.

Tôi cần thêm các quyền KMS sau đây vào chính sách của mình để cho phép vai trò đưa các đối tượng vào nhóm. (Có thể nhiều hơn một chút so với yêu cầu nghiêm ngặt)

{
    "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>/*"
            ]
        }
    ]
}

Tuyệt vời. Tôi đã sao chép các quyền từ aws/s3khóa được quản lý mặc định sang chính sách IAM được đính kèm với một vai trò (không có trong chính sách KMS) và nó hoạt động tốt. Những hành động duy nhất tôi cần thiết so với KMS ARNs là: kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, kms:GenerateDataKey*, kms:DescribeKey. Sau đó, chỉ các quyền S3 tiêu chuẩn.
z0r

3

Tôi đã gặp phải thông báo lỗi tương tự do một lỗi tôi đã mắc phải: Hãy đảm bảo rằng bạn sử dụng đúng một tiểu s3 như: s3://my-bucket-name/

(Nếu my-bucket-name rõ ràng là ở gốc của aws s3 của bạn)

Tôi nhấn mạnh vào điều đó vì khi sao chép dán thùng s3 từ trình duyệt của bạn, bạn sẽ nhận được một cái gì đó như https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

Do đó, tôi đã mắc sai lầm khi sử dụng s3://buckets/my-bucket-nametừ tăng:

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


1

Đối với tôi, tôi đã sử dụng khóa xác thực hết hạn. Tạo ra những cái mới và bùng nổ.


1

Tương tự như một bài đăng ở trên, (ngoại trừ tôi đang sử dụng thông tin đăng nhập quản trị) để tải lên S3 hoạt động với tệp 50M lớn.

Ban đầu lỗi của tôi là:

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

Tôi đã chuyển Multiart_threshold thành trên 50 triệu

aws configure set default.s3.multipart_threshold 64MB

và tôi nhận được:

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

Tôi đã kiểm tra cài đặt quyền truy cập công khai của nhóm và tất cả đều được cho phép. Vì vậy, tôi nhận thấy rằng quyền truy cập công khai có thể bị chặn ở cấp tài khoản đối với tất cả các nhóm S3 :

S3 có thể chặn ACL công khai ở cấp tài khoản


1

Nếu bạn đã đặt quyền truy cập công khai cho nhóm và nếu nó vẫn không hoạt động, hãy chỉnh sửa chính sách nhóm và dán sau:

    {
    "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": "*"
        }
    ]
}

Làm việc cho tôi, tôi đã tạo một nhóm S3 mới, đặt nó ở chế độ công khai. Put_object có thể ghi được, nhưng không thành công khi thực hiện tùy chọn put_object w / ACL =. Kỳ quặc?
Doug F

0

Nếu bạn đã chỉ định khóa KMS do khách hàng quản lý của riêng mình cho mã hóa S3, bạn cũng cần cung cấp cờ --server-side-encryption aws:kms, ví dụ:

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

Nếu bạn không thêm cờ --server-side-encryption aws:kms, cli sẽ hiển thị AccessDeniedlỗi


0

Tôi đã có thể giải quyết vấn đề bằng cách cấp quyền truy cập s3 đầy đủ cho Lambda từ các chính sách. Tạo một vai trò mới cho Lambda và đính kèm chính sách với Quyền truy cập S3 hoàn chỉnh vào đó.

Hy vọng điều này sẽ giúp ích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.