Политика кросс-аккаунта AWS S3 bucket смешана с внутренней
мы используем ведро s3 для обмена файлами между двумя компаниями. Мы создали частную корзину S3, и у нас есть выделенный пользователь для приложения, которое использует эту корзину (используя ее aws_key и aws_secret). Мы выяснили, что у нас нет доступа к getObject, но мы успешно поместилиObject в bucket.
Также я создал роль с разрешениями для этого сегмента и назначил ее application_user, но это не решило проблему.
Итак, основная цель - прочитать, составить список, поместить доступ из внешней учетной записи и внутреннего пользователя IAM в одну и ту же корзину S3. Я укажу, что внешняя компания имеет к нему доступ прямо сейчас с этой политикой. У меня нет доступа к внешней учетной записи AWS.
Ниже приведена политика ресурсов для s3.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SharedS3Bucket",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::199999999999:root", <--- external account
"arn:aws:iam::111111111111:user/application_user" <-- our application user
]
},
"Action": [
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::shared-bucket",
"arn:aws:s3:::shared-bucket/*"
]
}
]
}
Ответы
Разрешения S3 немного сложны, потому что у вас есть не только разрешения Bucket, о которых нужно беспокоиться, но и каждый объект, который вы загружаете, имеет свои собственные разрешения.
Ваша политика корзины, указанная выше, позволяет обеим компаниям загружать объекты, и, как вы можете видеть, это работает. Однако, когда внешняя компания загружает объект, ее разрешения по умолчанию разрешают чтение только создателю , то есть внешней компании. Даже если он по умолчанию находится в вашей корзине, вы не можете прочитать его, если он был загружен кем-то другим. Это несколько нелогично.
Решение состоит в том, чтобы убедиться, что загруженные объекты имеют ACL, разрешающий чтение обеими учетными записями.

Вам также нужно будет добавить s3:PutObjectAcl
в свой список разрешений Bucket Policy, чтобы это работало.
Точно так же, если вы загружаете из командной строки, вы можете изменить объект acl после загрузки с помощью aws s3api put-object-acl
.
Надеюсь, это поможет :)