Отказано в доступе при вызове операции PutObject с разрешением на уровне корзины


109

Я последовал примеру 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

Почему я не могу загрузить в корзину?

Ответы:


205

Чтобы ответить на мой собственный вопрос:

Политика примера предоставила доступ PutObject, но мне также пришлось предоставить доступ PutObjectAcl.

Мне пришлось изменить

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

из примера к:

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

Вам также необходимо убедиться, что ваша корзина настроена для того, чтобы клиенты устанавливали общедоступный ACL, сняв отметки с этих двух полей:

введите описание изображения здесь


2
Спасибо! Не уверен, почему собственная документация Amazon отключена. Вы можете также захотеть включить "s3: AbortMultipartUpload", чтобы можно было правильно очистить прерванную загрузку.
Hashcut 01

образцы политик S3 размещены здесь docs.aws.amazon.com/IAM/latest/UserGuide/…
E.Big 01

1
Кстати, это не работает для меня. boto3, даже с политикой s3fullaccess, я получаю "AccessDenied for PutObject"
E.Big 01

2
В моем случае он работает с AWS cli, но не работает с
ботом

3
У меня был полный доступ к S3, но отсутствовали блокировка новых общедоступных списков контроля доступа и загрузка общедоступных объектов. Спасибо!
the_ccalderon 02

37

У меня была аналогичная проблема. Я не использовал ACL, поэтому мне это не понадобилось s3:PutObjectAcl.

В моем случае я делал (в Serverless Framework 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
Я также получаю следующую ошибку: Отсутствует обязательное поле. Директор
Каран Шарма

как сделать это в
yml?

Осторожно: это даст вашему пользователю / роли IAM доступ к списку ключей во всех сегментах. Используйте осторожно; в идеале никогда не использовать "Resource": "*".
Дариан Муди

Добавьте - «Принципал»: «*», - под «Эффект»: «Разрешить», чтобы решить проблему с отсутствующим обязательным полем
meck373

9

Если это поможет кому-то еще, в моем случае я использовал CMK (он отлично работал с ключом aws / s3 по умолчанию)

Мне пришлось войти в свое определение ключа шифрования в IAM и добавить программного пользователя, вошедшего в boto3, в список пользователей, которые «могут использовать этот ключ для шифрования и дешифрования данных из приложений и при использовании сервисов AWS, интегрированных с KMS».


Это мне помогло. Спасибо! Та же ошибка, что и разрешения, но на самом деле это шифрование.
Vicente Rocha

6

У меня была аналогичная проблема с загрузкой в ​​корзину S3, защищенную шифрованием KWS. У меня есть минимальная политика, которая позволяет добавлять объекты под определенным ключом 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ключа по умолчанию в политику IAM, прикрепленную к роли (не в политике KMS), и она работает хорошо. Единственные действия , которые я должен был против KMS ВРНС были: 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


3

Если вы установили общий доступ для сегмента, но он по-прежнему не работает, отредактируйте политику бакера и вставьте следующее:

    {
    "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, но не работает при выполнении put_object с параметром ACL =. Странный ?
Дуг Ф


1

Подобно одному сообщению выше (за исключением того, что я использовал учетные данные администратора), чтобы загрузить S3 для работы с большим 50-мегабайтным файлом.

Изначально моя ошибка была:

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 на уровне учетной записи


0

Если вы указали собственный ключ KMS, управляемый клиентом, для шифрования S3, вам также необходимо указать флаг --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

Мне удалось решить проблему, предоставив полный доступ s3 к Lambda из политик. Создайте новую роль для Lambda и прикрепите к ней политику с полным доступом S3.

Надеюсь, это поможет.


0

Я столкнулся с той же проблемой. Моя корзина была частной и имела шифрование KMS. Мне удалось решить эту проблему, добавив в роль дополнительные разрешения KMS. Следующий список представляет собой минимальный необходимый набор ролей.

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "AllowAttachmentBucketWrite",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "kms:Decrypt",
            "s3:AbortMultipartUpload",
            "kms:Encrypt",
            "kms:GenerateDataKey"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/*",
            "arn:aws:kms:kms-key-arn"
        ]
    }
  ]
}

Ссылка: https://aws.amazon.com/premiumsupport/knowledge-center/s3-large-file-encryption-kms-key/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.