Política de cuentas cruzadas de AWS S3 bucket combinada con cuenta interna
utilizamos el depósito s3 para compartir archivos entre dos empresas. Creamos un depósito S3 privado y tenemos un usuario dedicado para la aplicación que usa este depósito (usando su aws_key y aws_secret). Nos dimos cuenta de que no tenemos acceso a getObject, pero PutObject al cubo con éxito.
También creé un rol con permisos para este depósito y lo asigné a application_user, pero no resolvió el problema.
Por lo tanto, el objetivo principal es tener acceso de lectura, lista y acceso desde una cuenta externa y un usuario de IAM interno al mismo depósito de S3. Señalaré que empresa externa tiene acceso a ella, ahora mismo con esta política. No tengo acceso a una cuenta de AWS externa.
A continuación se muestra una política de recursos para 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/*"
]
}
]
}
Respuestas
Los permisos de S3 son un poco complicados porque no solo tiene que preocuparse por los permisos de Bucket, sino que también cada Objeto que carga tiene sus propios permisos.
Su política de depósito anterior permite que ambas empresas carguen objetos y funciona como puede ver. Sin embargo, cuando la empresa externa carga un objeto, sus permisos predeterminados solo permiten la lectura por parte del creador , es decir, de la empresa externa. Incluso si está en su depósito de forma predeterminada, no puede leerlo si alguien más lo cargó. Eso es algo contrario a la intuición.
La solución es asegurarse de que los Objetos cargados tengan una ACL que permita la lectura de ambas cuentas.

También deberá agregar s3:PutObjectAcl
a su lista de permisos de Política de depósito para que esto funcione.
De manera similar, si está cargando desde la línea de comandos, puede modificar el objeto acl después de cargar con aws s3api put-object-acl
.
Espero que ayude :)