¿Es posible permitir solo la operación de escritura a un usuario en un depósito sin los permisos de lectura? El objetivo es permitir que todas mis instancias EC2 escriban cada una en un depósito diferente y no permitirles leer ningún otro depósito. Todas mis instancias se ejecutan con el mismo rol de IAM.
Ciertamente es posible. Por ejemplo, suelo usar esta política de solo escritura para la copia de seguridad de la instancia EC2 en S3 cuando uso el comando de sincronización con el interruptor --delete :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucket-name" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::bucket-name/*" ] } ] }Sí. Sin duda, puede asignar al Rol una política que permita PutObject sin ninguna otra operación (por ejemplo, ListBuckets , GetObject ).
Opción 1: permisos de solo escritura en un depósito
{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::examplebucket/*" ] } ] } En lugar de darle a cada instancia su propio depósito, puede usar el mismo depósito pero usar su ID de instancia como nombre de directorio (por ejemplo, s3://my-bucket/i-abcd1234/foo.txt ) para evitar conflictos de nombres de archivo.
Opción 2: permisos completos dentro de un subdirectorio
Incluso podría ir un paso más allá y darles acceso completo al depósito de Amazon S3, pero solo dentro de su propio subdirectorio.
El Rol se le asignaría esta política:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSubdirectory", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::my-bucket/${aws:userid}/*" ] } ] } En esta situación, la variable de política aws:userid sería igual a role-id:ec2-instance-id . Por lo tanto, la instancia EC2 podría hacer cualquier cosa en el subdirectorio (también conocido como Prefijo de clave) que coincida con su función e ID de instancia.
Por ejemplo:
aws s3 cp foo s3://my-bucket/AROAJCLCJNQ3333ZQLZTW:i-055f66ea41fb4438e/foo El role-id se puede obtener a través aws iam get-role --role-name rolename .
Este método garantiza que cada instancia solo pueda usar su propio subdirectorio dentro del depósito. Sin embargo, no podrá enumerar el contenido del depósito porque es un permiso a nivel de depósito.
Consulte también: Otorgar acceso a los recursos de S3 en función del nombre del rol
Tenga en cuenta que las soluciones anteriores son correctas, pero con PutObject Action también puede sobrescribir objetos existentes ( fuente ). No sé el escenario exacto por el que necesita ese tipo de acceso, pero si desea usarlo para crear una copia de seguridad, agregaría un paso adicional para minimizar el riesgo de sobrescribir objetos. Crearía un proceso separado (Lambda, por ejemplo) para copiar todos los objetos de ese depósito a otro, uno seguro, donde el cliente no tiene acceso en absoluto.