Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

664
Vistas
¿Cómo puedo asignar el control total del propietario del depósito al crear un objeto S3 con boto3?

Estoy usando la biblioteca de Amazon boto3 en Python para cargar un archivo en otro grupo de usuarios. La política de depósito aplicada al depósito de otros usuarios está configurada así

 { "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3BucketList", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::uuu" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::bbb" }, { "Sid": "DelegateS3ObjectUpload", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::uuu" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::bbb", "arn:aws:s3:::bbb/*" ] } ] }

donde uuu es mi ID de usuario y bbb es el nombre del depósito que pertenece al otro usuario. Mi usuario y el otro usuario son cuentas de IAM que pertenecen a organizaciones diferentes . (Sé que esta política se puede escribir de manera más simple, pero la intención es agregar una verificación en la carga para bloquear objetos sin que se creen los permisos apropiados).

Luego puedo usar el siguiente código para enumerar todos los objetos en el depósito y también para cargar nuevos objetos en el depósito. Esto funciona, sin embargo, el propietario del depósito no tiene acceso al objeto debido a que Amazon hace que los objetos sean privados para el creador del objeto.

 import base64 import hashlib from boto3.session import Session access_key = "value generated by Amazon" secret_key = "value generated by Amazon" bucketname = "bbb" content_bytes = b"hello world!" content_md5 = base64.b64encode(hashlib.md5(content_bytes).digest()).decode("utf-8") filename = "foo.txt" sess = Session(aws_access_key_id=access_key, aws_secret_access_key=secret_key) bucket = sess.resource("s3").Bucket(bucketname) for o in bucket.objects.all(): print(o) s3 = sess.client("s3") s3.put_object( Bucket=bucketname, Key=filename, Body=content_bytes, ContentMD5=content_md5, # ACL="bucket-owner-full-control" # Uncomment this line to generate error )

Tan pronto como elimino el comentario de la opción ACL, el código genera un mensaje de error de acceso denegado. Si redirijo esto para que apunte a un depósito dentro de mi propia organización, la opción ACL tiene éxito y el propietario del depósito obtiene permiso completo para el objeto.

Ahora no puedo resolver esto, especialmente porque el propio consejo de Amazon parece ser hacerlo de la manera que he mostrado.

https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-owner-access/

https://aws.amazon.com/premiumsupport/knowledge-center/s3-require-object-ownership/

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

No es suficiente tener permiso solo en las políticas de depósito.

Compruebe si a su usuario (o función) le falta el permiso s3:PutObjectAcl en IAM .

over 4 years ago · Santiago Trujillo Denunciar

0

Cuando se usan los métodos de resource en boto3, se pueden realizar varias llamadas API diferentes y no siempre es obvio qué llamadas se están realizando.

En comparación, cuando se utilizan métodos de client en boto3, existe una asignación de 1 a 1 entre la llamada a la API que se realiza en boto3 y la llamada a la API que recibe AWS.

Por lo tanto, es probable que el método resource.put_object() esté llamando a una API adicional, como PutObjectAcl . Puede confirmar esto mirando en AWS CloudTrail y viendo qué llamadas a la API se están realizando desde su aplicación.

En tal caso, necesitaría el permiso adicional s3:PutObjectAcl . Esto sería necesario si el proceso de carga primero crea el objeto y luego actualiza la Lista de control de acceso del objeto.

Al usar los métodos del client para cargar un archivo, también existe la posibilidad de especificar una ACL, que creo que se aplica directamente en lugar de requerir una segunda llamada a la API. Por lo tanto, usar el método de client para crear el objeto probablemente no requiera este permiso adicional.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda