¿Está bien pasar las credenciales al cliente para permitir que cargue archivos en Amazon S3?

4

Nuestra aplicación móvil cargará imágenes a AWS S3. La pregunta es si hacer una de las siguientes opciones:

  1. Suba la imagen a nuestro servidor de API, luego nuestro servidor de API carga la imagen a S3
    Ventajas: Más seguro, ya que las credenciales de S3 solo se almacenan en la nube.
    Contras: Más presión sobre el servidor de API, ya que miles de usuarios subirán imágenes, con tamaños que varían de 2 MB a 10 MB

  2. Deje que la aplicación móvil cargue la imagen directamente en S3, obteniendo las credenciales temporales de S3 del servidor de API para cada acceso a S3.
    Ventajas: Menos presión en el servidor de API, sin archivos se cargarán al servidor.
    Contras: Menos seguras, ya que las credenciales de S3 estarán expuestas al móvil, independientemente del hecho, la aplicación móvil solicitará credenciales temporales cada vez que acceda a S3. y que obtiene la credencial a través de la conexión SSL con el servidor de API.

Entonces, ¿la opción dos arriba es aún mejor? Como ya estamos otorgando credenciales temporales, es válido por solo 15 minutos cada vez para acceder a S3 a través de la conexión SSL.

¿Cuál es la forma recomendada de hacer esto?

    
pregunta Samir Sabri 06.03.2017 - 10:42
fuente

2 respuestas

1

No estoy seguro de que haya una práctica recomendada, pero creo que en su lugar tiene que ver con los requisitos de la aplicación y el equilibrio entre las ventajas y desventajas.

¿Sería una carga de servidor baja? Ok, podemos usar el servidor para trabajar con S3, obviamente es el método preferido (y también mantiene la interacción en la misma API que el resto del servicio de la aplicación).

¿Sería una carga demasiado pesada para el servidor? Ok, las alternativas son escalar los recursos del servidor o ver si el riesgo de que la aplicación funcione directamente con S3 es aceptable.

¿Es la información sensible? ¿Podemos asegurarla razonablemente si la aplicación se comunicara directamente con S3? Si no es muy sensible y puede ser razonablemente seguro y el riesgo es menor que el costo de escalar el servidor para manejar las cargas, entonces esta puede ser su elección.

¿La información es muy sensible y sucederían cosas terribles si la clave S3 se eliminara de SSL o del dispositivo? En ese caso, podría valer la pena gastar el dinero en escalar la arquitectura del servidor.

No creo que haya una única forma recomendada ... naturalmente, es más seguro manejar S3 solo desde su servidor (y usted lo pregunta en un foro de seguridad, así que supongo que ese es su enfoque principal), pero todo está en todo se convierte en un equilibrio impulsado por los requisitos de la aplicación.

    
respondido por el jleach 06.03.2017 - 11:40
fuente
1

Una buena manera de implementarlo es generar credenciales temporales que solo se pueden cargar a una parte específica del grupo (la que el usuario tiene acceso).

Incluso en el caso de que esas credenciales sean robadas de la memoria (supongo que utiliza https para cada comunicación, por lo que no pueden ser robadas durante la transmisión), un usuario final solo puede usarlas para lo que fueron diseñadas: cargar archivos.

Un ejemplo de esto se presenta aquí

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":"s3:PutObject",
         "Resource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*"
      },
      {
         "Effect":"Deny",
         "NotAction":"s3:PutObject",
         "Resource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*"
      },
      {
         "Effect":"Deny",
         "Action":"s3:*",
         "NotResource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*"
      }
   ]
}

Le sugeriría que también verifique periódicamente todos los archivos en su depósito al verificar las extensiones permitidas / firmas de archivos (tenga cuidado, esto puede llevar mucho tiempo). También puede volver a imponer su política más, según las extensiones de archivo (fuente aquí )

{
  "Id": "Policy1464968545158",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1464968483619",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<yourbucket>/*.jpg",
      "Principal": "*"
    },
    {
      "Sid": "Stmt1464968543787",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<yourbucket>/*.png",
      "Principal": "*"
    }
  ]
}
    
respondido por el BgrWorker 06.03.2017 - 11:59
fuente

Lea otras preguntas en las etiquetas