Métodos para mantener un registro autónomo con alta integridad

1

Estoy escribiendo una aplicación de escritorio .NET que se utiliza para enviar pedidos a un servidor a través de una API REST. Para evitar la pérdida de nuestro token de autenticación, lo hice para que, cuando lo use por primera vez, el usuario tenga que enviar el token de autenticación y una contraseña para cifrarlo.

El algoritmo de encriptación es AES-256-CBC y el esquema es el siguiente: la contraseña se revisa antes de que la use el algoritmo, la sal utilizada para el hashing es el GUID de la computadora, por lo que no basta con copiar los archivos del programa, y El IV se genera aleatoriamente y se concatena con el cifrado. Después, cuando el usuario abre el programa, se le pide una contraseña, se inicia el descifrado y, cuando el token de autenticación no coincide con la máscara requerida, se mostrará un error. Hasta aquí todo bien diría.

Sin embargo , mi supervisor aún no está satisfecho con el nivel de seguridad: quiere que el programa registre todos los pedidos que se enviaron al servidor en caso de anomalías administrativas por parte del tercero que hospeda El servidor, solo para que tengamos una referencia con un nivel razonable de credibilidad (aunque supongo que podría llamarlo 'prueba' en caso de que su administración falle). La parte de 'credibilidad' es donde cualquier implementación directa de un archivo de registro sale por la ventana, no proporcionaría:

  • Integridad: ninguna persona (incluido el usuario) tiene permiso para modificar el archivo de registro con contenido que no refleja el uso real del programa. El registro solo se puede adjuntar, solo cuando se utiliza la función principal del programa, y solo por el propio programa.
  • Confidencialidad: El contenido del registro solo puede ser convocado por el usuario del programa (la solicitud de contraseña ayudará en la identificación del usuario).

He intentado crear un esquema criptográfico (firma digital) que encripta cada registro que se adjunta al registro y encripta la clave pública con la contraseña del usuario, pero esto no resuelve la mitad del problema: la clave privada El programa debe almacenarlo de todas maneras, por lo que estrictamente hablando significa que el usuario tiene acceso a él y tiene la capacidad de modificar el registro.

¿Hay algún método o esquema que cumpla con estos requisitos?

    
pregunta Chavez 02.07.2015 - 14:14
fuente

2 respuestas

1

Usted tiene razón en que es un problema intratable muy similar al por qué el DRM nunca puede ser seguro. Puede hacer que sea muy difícil para un usuario falsificar el registro, pero en última instancia, la aplicación necesitará tener la clave necesaria para firmar digitalmente los mensajes de registro. Si la clave existe en el equipo cliente, se puede eliminar del equipo cliente.

La antigua máxima de "no hay seguridad de la información sin seguridad física" está en juego.

Entonces, mucho se reduce a qué nivel de integridad se requiere. ¿Qué posibilidades hay de que los usuarios intenten falsificar el registro? ¿Cuál es su ganancia potencial? Sería honesto con su jefe sobre cómo la seguridad perfecta no se puede lograr.

Detalles técnicos del registro

No está exactamente claro, así que pensé que lo aclararía. La aplicación debe contener una clave privada para la firma. Es posible que desee que este cliente sea específico para compartimentar el riesgo. Hay formas de hacer que la extracción de esta clave privada sea más difícil, pero es importante ser abierto y transparente, por lo que no se puede hacer imposible. La clave pública es conocida tanto por el usuario como por usted para autenticar el registro. La aplicación firma el mensaje de registro y luego lo cifra con una clave derivada de la contraseña del usuario.

Dependiendo del nivel de seguridad y costo del software, alguien en el equipo puede sugerir el uso de un dongle de hardware o un token USB para almacenar la clave privada. Solo tenga en cuenta que si bien la clave es más segura si el atacante puede enviar un mensaje falso al dongle para su firma, el atacante puede alterar el registro sin tener acceso directo a la clave.

Detalles técnicos de la API REST

Es posible que desee reconsiderar permitir que el cliente determine si el token es válido para evitar ataques sin conexión. Si el token se almacena encriptado en la máquina cliente, un atacante con acceso al sistema de archivos podría extraer el token encriptado y forzarlo a desconectarse hasta que descubra el token válido.

Por otra parte, si el token de autenticación solo puede ser validado por el servidor, entonces la única manera de forzar la contraseña del usuario es mediante una solicitud al servidor. Esto le permite limitar el rendimiento de dichos ataques de fuerza bruta, bloquea las cuentas y prohibir ip si es necesario. Se vuelve más difícil obtener acceso no autorizado a un token. Hay dos maneras de lograr esto. El método más simple si puede hacer que los tokens sean arbitrarios sería hacer que el token sea simplemente una derivación (PBKDF2) de la contraseña del usuario.

Si el token debe ser independiente de la contraseña del usuario o está predefinido, puede cifrarlo y almacenarlo en el cliente. De esta manera, para cualquier contraseña se devuelve un token descifrado y no se pueden distinguir tokens válidos o no válidos. Sin comunicarse con el servidor.

Si recorre esta ruta, para evitar la fuga de información, los registros deberán cifrarse, no mediante una clave derivada directamente de la contraseña del usuario, sino mediante una clave proporcionada por el servidor a solicitud (con el token de autenticación adecuado). De lo contrario, un atacante puede simplemente forzar los registros sin conexión y usarlos como un canario para identificar la contraseña correcta y, por lo tanto, el token.

    
respondido por el Gerald Davis 02.07.2015 - 14:40
fuente
1

Yo usaría un servicio provisto externamente (Splunk on Cloud, Papertrail - hay otros pero los he usado) para asegurar una integridad razonable. O use su propio, separado del servicio (basado en una solución comercial o, por ejemplo, ELK )

La parte de confidencialidad es más complicada. Para el caso Splunk, si tiene una lista de usuarios predefinida, puede crear vistas con un contenido por usuario y otorga derechos de lectura a los usuarios apropiados. Sin embargo, esto es difícilmente escalable.

    
respondido por el WoJ 02.07.2015 - 14:26
fuente

Lea otras preguntas en las etiquetas