Получаю:

Произошла ошибка (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/*"
        ]
    }
] }

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

Ответы (18)

Вы дали разрешение на выполнение команд над объектами внутри корзины 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/*"
          ]
      }
  ]
}

Если вы хотите скопировать все объекты корзины s3 с помощью команды "aws s3 cp s3: // bucket-name / 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/*"
          ]
      }
  ]
}

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

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

Это решение предназначено для ограничения использования команд интерфейса командной строки AWS; если вам нужно ограничить доступ к 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

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

Вы должны указать ресурс для корзины через "arn: aws: s3 ::: 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*"
        ]
    }
] 
}

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

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

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

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

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}

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

Я ответил на аналогичный вопрос здесь: https://stackoverflow.com/a/57317494/11871462

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

Я добавляю ответ в том же направлении, что и принятый ответ, но с небольшими (важными) отличиями и добавляю больше деталей.

Рассмотрим конфигурацию ниже:

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

Политика предоставляет программный доступ запись-удаление и разделена на две части:
Действие ListBucket предоставляет разрешения на уровне корзины, а другие действия PutObject / DeleteObject требуют разрешений на объекты внутри корзины.

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

Второй элемент ресурса определяет arn: aws: s3 ::: / * для действий PutObjectи DeletObject, чтобы приложения могут записывать или удалять любые объекты в корзине.

Разделение на два разных 'arns' важно из соображений безопасности для определения детальных разрешений на уровне корзины и на уровне объекта.

Обратите внимание, что если бы я указал только GetObject во 2-м блоке, то в случае программного доступа я бы получил сообщение об ошибке типа:

Ошибка загрузки: <имя-файла> в <имя-корзины>: <путь-в-корзине> Произошла ошибка (AccessDenied) при вызове операции PutObject: Доступ запрещен.

Вот политика, которая у меня сработала.

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

Моя проблема заключалась в установке

env: 
  AWS_ACCESS_KEY_ID: {{ secrets.AWS_ACCESS_KEY_ID }} 
  AWS_SECRET_ACCESS_KEY: {{ secrets.AWS_SECRET_ACCESS_KEY }}

снова в разделе aws-sync GitHub Action в качестве переменных среды. Они исходили из моих настроек GitHub. Хотя в моем случае я взял на себя роль на предыдущем шаге, которая установила мне несколько новых ключей в те же переменные среды с тем же именем. Итак, я переписывал хорошие предполагаемые ключи на плохие базовые ключи GitHub.

Пожалуйста, позаботьтесь об этом, если вы берете на себя роли.

Хорошо для тех, кто сделал все вышеперечисленное, но все еще сталкивается с этой проблемой, попробуйте следующее:

Политика корзины должна выглядеть так:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowBucketSync",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME",
                "arn:aws:s3:::BUCKET_NAME/*"
            ]
        }
    ]
}

Затем сохраните и убедитесь, что ваш инстанс или Lightsail подключен к нужному профилю в AWS Configure.

Первый: попробуйте добавить - рекурсивный в конце, удачи? Нет, попробуйте вариант ниже.

Второй: Хорошо, теперь попробуйте это: - запрос без подписи

поэтому он должен выглядеть так:

sudo aws s3 sync s3://BUCKET_NAME /yourpath/path/folder --no-sign-request

Добро пожаловать 😂

Чтобы разрешить разрешения в ведре s3, перейдите на вкладку разрешений в ведре s3 и в политике корзины измените действие на это, которое позволит выполнять все действия:

"Action":"*"

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

    - PolicyName: "AllowIncomingBucket"
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Action: "s3:*"
            Resource:
              - !Ref S3BucketArn
              - !Join ["/", [!Ref S3BucketArn, '*']]

У меня была такая же проблема. Я должен был предоставить правильный ресурс и действие, ресурс - это ваша корзина и действие в желаемом разрешении. Также убедитесь, что у вас есть правильный пользователь arn. Ниже мое решение.

{
    "Version": "2012-10-17",
    "Id": "Policy1546414123454",
    "Statement": [
        {
            "Sid": "Stmt1546414471931",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789101:root"
            },
            "Action": ["s3:ListBucket", "s3:ListBucketVersions"],
            "Resource": "arn:aws:s3:::bucket-name"
        }
    ]
}

У меня была аналогичная проблема при попытке синхронизировать всю корзину s3 локально. Для меня в моей учетной записи была применена MFA (многофакторная аутентификация), которая требуется при выполнении команд через интерфейс командной строки AWS.

Итак, решение для меня было - предоставить учетные данные mfa с помощью профиля (документация mfa) при использовании любых команд интерфейса командной строки AWS.

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

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

У меня была эта проблема мое требование я хотел разрешить пользователю писать по определенному пути

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::/scripts",
                "arn:aws:s3:::/scripts/*"
            ]
        },

и проблема была решена с этим изменением

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::",
                "arn:aws:s3:::/*"
            ]
        },

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

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

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

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

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

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

, где ИМЯ ПРОФИЛЯ:

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

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

2022 WebDevInsider