
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é.
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".
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%
...