Получение доступа Отказано при вызове операции PutObject с разрешением на уровне ведра
Я последовал примеру 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
Почему я не могу загрузить в свое ведро?
Ответы
Ответ 1
Чтобы ответить на мой собственный вопрос:
Пример политики предоставил доступ PutObject, но мне также пришлось предоставить доступ PutObjectAcl.
Я должен был изменить
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
из примера в:
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"
Вы также должны убедиться, что ваш сегмент настроен для клиентов, чтобы установить общедоступный ACL, сняв эти два флажка:
![enter image description here]()
Ответ 2
У меня была похожая проблема. Я не использовал 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.
Надеюсь это поможет.
Ответ 3
В случае, если это поможет кому-то еще, в моем случае я использовал CMK (он работал нормально, используя ключ aws/s3 по умолчанию)
Мне пришлось перейти к определению ключа шифрования в IAM и добавить в список пользователей программного пользователя, вошедшего в boto3, который "может использовать этот ключ для шифрования и дешифрования данных из приложений и при использовании сервисов AWS, интегрированных с KMS".
Ответ 4
У меня было то же сообщение об ошибке, которое я сделал: Убедитесь, что вы используете правильный 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
Ответ 5
У меня была похожая проблема с загрузкой в корзину 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>/*"
]
}
]
}