在适用于 Linux 1 或 2 的 Windows 子系统中的 Ubuntu Server 18.04 LTS 上加载 dm-crypt

AnH*_*ann 4 dm-crypt windows-subsystem-for-linux ubuntu-18.04

我在 Windows 10 系统上使用适用于 Linux 的 Windows 子系统 (WSL1),并尝试从 USB 设备中删除所有数据,并按照本教程使用伪随机数覆盖它(仅在德语中找到,但对这个问题并不重要) ),但无法加载所需的内核模块。

当尝试加载 dm-crypt 我得到

$ 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
Run Code Online (Sandbox Code Playgroud)

我假设我的 Ubuntu 版本只是缺少模块 dm-crypt。

现在我的问题是: WSL 是否一般支持内核子系统 dm-crypt?

我在 64 位 Ubuntu 18.04 LTS 上使用 WSL1。

更新:
我再次尝试使用 WSL2 和 Ubuntu 18.04 LTS 但得到相同的错误消息:

$ 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
Run Code Online (Sandbox Code Playgroud)

Joh*_*der 6

我不能保证 WSL1,但似乎 WSL2 支持它,因为它运行完整的 Linux 内核。事实上,我刚刚尝试加载 dm-crypt 模块并成功了。

已加载 dm-crypt 模块

您必须先启用 WSL2。在撰写本文时,它仅适用于 Windows Insiders:https : //docs.microsoft.com/en-us/windows/wsl/wsl2-install

然后你必须编译你自己的自定义内核以获得 dm-crypt 支持:https : //github.com/microsoft/WSL2-Linux-Kernel/blob/master/README-Microsoft.WSL2

安装 git 和一些编译器:

$ sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses5-dev git
Run Code Online (Sandbox Code Playgroud)

克隆 Microsoft WSL2 内核:

$ git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
$ cd WSL2-Linux-Kernel
Run Code Online (Sandbox Code Playgroud)

您必须选择加密功能。我使用了菜单:

$ export KCONFIG_CONFIG=Microsoft/config-wsl
$ make menuconfig
Run Code Online (Sandbox Code Playgroud)
[*] 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 
Run Code Online (Sandbox Code Playgroud)

以及你想要的任何算法......

[*] 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
Run Code Online (Sandbox Code Playgroud)

对于您想要执行的操作,您必须在“ Cryptographic API ”下选择“ XTS Support ”。

保存您的配置,然后编译内核:

$ sudo make && make modules_install
Run Code Online (Sandbox Code Playgroud)

然后将新图像复制到您的 Windows 主机。我的图像文件名为 bzImage:

$ cp arch/x86_64/boot/bzImage /mnt/c/Users/your-user-name/
Run Code Online (Sandbox Code Playgroud)

在 Windows 主机的“Users\your-user-name”文件夹中创建一个名为“.wslconfig”的文件(注意前面的点 .)。我用的是记事本++。将以下几行放入其中:

[wsl2]
kernel=C:\\Users\\your-user-name\\bzImage
swap=0
localhostForwarding=true
Run Code Online (Sandbox Code Playgroud)

退出您的 WSL2 实例,并重新启动您的 WSL2 实例(使用 Powershell):

> wsl --shutdown
Run Code Online (Sandbox Code Playgroud)

再次打开 WSL2 bash 会话并尝试加载 dm-crypt 模块:

$ sudo modprobe -v dm_crypt

insmod /lib/modules/4.19.81-microsoft-standard/kernel/drivers/md/dm-crypt.ko
Run Code Online (Sandbox Code Playgroud)

更新1:

关于块设备的访问,嗯……在撰写本文时,微软似乎仍在努力:https : //github.com/Microsoft/WSL/issues/689

希望有帮助:)

更新 2:

您可以通过 USB/IP 或 iSCSI 协议将主机的 USB 驱动器提供给 WSL2,从而绕过 WSL2 上的块设备限制。我尝试过 USP/IP,但由于我的 USB 设备被归类为“集线器”,因此我遇到了很多麻烦。所以我通过在我的 Windows 主机上创建一个 iSCSI 目标来尝试 iSCSI 方法,然后从我的 WSL2 实例连接到它。

我使用了 TalAloni 的 github 存储库上的“iSCSIConsole”应用程序:https : //github.com/TalAloni/iSCSIConsole创建目标。

您必须以管理员权限运行它才能连接物理磁盘,例如 USB 驱动器。您可能还必须允许它通过 Windows 主机防火墙才能使其与 WSL2 实例进行通信。我用默认的 iSCSI 目标名称“iqn.1991-05.com.microsoft:target1”连接了我的 USB 拇指驱动器。

添加 iSCSI 目标

选择物理磁盘

运行后,您可以从 WSL2 实例连接到它。

首先,您必须确保为自定义 WSL2 内核加载了 iSCSI 驱动程序模块。我在内核配置菜单中启用了它,然后重新编译:

$ KCONFIG_CONFIG=Microsoft/config-wsl make menuconfig
Run Code Online (Sandbox Code Playgroud)
[*] 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     
Run Code Online (Sandbox Code Playgroud)
$ sudo make && make modules_install
Run Code Online (Sandbox Code Playgroud)

安装新内核和模块后,加载 iSCSI 模块:

$ sudo modprobe libiscsi
$ sudo modprobe scsi_transport_iscsi
$ sudo modprobe iscsi_tcp
$ sudo modprobe libiscsi_tcp
Run Code Online (Sandbox Code Playgroud)

然后我在我的 WSL2 实例上设置了一个客户端/启动器。我们将使用 open-iscsi,但它需要 systemd,并且默认情况下 WSL2 上未启用 systemd。但这很容易做到。这是一个关于如何做到这一点的简短指南:https : //forum.snapcraft.io/t/running-snaps-on-wsl2-insiders-only-for-now/13033。您可以跳过捕捉部分。

然后安装 open-iscsi:

$ sudo apt install open-iscsi
Run Code Online (Sandbox Code Playgroud)

编辑“/etc/iscsi/iscsid.conf”并将“node.startup”更改为“automatic”。 将其设置为自动会导致您的 WSL 会话在您下次重新启动时非常缓慢地启动,因为您的“主机”IP 发生了变化并且将无法重新连接。

启动 iSCSI 启动器:

$ sudo /etc/init.d/open-iscsi start
Run Code Online (Sandbox Code Playgroud)

然后连接到目标并列出存储设备:

$ 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
Run Code Online (Sandbox Code Playgroud)

现在我们可以连接:

$ 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.
Run Code Online (Sandbox Code Playgroud)

我的 USB 驱动器随后被列为/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
Run Code Online (Sandbox Code Playgroud)

现在您可以进行驱动器加密...

$ 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%
...
Run Code Online (Sandbox Code Playgroud)