Almacenamiento masivo USB a nivel de archivo

El Desafío: Tengo un dispositivo de mano Linux, que registra datos y los almacena en el disco. Debería intercambiar estos datos con una aplicación de Windows a través de USB. Cuando el usuario puede acceder a estos datos, por ejemplo, a través de un dispositivo de almacenamiento masivo USB, es necesario cifrarlos. Debería funcionar de inmediato, con una variedad de sistemas operativos, también para sesiones de terminal citrix, etc.

El Plan: Creo un sistema de archivos en el espacio de usuario con FUSIBLEy ofrecerlo a Windows a través de almacenamiento masivo. Siempre que Windows accede a un archivo, recibo una devolución de llamada y cifro los datos sobre la marcha. Además, podemos tener contenido dinámico; por ejemplo, cuando se escribe una contraseña en un archivo, se muestra más contenido.

El problema: Cuando se utiliza el dispositivo de almacenamiento masivo (p. Ej. g_file_storage) solo acepta archivos o dispositivos de bloque, pero no sistemas de archivos (directorios). ¿Por qué?

[...] proporciona una interfaz simple para leer y escribir sectores de datos, muy similar a la interfaz de bajo nivel utilizada para acceder a cualquier disco duro [...]. Los sistemas operativos pueden tratar la unidad USB como un disco duro y pueden formatearla con cualquier sistema de archivos que deseen. (de Wikipedia)

Por lo tanto, no hay posibilidad de tener un sistema de archivos dinámico a través del almacenamiento masivo ... y esta parece ser la razón por la que mi teléfono móvil Android desmonta todos los datos del teléfono cuando lo conecto a la PC.

Opciones:

  • Crear un 'dispositivo de bloque en el espacio de usuario'- similar a FUSE (necesito un controlador FAT inverso, cuando quiero ofrecer archivos dinámicamente)
  • Implementar mi propio servidor nbd para crear un dispositivo de bloque (¿también necesita un controlador FAT inverso?)
  • Guardo archivos cifrados en una partición y paso esta partición al dispositivo de almacenamiento masivo (el problema sería el rendimiento y la falta de interacción dinámica)
  • No ofrezca un dispositivo de almacenamiento masivo y tenga cuidado con otras ideas (eth over USB)

Por el momento, solo la última opción parece ser realista, ¿o tienes otro consejo para mí?

¡Agradecería!

Charly

preguntado el 16 de mayo de 11 a las 20:05

Probablemente no sea útil, pero de todos modos: ¿cuál es el punto de cifrar la conexión USB cuando los datos están en el dispositivo (presumiblemente) sin cifrar de todos modos? ¿No sería más seguro guardar los datos encriptados, entonces tampoco tendría que preocuparse por hacerlo sobre la marcha? -

Es un problema de rendimiento y es más fácil para el desarrollo cuando se pueden leer los archivos ASCII. Por supuesto, con un gran esfuerzo también puede romper el dispositivo y obtener los datos de allí. -

4 Respuestas

El protocolo de almacenamiento masivo USB es un protocolo de dispositivo de bloque; no opera a nivel de archivos o directorios. El host de Windows espera ver un sistema de archivos VFAT sin procesar expuesto por el controlador g_mass_storage, y realizará escrituras y lecturas en los metadatos VFAT según corresponda para averiguar cómo están estructurados los directorios.

Debido a esto, no es trivial exponer un sistema de archivos FUSE al host de Windows. Tendría que emular VFAT, asignando bloques en el sistema de archivos virtual a los metadatos y a los datos, y dado que el host de Windows es libre de almacenar en caché cualquier dato o metadato que lea, una vez que asigna algunos metadatos o datos, no puede cambiar (por lo que cambia a sus datos FUSE no se pudieron reflejar en el sistema de archivos de Windows). El host de Windows también puede retrasar y reordenar las escrituras tanto en metadatos como en datos; todo es un verdadero desastre si intenta emular.

Ahora, hay algunas cosas que puede hacer:

  1. Puede escribir un controlador IFS personalizado en el lado de Windows para interactuar con su dispositivo Linux a través de un protocolo personalizado que funciona a nivel de archivo / directorio.
  2. Puede tratar el dispositivo USB como un puerto Ethernet virtual y hablar CIFS al host de Windows
  3. De alguna manera, puede crear un diseño VFAT estático en el momento de la conexión para exponerlo al host de Windows; Los datos aún no descifrables pueden devolver errores de E / S para evitar que el host de Windows almacene en caché datos cifrados sin procesar.
  4. Puede simplemente cifrar un dispositivo de bloque sin procesar utilizando dm-crypt y exponer este dispositivo de bloque completo (cifrado como un solo fragmento) a Windows.
  5. Podrías implementar un MTP artilugio.

