Cargue dm-crypt en Ubuntu Server 18.04 LTS en el subsistema de Windows para Linux 1 o 2

Cargue dm-crypt en Ubuntu Server 18.04 LTS en el subsistema de Windows para Linux 1 o 2

Estoy usando el Subsistema de Windows para Linux (WSL1) en mi sistema Windows 10 e intenté eliminartododatos de un dispositivo USB y sobrescribirlos con números pseudoaleatorios siguiendoeste tutorial(Lo encontré solo en alemán, pero no es realmente importante para esta pregunta), pero no pude cargar un módulo del kernel necesario.

Al intentar cargar dm-crypt me sale

$ sudo modprobe dm-crypt
modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.0-18362-Microsoft/modules.dep.bin'
modprobe: FATAL: Module dm-crypt not found in directory /lib/modules/4.4.0-18362-Microsoft

Supongo que a mi versión de Ubuntu simplemente le falta el módulo dm-crypt.

Ahora mi pregunta:¿WSL es compatible con el subsistema del kernel dm-crypt en general?

Estoy usando WSL1 con Ubuntu 18.04 LTS de 64 bits.

Actualizar:
Intenté nuevamente con WSL2 y Ubuntu 18.04 LTS pero recibí el mismo mensaje de error:

$ sudo modprobe dm-crypt
modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.0-19013-Microsoft/modules.dep.bin'
modprobe: FATAL: Module dm-crypt not found in directory /lib/modules/4.4.0-19013-Microsoft

Respuesta1

No puedo responder por WSL1, pero parece que WSL2 lo admite ya que ejecuta el kernel de Linux completo. De hecho, acabo de intentar cargar el módulo dm-crypt y lo logré.

módulo dm-crypt cargado

Primero tendrás que habilitar WSL2. Al momento de escribir este artículo, solo está disponible para Windows Insiders:https://docs.microsoft.com/en-us/windows/wsl/wsl2-install

Luego tendrás que compilar tu propio kernel personalizado para obtener soporte para dm-crypt:https://github.com/microsoft/WSL2-Linux-Kernel/blob/master/README-Microsoft.WSL2

Instale git y algunos compiladores:

$ sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses5-dev git

Clona el kernel de Microsoft WSL2:

$ git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
$ cd WSL2-Linux-Kernel

Tendrás que seleccionar las funciones criptográficas. Usé el menú:

$ export KCONFIG_CONFIG=Microsoft/config-wsl
$ make menuconfig
[*] Enable loadable module support

Device Drivers --->
[*] Multiple devices driver support (RAID and LVM) --->
    <*> Device mapper support
    <M>   Crypt target support    

General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

Device Drivers --->
    [*] Block Devices ---> 
        <*> Loopback device support 

File systems ---> 
     <*> FUSE (Filesystem in Userspace) support 

Y cualquier algoritmo que quieras...

[*] Cryptographic API ---> 
    <*> XTS support
    <*> SHA224 and SHA256 digest algorithm
    <*> AES cipher algorithms
    <*> AES cipher algorithms (x86_64)
    <*> User-space interface for hash algorithms
    <*> User-space interface for symmetric key cipher algorithms
    <*> RIPEMD-160 digest algorithm 
    <*> SHA384 and SHA512 digest algorithms 
    <*> Whirlpool digest algorithms 
    <*> LRW support 
    <*> Serpent cipher algorithm 
    <*> Twofish cipher algorithm

Para lo que quieres hacer, tendrás que seleccionar "Soporte XTS" bajo "API criptográfica".

Guarde su configuración y luego compile el kernel:

$ sudo make && make modules_install

Luego copie la nueva imagen a su host de Windows. Mi archivo de imagen se llamaba bzImage:

$ cp arch/x86_64/boot/bzImage /mnt/c/Users/your-user-name/

Cree un archivo en la carpeta "Usuarios\su-nombre de usuario" de su host de Windows llamado ".wslconfig" (tenga en cuenta el punto . al frente). Usé el Bloc de notas++. Ponga las siguientes líneas en él:

[wsl2]
kernel=C:\\Users\\your-user-name\\bzImage
swap=0
localhostForwarding=true

Salga de su instancia WSL2 y reiníciela (use Powershell):

> wsl --shutdown

Abra su sesión bash WSL2 nuevamente e intente cargar el módulo dm-crypt:

$ sudo modprobe -v dm_crypt

insmod /lib/modules/4.19.81-microsoft-standard/kernel/drivers/md/dm-crypt.ko

ACTUALIZACIÓN 1:

En cuanto al acceso a dispositivos de bloqueo, bueno... al momento de escribir este artículo, parece que Microsoft todavía está trabajando en ello:https://github.com/Microsoft/WSL/issues/689

