¿Qué está causando el acceso denegado cuando se usa aws cli para descargar desde Amazon S3?


57

Estoy realmente agitado en AWS tratando de descubrir lo que me falta aquí. Me gustaría hacerlo para que un usuario de IAM pueda descargar archivos de un bucket de S3, sin hacer que los archivos sean totalmente públicos, pero se me niega el acceso. Si alguien puede detectar lo que está fuera, me alegrarán.

Lo que he hecho hasta ahora:

  • Creé un usuario llamado my-user (por ejemplo)
  • Claves de acceso generadas para el usuario y ponerlas en ~ / .aws en una instancia EC2
  • Creé una política de depósito que esperaba que otorgara acceso a mi usuario
  • Corrió el comando aws s3 cp --profile my-user s3://my-bucket/thing.zip .

Política del cubo:

{
  "Id": "Policy1384791162970",
  "Statement": [
    {
      "Sid": "Stmt1384791151633",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/my-user"
      }
    }
  ]
}

El resultado es A client error (AccessDenied) occurred: Access Deniedaunque puedo descargar usando el mismo comando y las teclas de acceso predeterminadas (¿cuenta raíz?).

También he intentado agregar una política de usuario. Si bien no sé por qué sería necesario, pensé que no dolería, así que lo adjunté a mi usuario.

{
  "Statement": [
    {
      "Sid": "Stmt1384889624746",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

Los mismos resultados

Respuestas:


39

También estaba luchando con esto, pero encontré una respuesta aquí https://stackoverflow.com/a/17162973/1750869 que me ayudó a resolver este problema. Reposicionando la respuesta a continuación.


No tiene que abrir permisos para todos. Utilice las siguientes políticas de depósito en origen y destino para copiar de un depósito en una cuenta a otra utilizando un usuario de IAM

Cubo para copiar desde - SourceBucket

Bucket para copiar a - DestinationBucket

ID de cuenta de AWS de origen - XXXX – XXXX-XXXX

Usuario de origen de IAM - src – iam-user

La política a continuación significa - el usuario de IAM - XXXX – XXXX-XXXX: src – iam-user tiene s3: ListBucket y s3: Privilegios GetObject en SourceBucket / * y s3: ListBucket y s3: Privilegios PutObject en DestinationBucket / *

En SourceBucket, la política debería ser como:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::SourceBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:GetObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: SourceBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

En DestinationBucket, la política debe ser:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:PutObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

comando a ejecutar es s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1


1
Dios mío, eres mi héroe. Solo me faltaba el permiso ListBucket a nivel de cubo. Todavía no sé por qué necesito cargar el cubo para extraer un objeto de él, pero está bien. ¿Quizás es solo una peculiaridad de usar el comando aws?
Josh Gagnon el

Si, es bastante extraño. Pensaría que tener una política única de s3: * (por muy insegura que sea) sería suficiente para las pruebas de cordura.
Sergio

fml, 2 días desperdiciados por ese permiso ListBucket. buena captura
chaqke

Pasé mucho tiempo ... Esta fue la respuesta necesaria. ListBucket - bucketname, GetObject - bucketname / *
rsmoorthy

12

Cuando me enfrenté al mismo problema, resultó que AWS requería que se habilitara el cifrado del lado del servidor. Entonces el siguiente comando funcionó exitosamente para mí:

aws s3 cp test.txt s3://my-s3-bucket --sse AES256

3
¡Gracias! En mi caso, era --sse aws:kmsusar el cubo "predeterminado" ...
Michael Yoo

Si está utilizando una clave KMS no predeterminada, también debe pasarla: sin --sse-kms-key-id 0123-abc-etc embargo, la parte que no está clara es que para usar su propia clave KMS debe tener el permiso IAM kms:GenerateDataKeyo aún se le negará el acceso.
digarok

La pregunta es acerca de Descargar ... está realizando una carga en un S3 cifrado, de ahí el requisito de la clave.
Ilhicas

4

No recomendaría la opción 'Cualquier usuario autenticado de AWS' mencionado por James.

Al hacerlo, se agrega una ACL de nivel de depósito que permite que cualquier cuenta de AWS (no solo sus usuarios de IAM) enumere / elimine / modifique acls para ese depósito.

es decir, lectura / escritura pública para cualquier persona con una cuenta aws.


¿Has probado esto? Tenía la impresión de que la cuenta de AWS en realidad significa cualquier entidad dentro de mi organización, es decir, un usuario, una instancia de EC2, un rol de IAM, pero no alguien de una cuenta diferente. Podría estar equivocado, y editaré mi contribución y auditaré rápidamente mis cubos si ese es el caso. Gracias.
James Dunmore

1
Sip. El concesionario "Usuario autenticado" en las ACL S3 significa todas las cuentas de AWS. Aplica solicitudes firmadas, pero nada más. Aquí hay una referencia: enlace
Andrew

3

Me las arreglé para solucionar esto sin tener que escribir políticas: desde la consola S3 (interfaz de usuario web) seleccioné el depósito y en la pestaña de permisos elegí "Cualquier usuario de AWS autenticado" y emití todas las casillas.

ACTUALIZACIÓN: como se señala en los comentarios "Cualquier usuario de AWS autenticado" no es solo usuarios de su cuenta, es todo usuario autenticado de AWS, utilice con precaución


Me imagino que eso está creando una política para ti. Si marca todas las casillas, obtendrá ListBucket, etc. y más.
Josh Gagnon

Estoy seguro de que sí, solo sé que escribir políticas puede ser una molestia, esas casillas de verificación pueden darle un poco más pero una buena solución rápida
James Dunmore

2

Incluso si sus políticas de IAM están configuradas correctamente, aún puede obtener un error como An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denieddebido a los requisitos de MFA (Autenticación de múltiples factores) en sus credenciales. Esto puede pillarle desprevenido porque si ya ha iniciado sesión en la consola de AWS, parecerá que sus credenciales funcionan bien y el mensaje de error de permiso denegado de aws cli no es particularmente útil.

Ya hay algunas buenas instrucciones sobre cómo configurar MFA con aws cli:

Básicamente, necesita la dirección de su dispositivo MFA y enviarla con el código de su dispositivo para obtener un token temporal.


Me salvaste el día hermano!
Shintaroid

Yas, esa es la razón! ¿Por qué AWS no mostró esta razón en la salida?
tommy.qichang

0

Simplemente entré en la interfaz de usuario web e hice clic en el cubo, luego fui a los permisos y luego a la política. Cuando lo abrí, simplemente hice clic en Eliminar. Hice esto porque creo que también fue la configuración.

Regresé a la página principal de s3, luego hice clic en el cubo e intenté eliminarlo y funcionó.

incluso cuando lo hice por aws-cli usando

$ aws s3 rb s3://bucket-name --force  

De todos modos, eso es lo que funcionó para mí. La política de permisos le impide eliminar el depósito.


0

Una vez que recibí este error simplemente intentando ejecutar:

aws s3 cp s3://[bucketName]/[fileName] .

en una carpeta donde no tenía permisos. Es una tontería, ¡pero asegúrese de ser el propietario de la carpeta en la que se encuentra antes de continuar!


0

El problema surge cuando inserta nombres de recurso o de objeto no válidos. Tuve el mismo problema con boto3 (en mi caso era un nombre de depósito no válido)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.