Estos enfoques vienen con sus propios problemas:

  1. Requiere que se instale un controlador de Windows y que esté firmado por Microsoft, etc. No se puede utilizar en una máquina sin acceso administrativo para instalar el controlador.
  2. No se reproducirá automáticamente; el usuario tendría que navegar a través del navegador de red para acceder a los archivos. La configuración del cortafuegos puede interferir. Puede tener una sobrecarga significativa.
  3. Muy complejo. Manejar las actualizaciones de metadatos en el backend puede ser extremadamente difícil. Los eventos sorpresa de desconexión pueden ser devastadores. El comportamiento de Windows al recibir un error de E / S puede ser un problema si el usuario intenta acceder a un archivo bloqueado.
  4. No hay cifrado a nivel de archivo disponible, pero por lo demás debería funcionar bien.
  5. No estoy seguro de cuánto soporte tiene MTP para archivos no multimedia; el soporte no está tan extendido como el soporte de almacenamiento masivo.

contestado el 17 de mayo de 11 a las 00:05

Hmmm ... muchas gracias, pero eso es lo que temía. Lo mejor del almacenamiento masivo sería que no necesita un controlador personalizado, no necesita ninguna configuración (dirección eth, puerta de enlace, etc.), no necesita un protocolo personalizado ... y está funcionando en todas partes. Con 1) ya tuvimos malas experiencias: libusb es una especie de error. 2) parece tener desventajas similares al uso de la red real. 3) Tal vez nunca sea estable 5) No estoy seguro de si está funcionando en todas las variantes de Windows de manera aceptable. - Charly

Puede interesarle saber que Android, que anteriormente se expuso como un dispositivo de almacenamiento masivo USB al host, en cambio actúa como un dispositivo MTP (a partir de Honeycomb).

Dicho esto, alguien ya ha implementado su opción 1, aunque con el "dispositivo" y el "host" un poco invertidos. QEMU tiene un loco hack llamado vvfat que es capaz de crear un dispositivo de bloque falso que para la VM parece que contiene un sistema de archivos VFAT solo desde un directorio / árbol de archivos en el host. Requiere un escaneo recursivo completo antes de comenzar, depende de los detalles de cómo los sistemas operativos escriben en los sistemas de archivos y se cae si cambia de forma independiente cualquier archivo mientras está en uso, pero (de alguna manera) logra (a veces) funcionar.

contestado el 17 de mayo de 11 a las 06:05

Puede ser posible traducir el protocolo NBD a USB y "bit-bang" usb para que aparezca en el host USB como un dispositivo de almacenamiento masivo USB.

  • El almacenamiento NBD y USB msas son dispositivos de nivel de bloque, por lo que es posible traducir un protocolo a otro. Sin embargo, es casi seguro que eso requiera programación, ya que no creo que esto exista. Sin embargo, http://travisgoodspeed.blogspot.com/2012/07/emulating-usb-devices-with-python.html parece bastante útil para el lado USB, y https://bitbucket.org/hirofuchi/xnbd/wiki/Home debería darle un buen ejemplo para el lado del cliente NBD.
  • El uso de VFAT significa que Windows puede verlo como una unidad de disco USB normal, sin controladores.
    • como sugirió otro póster, el módulo vvfat de qemu podría usarse para automatizar algo de esto.
  • El cifrado del tráfico requeriría tunelizar el tráfico NBD a través de SSH u OpenVPN.

La configuración final se vería así:

+---------------------------------+                +------------------+
| data collection device          |                | client device    |
| +----------------+              |                |                  |
| | collected data |              |                |  SSH -> NBD      |
| | -> linux fs    |              |                |         client   |
| +--+-------------+--------+     |                |         |        |
| -> | qemu vvfat           | SSH +-{some network}-+         V        |--> client PC
|    | run NBD inside the VM|     |                | USB Mass Storage |    USB port 
+----+----------------------+-----+                +------------------+   

respondido 06 nov., 12:18

Mirando las opciones, consideraría usar el dispositivo ethernet y hacer la autoconfiguración de IP en el dispositivo, luego ejecutar Samba para exportar el sistema de archivos al host de Windows. Esto le daría el nivel de control que necesita.

contestado el 17 de mayo de 11 a las 01:05

Sí, pero la desventaja es que el usuario todavía tiene que configurar el montaje, por ejemplo, eligiendo el recurso compartido de red en el administrador de red. Un almacenamiento masivo sería mucho más fácil de manejar, desde el lado del usuario. - Charly

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.