La acción del depósito de S3 no se aplica a ningún recurso

124

Estoy siguiendo las instrucciones de esta respuesta para generar la siguiente política de bucket de S3:

{
  "Id": "Policy1495981680273",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1495981517155",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::surplace-audio",
      "Principal": "*"
    }
  ]
}

Recibo el siguiente error:

La acción no se aplica a ningún recurso (s) en la declaración

¿Qué me falta en mi póliza?

Philip Kirkbride
fuente
1
Probé una solución en el enlace: stackoverflow.com/a/36551238/2786039 Y ahora funciona. Saludos
Vuong Nguyen

Respuestas:

218

De los documentos de IAM, http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Action

Algunos servicios no le permiten especificar acciones para recursos individuales; en su lugar, las acciones que enumere en el elemento Action o NotAction se aplicarán a todos los recursos de ese servicio. En estos casos, usa el comodín * en el elemento Resource.

Con esta información, el recurso debe tener un valor como el siguiente:

"Resource": "arn:aws:s3:::surplace-audio/*"
Oluwafemi Sule
fuente
40
¡No puedo creer que esto no se mencione en la política de bucket o en el generador de políticas!
Carles Alcolea
4
Estoy usando * y todavía da ese error. ¿Alguien podría ayudarme?
Yehuda Clinton
@YehudaClinton, funciona para mí. asegúrese de agregar ambos / *
RMati
74

Eliminar el s3:ListBucketpermiso no fue realmente una buena solución para mí, y probablemente no lo sea para muchos otros.

Si desea el s3:ListBucketpermiso, solo debe tener el arn simple del depósito (sin el /*al final), ya que este permiso se aplica al depósito en sí y no a los elementos dentro del depósito.

Como se muestra a continuación, debe tener el s3:ListBucketpermiso como una declaración separada de los permisos relacionados con los elementos dentro del depósito como s3:GetObjecty s3:PutObject:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"        
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject", 
        "s3:PutObject"
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}
Luke
fuente
Convenido. Para algunas acciones, se necesita el permiso ListBucket antes de poder realizar GetObject, por lo que esta respuesta es más completa.
3cheesewheel
2
Esto me funciona y solo resalta cuánto trabajo todavía tiene que hacer AWS para guiar a los usuarios a hacer cosas básicas.
Volvox
41

La acción de error no se aplica a ningún recurso (s) en la declaración

Simplemente significa que la acción (que escribió en la política) no se aplica al recurso. Estaba tratando de hacer público mi cubo para que cualquiera pueda descargarlo. Recibí un error hasta que eliminé ("s3: ListBucket") de mi declaración.

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket-name/*",
      "Principal": "*"
    }
  ]
}

Debido a que el depósito de lista no se aplica dentro del depósito, eliminar esta política de acción funcionó bien.

Vaseem007
fuente
Gracias, eso funcionó para mí, eliminando "s3: ListBucket".
Paul Watson
14

Me encontré con este problema y encontré una solución más corta para aquellos que desean tener ListBucket y GetObject en la misma política.

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
          "arn:aws:s3:::bucket-name",
          "arn:aws:s3:::bucket-name/*"
      ],
      "Principal": "*"
    }
  ]
}
Alex Spence
fuente
Incorrecto: Principalno está permitido para la gramática de la política S3.
azec-pdx
Ninguna de las soluciones anteriores funcionó para mí, el director no era válido o me negarían el acceso.
Daniel
Esto es correcto, The Resource debería ser una matriz en este caso y para incluir esas 2 líneas ... Vote up.
Assil
4

También me he enfrentado a un problema similar al crear el depósito.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949"
            ]
        }
    ]
}

He cambiado el código anterior a

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949/*"
            ]
        }
    ]
}

agregue / * al nombre de su depósito, resolverá el problema

Aquí mi nombre de cubo es mrt9949

Ravi Teja Mureboina
fuente
¡Gracias! Pasé años buscando esto
Jack_Hardy
4

En mi caso, la solución a este error fue intentar eliminar algunas de las acciones que estaba aplicando. Algunos de ellos no son relevantes o no pueden funcionar con este recurso. En este caso, no me dejaría incluir estos:

GetBucketAcl ListBucket ListBucketMultipartUploads

Yehuda Clinton
fuente
ListBucket me tiene! Gracias por esto
Quad64Bit
Para mí, funcionó cuando solo mantenía getObjet
LittleTiger
0

Debe verificar el patrón del arn definido en la etiqueta Resource para Policy-

"Recurso": "arn: aws: s3 ::: s3mybucketname / *"

Con la adición de "/ *" al final ayudaría a resolver el problema si lo enfrenta incluso después de haber desbloqueado su Política de acceso público para su Bucket.

Pinaki
fuente
0
  • Vaya a Amazon S3 en su instancia.
  • Vaya a Permisos -> pestaña Acceso público.
  • Seleccione Editar y desmarque Bloquear todos los accesos públicos y guardar.
  • Verá la etiqueta 'Público' en la pestaña Permiso y en la Lista de control de acceso.
Chathura Devinda
fuente
0

También puede configurar ListBuckets para cada carpeta, así

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts-1521238702575",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::buckets.email/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "[red]"
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringEquals": {
                    "s3:delimiter": "/",
                    "s3:prefix": [
                        "",
                        "domain.co",
                        "domain.co/user"
                    ]
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "domain.co/user/*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::buckets.email/domain.co/user/*"
        }
    ]
}

Estas reglas se utilizan junto con SES para recibir un correo electrónico, pero permiten que un usuario externo vea los archivos que SES puso en el depósito. Seguí las instrucciones desde aquí: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

Además, debe especificar el prefijo como domain.co/user/CON barra al final cuando use el SDK; de lo contrario, se le denegará el acceso. espero que ayude a alguien

zavr
fuente