AccessDenied for ListObjects for S3 bucket cuando los permisos son s3: *

134

Estoy obteniendo:

Se produjo un error (AccessDenied) al llamar a la operación ListObjects: acceso denegado

Cuando intento obtener la carpeta de mi bucket de S3.

Usando este comando:

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

Los permisos de IAM para el depósito se ven así:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

¿Qué necesito cambiar para poder copyy con lséxito?

usuario1411335
fuente
1
En mi caso, lo configuré awspara un usuario y lo usé dentro de un script bash llamado cronjob de otro usuario, lo que significa que la clave de acceso y el token de acceso estaban incorrectos / desarmados. Mi solución fue poner directamente las credenciales ( AWS_ACCESS_KEY_IDy AWS_SECRET_ACCESS_KEY) en mi archivo de script bash como se describe aquí .
Uwe Keim

Respuestas:

199

Ha dado permiso para ejecutar comandos en objetos dentro del depósito S3, pero no ha dado permiso para realizar ninguna acción en el depósito en sí.

Modificar ligeramente su política se vería así:

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}

Sin embargo, eso probablemente da más permiso del necesario. Seguir las mejores prácticas de AWS IAM de otorgar el menor privilegio se vería así:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname/*"
          ]
      }
  ]
}
Mark B
fuente
40
Esta es una lista de acciones demasiado amplia. Para los derechos de lista y copia, lo que sugeriría son las acciones requeridas.
dom farr
66
@domfarr Estaba haciendo lo mínimo posible para ajustar la política de OP para que funcione para él. Si tiene una pregunta específica, debe publicarla como una pregunta separada en este sitio en lugar de etiquetarla con comentarios. Aunque debería ser realmente fácil mirar la lista de acciones de S3 y crear la política que desee.
Mark B
44
No estaba marcando. OP solicitó lo que se necesitaba para copiar y ls. Se incluyó la falta de nivel de cubo, pero no ajustó las acciones ... de ahí mi comentario.
dom farr
1
Tal vez asignar directamente un rol apropiado a EC3 debería funcionar. :)
ChikuMiku
66
También asegúrate de no escribir "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]como lo hice (es decir, solo quieres una barra antes del *): me tomó 4 largas horas darme cuenta de que este error hizo que todas mis listObjectsllamadas fallaran ...
Dániel Kis-Nagy
35

Si desea copiar todos los objetos de depósito de s3 utilizando el comando "aws s3 cp s3: // nombre de depósito / datos / todos los datos /. - recursivo" como mencionó, aquí hay una política segura y mínima para hacerlo:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

La primera declaración en esta política permite enumerar objetos dentro de un subdirectorio de un depósito específico. El recurso debe ser el arn del depósito de S3 y, para limitar el listado a solo un subdirectorio en ese depósito, puede editar el valor "s3: prefijo".

La segunda declaración en esta política permite obtener objetos dentro del depósito en un subdirectorio específico. Esto significa que cualquier cosa dentro de la ruta "s3: // bucket-name / data / all-data /" podrá copiar. Tenga en cuenta que esto no le permite copiar desde rutas principales como "s3: // nombre-cubo / datos /".

Esta solución es específica para limitar el uso de los comandos de AWS CLI; Si necesita limitar el acceso S3 a través de la consola o API de AWS, se necesitarán más políticas. Sugiero echar un vistazo aquí: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/ .

Aquí puede encontrar un problema similar al que me llevó a la solución que estoy dando. https://github.com/aws/aws-cli/issues/2408

¡Espero que esto ayude!

Robert Smith
fuente
1
En realidad, parece que puede restringir ListBucketa una subclave: stackoverflow.com/a/35952877/89218
paleozogt
¡Gracias por avisarme, intentaré esto en algunos de mis proyectos actuales!
Robert Smith
Gracias. Nunca pensé que la primera respuesta podría ayudarme
Vyacheslav Tsivina
De hecho, es posible, aws.amazon.com/blogs/security/…
citynorman
Edité la respuesta para incluir una condición para limitar la lista de objetos que se encuentran en una subcarpeta específica. ¡Gracias por la ayuda!
Robert Smith
8

Debe especificar el recurso para el depósito mediante "arn: aws: 3 ::: bucketname" o "arn: aws: 3 ::: bucketname *". Se prefiere este último ya que también permite manipulaciones en los objetos del cubo. Tenga en cuenta que no hay barra oblicua!

Listar objetos es una operación en Bucket. Por lo tanto, se requiere la acción "s3: ListBucket". Agregar un objeto al Bucket es una operación en Object. Por lo tanto, se necesita la acción "s3: PutObject". Ciertamente, es posible que desee agregar otras acciones según lo requiera.

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}
marzhaev
fuente
21
el problema arn:aws:s3:::bucketname*es que también permite el acceso aarn:aws:s3:::bucketname-with-suffix
Guss
1
Como está escrito, esta es una mala política; no lo uses Debe permitir s3: ListBucket contra arn: aws: s3 ::: bucketname y s3: PutObject contra arn: aws: s3 ::: bucketname / *
jarmod
7

No pude acceder a S3 porque

  • Primero configuré el acceso clave en la instancia (era imposible adjuntar un rol después del lanzamiento, entonces)
  • lo olvidé por unos meses
  • rol adjunto a la instancia
  • Intenté acceder. La clave configurada tenía mayor prioridad que el rol, y el acceso fue denegado porque el usuario no tenía los permisos necesarios de S3.

Solución: rm -rf .aws/credentialsluego awsusa el rol.

Putnik
fuente
1
Exactamente el mismo problema. Un síntoma de esto será que un usuario puede acceder a cosas que otro usuario no puede en el mismo nodo EC2.
Doc Kaos
6

Obtuve el mismo error al usar la política que se muestra a continuación, aunque tengo "s3: ListBucket" para la operación s3: ListObjects.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

Luego lo arreglé agregando una línea "arn: aws: s3 ::: bucketname"

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}
Gabriel Wu
fuente
4

Estaba pensando que el error se debe a "s3: ListObjects" acción pero tenía que agregar la acción "s3: ListBucket" para resolver el problema "AccessDenied para ListObjects para S3 cubo"

Sudhakar Naidu
fuente
4

Me enfrenté al mismo problema. Acabo de agregar credenciales config:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

en "~ / .aws / credentials" + reiniciar terminal para el perfil predeterminado.

En el caso de perfiles múltiples, se debe agregar arg de perfil :

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

donde PROFILE_NAME :

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

Puede encontrar más información sobre cómo configurar credenciales y perfiles múltiples aquí

Ihor Pavlyk
fuente
2

Intenté lo siguiente:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

Esto me dio el error:

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

Utilizando este formulario funcionó:

aws s3 ls {bucket name}
Enrique
fuente
0

Estoy agregando una respuesta con la misma dirección que la respuesta aceptada pero con pequeñas diferencias (importantes) y agregando más detalles.

Considere la siguiente configuración:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<Bucket-Name>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
    }
  ]
}

La política otorga acceso programático de escritura-eliminación y se divide en dos partes:
la ListBucketacción proporciona permisos en el nivel de depósito y las otras PutObject/DeleteObjectacciones requieren permisos en los objetos dentro del depósito.

El primer elemento Resource especifica arn:aws:s3:::<Bucket-Name>la ListBucketacción para que las aplicaciones puedan enumerar todos los objetos en el depósito.

El segundo elemento Resource especifica arn:aws:s3:::<Bucket-Name>/*las acciones PutObjecty DeletObjectpara que las aplicaciones puedan escribir o eliminar cualquier objeto en el depósito.

La separación en dos 'arns' diferentes es importante por razones de seguridad para especificar permisos de grano fino a nivel de cubo y de objeto.

Tenga en cuenta que si hubiera especificado solo GetObjecten el segundo bloque, lo que sucedería es que, en casos de acceso programático, recibiría un error como:

Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.

RtmY
fuente
-1

Me encontré con problemas similares, para mí el problema era que tenía diferentes claves de AWS configuradas en mi bash_profile.

Respondí una pregunta similar aquí: https://stackoverflow.com/a/57317494/11871462

Si tiene claves de AWS en conflicto en su bash_profile, la CLI de AWS se establece de manera predeterminada en estas.

Varun Tandon
fuente
-1

Tuve este problema, mi requisito, quería permitir que el usuario escribiera en una ruta específica

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

y el problema se resolvió con este cambio

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
Ameen
fuente