Mantener los archivos de usuario seguros mientras se permite que una aplicación web use los archivos

1

Fondo corto

Actualmente estoy diseñando una aplicación web en la que el usuario carga algunos archivos en el servidor y luego le pide al servidor que realice algunos cálculos basados en estos archivos (la tarea puede ponerse en cola si la carga de trabajo actual es alta). Luego, el servidor almacena el resultado y lo pone a disposición del usuario para que lo vea.

Estos archivos pueden contener datos privados y / o confidenciales y, por lo tanto, decidí buscar formas de mantener estos archivos seguros en el lado del servidor.

He investigado este tema pero no he encontrado la solución que estoy buscando. Tengo una idea general para el diseño, pero creo que tiene fallas y que podría estar reinventando la rueda (sin experiencia en este campo).

Comenzaré con los requisitos básicos, luego presentaré mi idea y terminaré con las preguntas que tengo.

Requisitos de seguridad

  • El sistema debe cifrar los archivos antes de almacenarlos en el sistema de archivos
  • Los administradores del sistema, etc., no deben poder descifrar los archivos en propio (el siguiente requisito tiene prioridad sobre este requisito)
  • El sistema debe poder descifrar los archivos solo si el usuario proporciona autenticación
  • El sistema debe admitir múltiples usuarios simultáneos con cada usuario capaz de autenticar solo el descifrado de los archivos cargados por ese usuario.

Idea actual

Almacenar los archivos de manera que el descifrado solo sea posible para el usuario parece bastante sencillo. Actualmente estoy pensando en el siguiente flujo de trabajo:

  1. El usuario crea un par de claves públicas / privadas (con algunas herramientas de terceros)
  2. El usuario carga la clave pública en el sistema
  3. El usuario carga el archivo (el archivo permanece en la memoria por ahora)
  4. El sistema genera una clave compartida para cifrar el archivo
  5. El sistema cifra el archivo con la clave compartida
  6. El sistema almacena el archivo
  7. El sistema cifra la clave compartida con la clave pública
  8. El sistema almacena la clave compartida encriptada

Creo que este enfoque es bastante común y no tiene inconvenientes serios.

Ahora la parte problemática. Ya que quiero que el usuario pueda permitir que el sistema descifre el archivo en algunas situaciones, este es el único flujo de trabajo que se me ocurrió:

  1. El usuario inicia una tarea que requiere un archivo cifrado
  2. El usuario carga la clave privada (solo permanece en la memoria)
  3. El sistema descifra la clave compartida (solo permanece en la memoria)
  4. El sistema elimina la clave privada de la memoria
  5. El sistema descifra el archivo en la memoria
  6. El sistema elimina de la memoria la clave compartida descifrada
  7. El sistema completa la tarea
  8. El sistema elimina el archivo descifrado de la memoria
  9. El sistema almacena el resultado de la tarea

Preguntas

Aunque creo que este enfoque sería funcional, todavía estoy preocupado por un par de cosas:

  • ¿No estoy seguro de que cargar una clave privada como un archivo normal pueda considerarse una opción viable? - Si no me equivoco, al menos esto va en contra de las normas habituales.
  • ¿Se puede transferir la clave privada de forma segura a través de Internet? - Me inclino a creer que puede, sin embargo, no he investigado cómo exactamente.
  • Incluso si el archivo cifrado (o la clave privada) solo se guarda en la memoria por el tiempo mínimo necesario, ¿seguiría siendo un riesgo para la seguridad? - Siento que sigue siendo un riesgo, pero no grave.
  • ¿Esto ya es un problema resuelto? - Si es así que no pude encontrar las soluciones

Como comentario final, me gustaría agregar que soy plenamente consciente de que cualquier sistema de este tipo requeriría la confianza de los usuarios. Principalmente, me gustaría saber si esto se puede lograr de alguna manera, ¿es viable mi idea y existe una forma mejor / alternativa?

    
pregunta FableBlaze 14.01.2016 - 23:54
fuente

2 respuestas

1

Para la segunda parte, puedes hacerlo sensiblemente mejor:

  1. (La sesión entre el usuario y el sistema está cifrada)
  2. El usuario inicia una tarea que requiere un archivo cifrado
  3. El sistema envía la clave compartida encriptada
  4. El usuario descifra localmente la clave compartida
  5. El usuario envía la clave compartida descifrada (solo permanece en la memoria)
  6. El sistema descifra el archivo en la memoria
  7. El sistema elimina de la memoria la clave compartida descifrada
  8. El sistema completa la tarea
  9. El sistema elimina el archivo descifrado de la memoria
  10. El sistema almacena el resultado de la tarea

Debe asegurarse de que no se pueda acceder a la memoria de la rutina que realiza la tarea por otros subprocesos en el servicio del sistema, si por casualidad sirve a varios clientes en el mismo sistema, utilizando técnicas de compartimentación como COWL (no estoy seguro de su estado de implementación) o tal vez Capsicum .

Estoy pensando firmemente en cómputo multipartito seguro y cifrado homomorfo al leer su problema. Sin embargo, no soy un experto, así que no voy a detenerme en esto. Puede haber formas, dependiendo de lo que necesite calcular, para realizar el cálculo sin tener que descifrar los archivos. Esto también podría lograrse haciendo que los clientes calculen y carguen propiedades cifradas sobre los archivos en lugar de los archivos en sí mismos.

Es posible que haya muchos otros diseños, y espero que alguien señale un mejor enfoque.

    
respondido por el Steve DL 15.01.2016 - 00:17
fuente
1

No cargue la clave privada en el servidor.

En su lugar, envíe la clave compartida cifrada al usuario. Luego, el usuario puede descifrar con la clave privada, que permanece en el sistema del usuario.

Luego, el usuario envía la clave compartida descifrada al servidor.

    
respondido por el Ben 15.01.2016 - 00:17
fuente

Lea otras preguntas en las etiquetas