Quiero conceder a un usuario de AWS Identity and Access Management (IAM) de otra cuenta de AWS el acceso a mi bucket de Amazon Simple Storage Service (Amazon S3). Además, quiero conceder acceso entre cuentas para que el usuario pueda cargar objetos a mi bucket de Amazon S3.
Solución
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Para conceder acceso a un usuario de otra cuenta para cargar objetos en tu bucket de S3, actualiza las políticas de IAM para el usuario o para su cuenta. Se recomienda controlar el acceso a través de la cuenta, con la propiedad del objeto aplicada al propietario del bucket.
Si tu bucket usa listas de control de acceso (ACL) en lugar de la propiedad aplicada al propietario del bucket, considera la configuración BucketOwnerEnforced de Amazon S3, que desactiva las ACL. Comprueba si tu bucket usa ACL con el siguiente comando get-bucket-ownership-controls:
aws s3api get-bucket-ownership-controls --bucket DOC-EXAMPLE-BUCKET
Nota: Sustituye DOC-EXAMPLE-BUCKET por el nombre del bucket.
Si el resultado muestra BucketOwnerPreferred u ObjectWriter en lugar de BucketOwnerEnforced, el bucket usa ACL. La persona que ha cargado los archivos, no el propietario del bucket, es el propietario de los objetos cargados entre cuentas.
Propiedad del objeto aplicada al propietario del bucket
Para conceder acceso a un bucket a nivel de cuenta, utiliza la propiedad del objeto aplicada al propietario del bucket. Para conceder a un usuario de IAM de la cuenta A acceso para cargar objetos en un bucket de S3 en la cuenta B, sigue estos pasos:
-
En la cuenta A, crea una política de IAM para los usuarios que necesitan acceder al bucket de la cuenta B:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
]
}
]
}
Nota: Sustituye DOC-EXAMPLE-BUCKET por el nombre del bucket.
-
En la cuenta A, obtén el nombre de recurso de Amazon (ARN) del usuario de IAM.
-
Desde la cuenta B, crea una política de bucket que conceda al usuario entre cuentas permiso para cargar objetos:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CrossAccountUploadAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/UploadData"
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
},
{
"Sid": "CrossAccountListAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/UploadData"
},
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
}
]
}
Nota: Para el valor de Entidad principal, asegúrate de introducir el ARN del usuario de IAM en la cuenta A. Sustituye DOC-EXAMPLE-BUCKET por el nombre de tu bucket.
Propiedad del objeto aplicada a la ACL
Para conceder acceso a un bucket que utiliza la propiedad del objeto aplicada a la ACL, concede el permiso PutObjectAcl en la política de bucket y en la política de usuario de IAM.
-
Desde la cuenta A, adjunta una política al usuario de IAM. La política debe permitir al usuario ejecutar las acciones PutObject y PutObjectAcl en el bucket de la cuenta B:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
]
}
]
}
Nota: Antes de especificar una ACL para la carga, debes tener el permiso s3:PutObjectAcl. De lo contrario, aparecerá un error Access Denied al cargar un objeto con una ACL, como la ACL bucket-owner-full control.
-
En la cuenta B, adjunta una política de bucket que conceda al usuario de IAM de la cuenta A permiso para ejecutar las acciones s3:PutObject y s3:PutObjectAcl:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegateS3ObjectAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:user/UploadData"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
},
{
"Sid": "DelegateS3BucketAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/UploadData"
},
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
}
]
}
Información relacionada
Ejemplo 2: propietario del bucket que concede permisos de bucket entre cuentas