Obtener acceso denegado al llamar a la operación PutObject con permiso de nivel de depósito

108

Seguí el ejemplo en http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3 sobre cómo otorgar acceso a un usuario a un solo depósito.

Luego probé la configuración usando el complemento W3 Total Cache Wordpress. La prueba falló.

También intenté reproducir el problema usando

aws s3 cp --acl=public-read --cache-control='max-age=604800, public' ./test.txt s3://my-bucket/

y eso falló con

upload failed: ./test.txt to s3://my-bucket/test.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied

¿Por qué no puedo subir a mi depósito?

Greg
fuente

Respuestas:

204

Para responder mi propia pregunta:

La política de ejemplo otorgó acceso a PutObject, pero también tuve que otorgar acceso a PutObjectAcl.

Tuve que cambiar

"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"

del ejemplo a:

"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"

También debe asegurarse de que su depósito esté configurado para que los clientes establezcan una ACL de acceso público al desmarcar estas dos casillas:

ingrese la descripción de la imagen aquí

Greg
fuente
2
¡Gracias! No estoy seguro de por qué la propia documentación de Amazon está apagada. Es posible que desee incluir "s3: AbortMultipartUpload" también para que una carga abortada se pueda borrar correctamente.
Hashcut
ejemplos de políticas de S3 colocados aquí docs.aws.amazon.com/IAM/latest/UserGuide/…
E.Big
1
por cierto, no me funciona. interacción boto3, incluso con la política de s3fullaccess Estoy recibiendo "AccessDenied for PutObject"
E.Big
2
En mi caso, funciona con AWS cli, pero no funciona con boto
Hardik Gajjar
3
Tenía acceso completo a S3, pero me faltaba el Bloquear nuevas ACL públicas y cargar objetos públicos. ¡Gracias!
the_ccalderon
36

Tenía un problema similar. No estaba usando las cosas de ACL, así que no las necesitaba s3:PutObjectAcl.

En mi caso, estaba haciendo (en Serverless Framework YML):

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName"

