Отримати доступ заборонено при виклику операції 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", а також щоб належним чином очистити перервану завантаження.
Гашкут

зразки політики S3, розміщені тут docs.aws.amazon.com/IAM/latest/UserGuide/…
E.Big

1
btw, це не працює для мене. взаємодія boto3, навіть із політикою s3fullaccess, я отримую "AccessDenied для PutObject"
E.Big

2
У моєму випадку його робота з AWS cli, але це не бореться з
boto

3
У мене був повний доступ до S3, але бракувало Блокувати нові публічні ACL та завантажувати загальнодоступні об’єкти. Дякую!
the_ccalderon

37

У мене була подібна проблема. Я не використовував речі ACL, тому мені не потрібен s3:PutObjectAcl.

У моєму випадку я робив (без сервера 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
ichimaru

Остерігайтеся: це надасть вашому користувачеві / ролі IAM доступ до списку ключів у всіх відрах. Використовуйте обережно; в ідеалі уникати будь-якого використання "Resource": "*".
Даріан Муді

Додати - "Principal": "*", - під "Effect": "Дозволити", щоб вирішити проблему з відсутнім необхідним полем
meck373

9

Якщо це допоможе комусь іншому, у моєму випадку я використовував CMK (він справно працював, використовуючи клавіші aws / s3 за замовчуванням)

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


Це мені допомогло. Дякую! Та сама помилка, що й дозволи, але насправді було шифруванням.
Вісенте Роша

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/

(Якщо моє ім'я-відро явно знаходиться в корені ваших 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

Подібно до однієї публікації вище (за винятком того, що я використовував облікові дані адміністратора), щоб отримати завантаження S3 для роботи з великим файлом 50M.

Спочатку моя помилка:

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

Я переключив багатоповерховий прапор вище 50M

aws configure set default.s3.multipart_threshold 64MB

і я отримав:

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

Я перевірив налаштування загального доступу до відра і все було дозволено. Тож я виявив, що доступ для всіх людей може бути заблокований на рівні облікового запису для всіх версій S3 :

S3 може блокувати загальнодоступні ACL на рівні акаунта


1

Якщо ви встановили загальнодоступний доступ до відра, і якщо він все ще не працює, відредагуйте політику для завантаження та вставте наступне:

    {
    "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 w / ACL = параметр. Незнайко?
Дуг F

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:kmsкліп відображає AccessDeniedпомилку


0

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

Сподіваюсь, це допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.