Подтвердить что ты не робот

AccessDenied для ListObjects for S3, когда разрешения равны s3: *

я получаю

Произошла ошибка (AccessDenied) при вызове операции ListObjects: доступ запрещен

когда я пытаюсь получить папку из моей корзины S3.

Используя эту команду

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

Разрешения IAM для корзины выглядят так

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

Что мне нужно изменить, чтобы иметь возможность copy и ls успешно?

4b9b3361

Ответ 1

Вы дали разрешение на выполнение команд над объектами внутри корзины S3, но у вас нет разрешения на выполнение каких-либо действий над самой корзиной. Измените свою политику следующим образом:

Незначительное изменение вашей политики будет выглядеть так:

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}

Тем не менее, это, вероятно, дает Мро разрешение, чем необходимо. В соответствии с рекомендациями AWS IAM по предоставлению минимальных привилегий это будет выглядеть примерно так:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname/*"
          ]
      }
  ]
}

Ответ 2

Если вы хотите скопировать все объекты корзины s3 с помощью команды "aws s3 cp s3://имя-корзины/data/all-data/. --recursive", как вы упомянули, вот безопасная и минимальная политика для этого:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

Первый оператор в этой политике позволяет перечислять объекты внутри определенного подкаталога сегмента. Ресурс должен быть арном блока S3, и чтобы ограничить список только подкаталогом в этом сегменте, вы можете отредактировать значение "s3: prefix".

Второе утверждение в этой политике позволяет получать объекты внутри корзины в определенном подкаталоге. Это означает, что все, что находится внутри пути "s3://bucket-name/data/all-data/", вы сможете скопировать. Имейте в виду, что это не позволяет копировать из родительских путей, таких как "s3://bucket-name/data/".

Это решение относится только к ограничению использования команд AWS CLI; если вам необходимо ограничить доступ к S3 через консоль AWS или API, потребуется больше политик. Я предлагаю посмотреть здесь: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/.

Подобную проблему можно найти здесь, которая привела меня к решению, которое я даю. https://github.com/aws/aws-cli/issues/2408

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

Ответ 3

Вы должны указать Resource для bucket через "arn: aws: 3: bucketname" или "arn: aws: 3: bucketname *". Последнее предпочтительнее, поскольку оно позволяет манипулировать объектами ковша. Обратите внимание, что нет слэша!

Объекты листинга - это операция над Bucket. Поэтому требуется действие "s3: ListBucket". Добавление объекта в ведро - это операция над объектом. Поэтому требуется действие "s3: PutObject". Конечно, вы можете добавить другие действия по мере необходимости.

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}

Ответ 4

Мне не удалось получить доступ к S3, потому что

  • Сначала я сконфигурировал доступ к ключам в экземпляре (после запуска было невозможно установить роль)
  • забыли об этом несколько месяцев.
  • прикрепленная роль к экземпляру
  • пытался получить доступ. У сконфигурированного ключа был более высокий приоритет, чем роль, и доступ был отклонен, поскольку пользователю не были предоставлены необходимые разрешения S3.

Решение: rm -rf .aws/credentials, тогда aws использует роль.

Ответ 5

Я получил ту же ошибку при использовании политики, как показано ниже, хотя у меня есть "s3: ListBucket" для операции s3: ListObjects.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

Затем я зафиксировал его, добавив одну строку "arn: aws: s3: bucketname"

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}

Ответ 6

Я думал, что ошибка связана с действием "s3: ListObjects", но мне пришлось добавить действие "s3: ListBucket", чтобы решить проблему "AccessDenied для ListObjects для корзины S3"

Ответ 7

Я столкнулся с той же проблемой. Я только что добавил конфигурацию учетных данных:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

в "~/.aws/credentials" + перезапустить терминал для профиля по умолчанию.

В случае нескольких профилей необходимо добавить --profile arg:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

где PROFILE_NAME:

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

Подробнее о настройке учетных данных и нескольких профилей можно узнать здесь .

Ответ 8

Столкнулся с аналогичными проблемами, для меня проблема заключалась в том, что в моем bash_profile были установлены разные ключи AWS.

Я ответил на аналогичный вопрос здесь: fooobar.com/questions/17839985/...

Если у вас есть конфликтующие ключи AWS в вашем bash_profile, AWS CLI по умолчанию использует их.

Ответ 9

Я попробовал следующее:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

Это дало мне ошибку:

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

Использование этой формы сработало:

aws s3 ls {bucket name}