En vez de:

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName/*"

Lo que agrega un /*al final del ARN del depósito.

Espero que esto ayude.

movermeyer
fuente
2
Necesitaba el que tenía / *
cyrf
este fue el caso para mí también
Visualspark
10

Estaba golpeándome la cabeza contra la pared tratando de que las cargas de S3 funcionaran con archivos grandes. Inicialmente mi error fue:

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

Luego intenté copiar un archivo más pequeño y obtuve:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

Podría enumerar objetos bien, pero no pude hacer nada más a pesar de que tenía s3:*permisos en mi política de roles. Terminé reelaborando la política a esto:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "*"
        }
    ]
}

Ahora puedo subir cualquier archivo. Reemplácelo my-bucketcon el nombre de su depósito. Espero que esto ayude a alguien más que esté pasando por esto.

Ken J
fuente
2
Esto da: Falta el campo obligatorio Director :(
Sameera K
2
También recibo el siguiente error: Falta el campo obligatorio Director
Karan Sharma
cómo se hace esto en yml
ichimaru
Atención: esto le dará a su usuario / rol de IAM acceso para enumerar las claves en todos los depósitos. Úselo con cuidado; idealmente evite usarlo "Resource": "*".
Darian Moody
Agregue - "Principal": "*", - debajo de "Efecto": "Permitir", para resolver el problema con el campo obligatorio que falta
meck373
9

En caso de que esto ayude a alguien más, en mi caso, estaba usando una CMK (funcionó bien usando la clave predeterminada aws / s3)

Tuve que entrar en la definición de mi clave de cifrado en IAM y agregar el usuario programático que inició sesión en boto3 a la lista de usuarios que "pueden usar esta clave para cifrar y descifrar datos desde aplicaciones y al usar servicios de AWS integrados con KMS".

PeskyGnat
fuente
Eso me ayudó. ¡Gracias! Mismo error que los permisos, pero de hecho fue el cifrado.
Vicente Rocha
6

Tuve un problema similar al cargar en un bucket de S3 protegido con cifrado KWS. Tengo una política mínima que permite la adición de objetos bajo una clave s3 específica.

Necesitaba agregar los siguientes permisos de KMS a mi política para permitir que el rol coloque objetos en el depósito. (Puede ser un poco más de lo estrictamente requerido)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys",
                "kms:GenerateRandom",
                "kms:ListAliases",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:ImportKeyMaterial",
                "kms:ListKeyPolicies",
                "kms:ListRetirableGrants",
                "kms:GetKeyPolicy",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:ListResourceTags",
                "kms:ReEncryptFrom",
                "kms:ListGrants",
                "kms:GetParametersForImport",
                "kms:TagResource",
                "kms:Encrypt",
                "kms:GetKeyRotationStatus",
                "kms:GenerateDataKey",
                "kms:ReEncryptTo",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:<MY-REGION>:<MY-ACCOUNT>:key/<MY-KEY-GUID>"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
            <The S3 actions>
            ],
            "Resource": [
                "arn:aws:s3:::<MY-BUCKET-NAME>",
                "arn:aws:s3:::<MY-BUCKET-NAME>/<MY-BUCKET-KEY>/*"
            ]
        }
    ]
}
Spangen
fuente
Increíble. Copié los permisos de la aws/s3clave administrada predeterminada a una política de IAM adjunta a un rol (no en la política de KMS) y funciona bien. Las únicas acciones que necesitaba contra el KMS ARNs fueron: kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, kms:GenerateDataKey*, kms:DescribeKey. Luego, solo los permisos estándar de S3.
z0r
3

Estaba teniendo el mismo mensaje de error por un error que cometí: asegúrese de usar un uri s3 correcto como: s3://my-bucket-name/

(Si my-bucket-name está en la raíz de su aws s3 obviamente)

Insisto en eso porque al copiar y pegar el bucket de s3 desde su navegador, obtiene algo como https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

Por lo tanto, cometí el error de usar lo s3://buckets/my-bucket-nameque aumenta:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

amiabl
fuente
1

Para mí, estaba usando claves de autenticación caducadas. Generaron nuevos y boom.

Mark Jackson
fuente
1

Similar a una publicación anterior, (excepto que estaba usando credenciales de administrador) para que las cargas de S3 funcionen con un archivo grande de 50M.

Inicialmente mi error fue:

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

Cambié el multipart_threshold para estar por encima de los 50M

aws configure set default.s3.multipart_threshold 64MB

y tengo:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

Revisé la configuración de acceso público del cubo y todo estaba permitido. Entonces descubrí que el acceso público se puede bloquear a nivel de cuenta para todos los depósitos de S3 :

S3 puede bloquear ACL pública a nivel de cuenta

Dovka
fuente
1

Si ha configurado el acceso público para el depósito y todavía no funciona, edite la política de bucker y pegue lo siguiente:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::yourbucketnamehere",
                "arn:aws:s3:::yourbucketnamehere/*"
            ],
            "Effect": "Allow",
            "Principal": "*"
        }
    ]
}
Den Pat
fuente
Funcionó para mí, creé un nuevo bucket de S3, lo hice completamente público. Es put_object escribible, pero falla al hacer la opción put_object con ACL =. Impar ?
Doug F
0

Si ha especificado su propia clave KMS administrada por el cliente para el cifrado S3, también debe proporcionar la marca --server-side-encryption aws:kms, por ejemplo:

aws s3api put-object --bucket bucket --key objectKey --body /path/to/file --server-side-encryption aws:kms

Si no agrega la bandera, --server-side-encryption aws:kmsla cli muestra un AccessDeniederror

Benjamin Slabbert
fuente
0

Pude resolver el problema otorgando acceso s3 completo a Lambda desde las políticas. Cree un nuevo rol para Lambda y adjunte la política con acceso S3 completo.

Espero que esto ayude.

bajaj profunda
fuente