AccessDenied для ListObjects для відра S3, коли дозволи дозволені s3: *


134

Я отримую:

Під час виклику операції ListObjects сталася помилка (AccessDenied): Доступ заборонено

Коли я намагаюся отримати папку з мого відра 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успішно?


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

Відповіді:


199

Ви надали дозвіл на виконання команд на об'єктах всередині відра 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 farr

6
@domfarr Я просто робив мінімум можливих для коригування політики ОП, щоб він працював на нього. Якщо у вас є конкретне питання, ви можете опублікувати його як окреме запитання на цьому веб-сайті, а не розміщувати теги за допомогою коментарів. Хоча переглядати список дій S3 та створити потрібну політику слід дуже просто.
Марк Б

4
Я не тегував. ОП запитувало те, що потрібно для копіювання, та лс. Був включений арн рівня відра, але ви не коригували дії ... звідси мій коментар.
dom farr

1
Можливо, безпосередньо присвоєння відповідної ролі EC3 має спрацювати. :)
ChikuMiku

6
Також не забудьте писати так, "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]як я це робив (тобто ви хочете лише нахил до цього *) - мені знадобилося 4 довгі години, щоб зрозуміти, що ця помилка спричинила listObjectsневдачу всіх моїх дзвінків ...
Даніель Кіс-Надь,

35

Якщо ви хотіли скопіювати всі об’єкти відра s3 за допомогою команди "aws s3 cp s3: // ім'я відра / дані / all-data /. - rekurzivno", як ви згадали, ось безпечна і мінімальна політика для цього:

{
  "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: префікс".

Друге твердження в цій політиці дозволяє отримувати об'єкти всередині відра в конкретному підкаталозі. Це означає, що все, що знаходиться на шляху "s3: // bucket-name / data / all-data /", ви зможете скопіювати. Майте на увазі, що це не дозволяє копіювати з батьківських контурів, таких як "s3: // ім'я кода / дані /".

Це рішення є специфічним для обмеження використання команд 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/isissue/2408

Сподіваюся, це допомагає!


1
На насправді, здається , що ви можете обмежити ListBucketдо підрозділу: stackoverflow.com/a/35952877/89218
paleozogt

Дякую, що повідомили мені, я спробую це на деяких моїх поточних проектах!
Роберт Сміт

Дякую. Ніколи не думав, що мені може допомогти не перша відповідь
В’ячеслав Цивіна

Це дійсно можливо, aws.amazon.com/blogs/security/…
citynorman

Я відредагував відповідь, щоб включити умову обмеження лістингу об'єктів, які знаходяться в певній підпапці. Дякую за допомогу!
Роберт Сміт

8

Ви маєте вказати Ресурс для відра через "arn: aws: 3 ::: bucketname" або "arn: aws: 3 ::: bucketname *". Останнє є кращим, оскільки воно дозволяє здійснювати маніпуляції і на предметах відра. Зверніть увагу, що нахилу немає!

Лістинг об'єктів - це операція на Bucket. Тому необхідна дія "s3: ListBucket". Додавання об’єкта до відра - це операція на Object. Тому потрібна дія "s3: PutObject". Звичайно, ви можете додати інші дії, як вам потрібно.

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

21
Проблема arn:aws:s3:::bucketname*полягає в тому, що він також дозволяє отримати доступ доarn:aws:s3:::bucketname-with-suffix
Guss

1
Як написано, це погана політика; не використовуйте його. Він повинен дозволити s3: ListBucket проти arn: aws: s3 ::: ім'я bucket та s3: PutObject против arn: aws: s3 ::: bucketname / *
jarmod

7

Я не зміг отримати доступ до S3, оскільки

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

Рішення:, rm -rf .aws/credentialsпотім awsвикористовує роль.


1
Точна проблема. Ознакою цього буде те, що один користувач може отримати доступ до речей, до яких інший користувач не може перебувати в тому ж вузлі EC2.
Doc Kaos

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 для ListObjects для відра S3"


4

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

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

в "~ / .aws / mandas" + термінал перезапуску профілю за замовчуванням.

У разі декількох профілів --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

Перший елемент ресурсу вказує arn:aws:s3:::<Bucket-Name>на ListBucketдію, щоб додатки могли перелічити всі об'єкти у відрі.

Другий елемент ресурсу вказує arn:aws:s3:::<Bucket-Name>/*на дії PutObjectта DeletObjectдії, щоб програми могли записувати чи видаляти будь-які об’єкти у відрі.

Розділення на дві різні «арни» важливо з міркувань безпеки для того, щоб вказати дозволи на тонкий вміст на рівні ковша та об'єкта.

Зауважте, що якби я вказав саме GetObjectу другому блоці, що трапиться, це те, що у випадках програмного доступу я отримаю помилку на зразок:

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


-1

Я зіткнувся з подібними проблемами, для мене проблема полягала в тому, що у мене були різні ключі AWS, встановлені в моєму файлі bash_profile.

Я відповів на подібне запитання тут: https://stackoverflow.com/a/57317494/11871462

Якщо у вашому файлі bash_profile є конфліктні ключі AWS, AWS CLI замість них за замовчуванням.


-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>/*"
            ]
        },
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.