Si desea asegurarse de que los usuarios solo tengan acceso a sus archivos al proporcionar una clave (posiblemente almacenada en la memoria para que no tengan que proporcionarla una y otra vez), ¿por qué no usa simplemente un simple , ¿sistema de archivos no cifrado y cifrar cada archivo individualmente?
Tal vez porque esto filtra información sobre la cantidad de archivos, fechas de creación y modificación, tamaños de archivos y posiblemente nombres de archivos si no los cifra. Entonces, comienza a escribir algo de código en torno a esa solución y finalmente termina con una solución que almacena archivos individuales en un contenedor para que tenga control sobre los metadatos del archivo.
Y ahora has reinventado LUKS, TrueCrypt, VeraCrypt, ...
La única diferencia entre su sistema y estas soluciones es que su sistema admite claves individuales para cada usuario, mientras que LUKS & Co solo usa una sola tecla Pero puede obtener casi el mismo comportamiento de LUKS creando un único contenedor por usuario. Aún tiene el problema de que si alguien obtiene acceso de root a la máquina, puede leer todos los contenedores abiertos.
Sin embargo, también puede hacerlo cuando cada archivo se cifra individualmente. Necesita una interfaz para su sistema que tome un usuario y un nombre de archivo, descifre el archivo sobre la marcha utilizando la clave de usuario, que se encuentra en la memoria, y devuelve el contenido del archivo descifrado. ¿Qué es lo que impide que la raíz use esta misma interfaz, haciéndose pasar por el usuario?
Básicamente, LUKS debajo de un sistema de archivos estándar proporciona la interfaz que tendría que diseñarse de otra manera. Solo veo dos soluciones que le darían más seguridad (pero no lo que imagina):
-
Use un TPM para proteger las claves de usuario. De esta manera, no se los robarán de la memoria, pero un usuario que tenga root aún podrá hacerse pasar por otro usuario y descifrar todos los archivos ordenando al TPM que descifre su contenido.
-
Coloque los datos cifrados y una API de acceso en una máquina dedicada que solo sirve a su aplicación y solo se puede acceder a ella utilizando la API de acceso. Esto crea una superficie de ataque mucho más pequeña en sus datos cifrados. Pero tampoco puede protegerlo de una cuenta raíz comprometida en su servidor de aplicaciones o en el servidor de almacenamiento.
Entonces, para resumir: creo que ya tienes lo que quieres con LUKS. No hay una línea de defensa segura contra la raíz comprometida.