android - servidores - ¿Cuál es la forma preferida de usar AWS(específicamente S3) desde aplicaciones móviles?
servidores para aplicaciones moviles (3)
Agregar la clave de acceso AWS y la clave secreta directamente en el código de la aplicación definitivamente no es un buen enfoque, principalmente porque la aplicación reside en el dispositivo del usuario (a diferencia del código del lado del servidor) y puede modificarse para obtener las credenciales, que luego pueden ser mal utilizadas .
Aunque encuentro esta información en todas partes, pero no puedo encontrar una solución definitiva a este problema. ¿Cuáles son mis opciones? Leí acerca de la arquitectura de máquina expendedora de tokens para credenciales temporales, pero no estoy convencido de que sea mejor. Si puedo realizar una ingeniería inversa de la clave secreta, entonces puedo realizar una ingeniería inversa del código que solicita credenciales temporales. Y una vez que tengo un conjunto de credenciales temporales para acceder a S3, soy tan bueno como si tuviera la clave. Puedo solicitar las credenciales temporales una y otra vez, incluso si caducan bastante rápido. En resumen, si una aplicación puede hacer algo, puedo hacer lo mismo que un usuario malintencionado. En todo caso, el TVM puede ser un poco mejor en gestión (rotación de credenciales y cambio de clave en caso de incumplimiento, etc.). Tenga en cuenta que podemos poner las mismas restricciones de acceso en la clave secreta, como planeamos hacer en caso de credenciales temporales de TVM.
Además, si Amazon no quiere que las personas usen la clave secreta directamente en la aplicación, ¿por qué no la bloquean en su SDK y hacen cumplir TVM o la solución correcta? Si deja un camino, las personas lo usarán. Leí varios artículos como estos y me pregunto por qué ?: http://blog.rajbala.com/post/81038397871/amazon-is-downloading-apps-from-google-play-and
Principalmente procedo de la web, por lo que mi comprensión de esto puede ser un poco errónea. Ayúdame a comprender si esto es mejor y si hay una solución perfecta (o buena) disponible para este problema.
PD: ¿Hay una implementación de carriles de TVM?
Incrustar claves S3 en el código de la aplicación es muy arriesgado. Cualquiera puede obtener fácilmente esa clave del código de su aplicación (no se requiere ingeniería inversa o alto conjunto de habilidades), incluso si se almacena encriptada, aún está comprometida, solo que alguien tiene que esforzarse más (dependiendo de cómo cifre).
Espero que comprenda las ventajas de usar credenciales temporales para acceder a los recursos de Amazon (S3, etc.) (principalmente seguridad + algunos otros, como no actualizar la aplicación, etc.). Creo que estás más confundido sobre el proceso para obtener las credenciales temporales de TVM y cómo eso es más seguro que insertar claves en el código.
Todos los clientes que usan TVM primero deben registrarse con la implementación del servidor TVM que usted hospeda. La comunicación entre la aplicación (utilizando el cliente TVM) y el servidor TVM es a través de SSL.
Primero la aplicación se registra con TVM proporcionando UUID y una clave secreta. Tenga en cuenta que la clave secreta no está incorporada en el código de la aplicación (que creo que es la razón principal de su confusión) sino que se genera aleatoriamente (utilizando SecRandomCopyBytes que genera una matriz de bytes aleatorios criptográficamente seguros) en el momento del registro (y codificación hexadecimal).
Una vez que el dispositivo se registra exitosamente con TVM, el cliente TVM almacena el UDID y la clave secreta generados en un almacenamiento llamado Keychain en iOS y preferencias compartidas en Android. El llavero en iOS es el almacenamiento compartido proporcionado por iOS para almacenar de manera segura (encriptada) información (principalmente claves, contraseña, etc.).
Después del registro y el almacenamiento UDID / clave secreta, la aplicación puede obtener el token de TVM enviando el UDID, la firma criptográfica y una marca de tiempo. La firma criptográfica es un hash HMAC generado a partir de la marca de tiempo utilizando la clave secreta. El TVM puede usar el UDID para buscar la clave secreta y usarla para verificar la firma. A continuación, el TVM responde enviando credenciales temporales, que se cifran utilizando la clave secreta (usa AES ). La aplicación descifra las credenciales temporales usando la clave y luego puede usarlas para acceder a cualquier servicio de AWS para el que se autoricen las credenciales temporales. Eventualmente, se alcanzará el tiempo de caducidad de estas credenciales temporales, momento en el que la aplicación puede obtener las nuevas credenciales temporales, si es necesario.
No estoy seguro de cómo las URLs firmadas se relacionan con TVM, porque no entiendo los conceptos al 100% pero las URL firmadas realmente me solucionaron el problema. Necesitaba un mecanismo que alimentara la aplicación web y los datos de la aplicación móvil sin permitir el uso indebido de las credenciales. Poner la clave en el código es realmente una muy mala idea, ya que puede generar una gran factura para la empresa.
Después de 3 días de investigación exhaustiva, encontré una solución simple y, lo que parece ser, confiable y relativamente segura: URLs firmadas . La idea es que un back-end muy liviano pueda generar una URL temporal que otorgue al usuario acceso al recurso específico por un tiempo limitado . Entonces la idea es simple:
el usuario le pregunta a nuestro back-end con una llamada Rest que quiere un recurso específico
el back-end ya está autorizado con AWS S3
el back-end genera una URL temporal para el usuario y la envía en la respuesta Rest
el usuario usa la URL para buscar los datos directamente de AWS
Aquí se puede encontrar una implementación Plug-and-Play de Python y con una pequeña modificación que tuve que usar: aquí .
Por supuesto, una cosa más para averiguar sería cómo autorizar al usuario antes de saber que podemos otorgarle la URL, pero ese es otro par de zapatos.
Idealmente, debe utilizar Cognito Identity
para lograr esto junto con las políticas apropiadas. Se debe usar con S3TransferUtility
y S3TransferManager
en iOS y Android SDK. Eso también permitiría cargas y descargas en segundo plano. Cognito
credenciales temporales para acceder a los recursos de AWS y es gratuito. Además, puede UserPools
usando UserPools
o proveedores como Google, Facebook si desea un acceso seguro.
Gracias, Rohan