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

137

Я получаю:

Произошла ошибка (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успешно?

user1411335
источник
1
В моем случае я настроил awsдля одного пользователя и использовал его внутри bash-скрипта, называемого cronjob, от другого пользователя, то есть ключ доступа и токен доступа были неправильными / не были установлены. Мое решение заключалось в том, чтобы напрямую поместить учетные данные ( AWS_ACCESS_KEY_IDи AWS_SECRET_ACCESS_KEY) в мой файл сценария bash, как описано здесь .
Уве Кейм

Ответы:

203

Вы дали разрешение на выполнение команд над объектами внутри корзины 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/*"
          ]
      }
  ]
}
Марк Б
источник
40
Это слишком широкий список действий. Что касается прав на список и копирование, то какие действия вы бы предложили?
dom
6
@domfarr Я просто делал минимально возможное, чтобы настроить политику OP, чтобы она работала на него. Если у вас есть конкретный вопрос, вы должны опубликовать его как отдельный вопрос на этом сайте, а не отмечать его комментариями. Хотя должно быть действительно легко посмотреть список действий S3 и построить нужную политику.
Mark B
4
Я не ставил теги. OP запросил то, что нужно для копирования и ls. Отсутствие уровня ковша arn было включено, но вы не настраивали Действия ... отсюда и мой комментарий.
dom
1
Возможно, прямое назначение соответствующей роли EC3 должно сработать. :)
ChikuMiku
6
Также убедитесь, что не пишете так, "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]как я (т.е. вам нужна только косая черта перед *) - мне потребовалось 4 долгих часа, чтобы осознать, что эта ошибка привела listObjectsк сбою всех моих вызовов ...
Даниэль Кис-Надь
36

Если вы хотите скопировать все объекты корзины 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

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

Роберт Смит
источник
1
На самом деле, похоже, что вы можете ограничиться ListBucket
подключом
Спасибо, что сообщили мне, я попробую это на некоторых из моих текущих проектов!
Роберт Смит
Спасибо. Никогда не думал, что непервый ответ может мне помочь
Вячеслав Цивина
Это действительно возможно, aws.amazon.com/blogs/security/…
citynorman
Я отредактировал ответ, включив условие для ограничения объектов списка, находящихся в определенной подпапке. Спасибо за помощь!
Роберт Смит
8

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

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

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}
marzhaev
источник
21
проблема в arn:aws:s3:::bucketname*том, что он также разрешает доступ кarn:aws:s3:::bucketname-with-suffix
Гасс
1
Как написано, это плохая политика; не используйте это. Он должен разрешить s3: ListBucket против arn: aws: s3 ::: bucketname и s3: PutObject против arn: aws: s3 ::: bucketname / *
jarmod
7

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

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

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

Putnik
источник
1
Точно такая же проблема. Признаком этого будет то, что один пользователь может получить доступ к тому, что другой пользователь не может получить на том же узле EC2.
Док
6

Я получил ту же ошибку при использовании политики, как показано ниже, хотя у меня есть «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"
    }
 ]
}
Габриэль Ву
источник
4

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

Судхакар Найду
источник
4

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

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"

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

Игорь Павлык
источник
2

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

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}
Генри
источник
0

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

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

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

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

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

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

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

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

Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied,

RtmY
источник
0

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

    - PolicyName: "AllowIncomingBucket"
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Action: "s3:*"
            Resource:
              - !Ref S3BucketArn
              - !Join ["/", [!Ref S3BucketArn, '*']]
Тим Бернс
источник
-1

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

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

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

Варун Тандон
источник
-1

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

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

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

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
Амин
источник