Espero que ayude :)

ACTUALIZACIÓN 2:

Puede evitar la limitación de dispositivos de bloqueo en WSL2 sirviendo la unidad USB de su host a WSL2 a través del protocolo USB/IP o iSCSI. Probé USP/IP, pero tuve muchos problemas ya que mi dispositivo USB estaba clasificado como "hub". Así que probé el método iSCSI creando un destino iSCSI en mi host de Windows y luego me conecté a él desde mi instancia WSL2.

Utilicé la aplicación "iSCSIConsole" en el repositorio github de TalAloni:https://github.com/TalAloni/iSCSIConsolepara crear el objetivo.

Tendrás que ejecutarlo con privilegios de administrador para poder conectar un disco físico, como una unidad USB. También es posible que deba permitirlo a través del firewall del host de Windows para que se comunique con la instancia WSL2. Adjunté mi memoria USB con el nombre de destino iSCSI predeterminado de "iqn.1991-05.com.microsoft:target1".

Agregar un destino iSCSI

Seleccionar un disco físico

Una vez que lo haya ejecutado, podrá conectarse a él desde su instancia WSL2.

Primero, debe asegurarse de tener cargados los módulos del controlador iSCSI para su kernel WSL2 personalizado. Lo habilité en el menú de configuración del kernel y luego lo volví a compilar:

$ KCONFIG_CONFIG=Microsoft/config-wsl make menuconfig
[*] Networking support  --->
   Networking options  --->
      [*] TCP/IP networking 

Device Drivers  --->
  SCSI device support  --->
     <*> SCSI device support --->
     <*> SCSI disk support
     <*> SCSI generic support
     SCSI Transports --->
       <M> iSCSI Transport Attributes
     [*] SCSI low-level drivers  --->
       <M> iSCSI Initiator over TCP/IP     
$ sudo make && make modules_install

Una vez que tenga su nuevo kernel y módulos instalados, cargue los módulos iscsi:

$ sudo modprobe libiscsi
$ sudo modprobe scsi_transport_iscsi
$ sudo modprobe iscsi_tcp
$ sudo modprobe libiscsi_tcp

Luego configuro un cliente/iniciador en mi instancia WSL2. Usaremos open-iscsi, pero requiere systemd y systemd no está habilitado en WSL2 de forma predeterminada. Pero es muy fácil de hacer. Aquí hay una guía muy breve sobre cómo hacerlo:https://forum.snapcraft.io/t/running-snaps-on-wsl2-insiders-only-for-now/13033. Puedes saltarte las partes a presión.

Luego instale open-iscsi:

$ sudo apt install open-iscsi

Edite "/etc/iscsi/iscsid.conf" y cambie "node.startup" a "automático". Configurarlo en automático hará que sus sesiones WSL se inicien muy lentamente la próxima vez que reinicie, ya que su IP de "host" cambia y no podrá volver a conectarse.

Inicie el iniciador iscsi:

$ sudo /etc/init.d/open-iscsi start

Luego conéctese al objetivo y enumere los dispositivos de almacenamiento:

$ export WSLHOSTIP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
$ sudo iscsiadm -m discovery -t st -p $WSLHOSTIP

172.26.240.1:3260,-1 iqn.1991-05.com.microsoft:target1

$ sudo iscsiadm -m node

172.26.240.1:3260,-1 iqn.1991-05.com.microsoft:target1

Ahora podemos conectarnos:

$ sudo iscsiadm -m node --targetname "iqn.1991-05.com.microsoft:target1" --portal "$WSLHOSTIP:3260" --login

Logging in to [iface: default, target: iqn.1991-05.com.microsoft:target1, portal: 172.26.240.1,3260] (multiple)
Login to [iface: default, target: iqn.1991-05.com.microsoft:target1, portal: 172.26.240.1,3260] successful.

Mi unidad USB apareció entonces como/dev/sdb.

$ ls /dev/sd*

/dev/sda  /dev/sdb

$ sudo fdisk -l /dev/sdb

Disk /dev/sdb: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3958509f

Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1  *     2048 62914559 62912512  30G  b W95 FAT32

Ahora puedes cifrar tu unidad...

$ sudo modprobe dm_crypt
$ sudo cryptsetup -d /dev/urandom -c aes-xts-plain create delete /dev/sdb  && shred -vzn 0 /dev/mapper/delete && sync && sleep 4 && cryptsetup remove delete

shred: /dev/mapper/delete: pass 1/1 (000000)...
shred: /dev/mapper/delete: pass 1/1 (000000)...32MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...62MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...90MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...108MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...137MiB/30GiB 0%
shred: /dev/mapper/delete: pass 1/1 (000000)...149MiB/30GiB 0%
...

información relacionada