Estoy construyendo una aplicación y un servidor. El servidor es una API node.js con un backend de Postgres.
Las imágenes creadas en la aplicación se almacenarán en Amazon S3. Los metadatos sobre los archivos se almacenarán en Postgres.
He acercado dos soluciones posibles para las claves de cifrado. Ambas involucran las amazonas URLs firmadas. Amazon genera estas URL como resultado de una llamada de mi servidor.
- Foto tomada en la aplicación
- Metadatos de archivos guardados en Postgres a través de mi API
- El servidor obtiene la URL previamente firmada de Amazon para cargar los archivos
- La URL se devuelve a la aplicación como resultado de la llamada en el paso 2.
- La aplicación utiliza la URL para publicar el archivo en Amazon S3
En cuanto al cifrado de archivos, puedo elegir utilizar el Servicio de administración de claves de Amazon (kms), es decir, Amazon genera y realiza un seguimiento de las claves de cifrado con sal individual para cada archivo. Mi servidor necesitaría usar la clave maestra para obtener las URL previamente firmadas generadas.
O podría elegir generar claves de cifrado individuales para cada archivo en mi servidor y almacenar estas claves con el resto de los metadatos en Postgres. Amazon todavía haría el cifrado / descifrado, pero yo pasaría cada clave individual en la solicitud de URL presignadas en lugar de pasar la clave maestra.
KMS, pro:
- No hay claves de cifrado almacenadas con los metadatos del archivo en Postgres
KMS, con:
- La clave maestra desbloquea todos los archivos en S3 (pero la clave maestra se puede rotar)
Claves personalizadas generadas, pro:
- Es más fácil implementar una clave de usuario adicional con XOR: ingiriendo las claves. Si un cliente no confía en mi manejo de claves, podría agregar una clave adicional que solo existe en el dispositivo, probablemente en la cadena de claves de iOS.
Claves generadas personalizadas. con:
- Si la base de datos de Postgres está comprometida, los archivos en S3 también podrían estar comprometidos.
Soy un programador, no un experto en seguridad. Si es necesario, consultaré a un experto, pero pensé que los expertos en este foro podrían darles más información primero.
Por supuesto, se han tomado otras medidas de seguridad. La aplicación solo habla con la API a través de HTTPS y la aplicación se autentica con la API (usando Oath2 y JWT).
Realmente me gusta el concepto de URL presignado, ya que esto permite que la aplicación no tenga ni idea de las claves necesarias para la carga / descarga de S3.
¿Debo usar kms o generar claves yo mismo?
¡Gracias!