Windows Subsystem for Linux 1 または 2 の Ubuntu Server 18.04 LTS に dm-crypt をロードする

Windows Subsystem for Linux 1 または 2 の Ubuntu Server 18.04 LTS に dm-crypt をロードする

私はWindows 10システムでWindows Subsystem for Linux(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

私の 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

答え1

WSL1 については保証できませんが、WSL2 は完全な Linux カーネルを実行しているため、WSL1 をサポートしているようです。実際、dm-crypt モジュールをロードしようとしたところ、成功しました。

dm-cryptモジュールがロードされました

まず WSL2 を有効にする必要があります。この記事の執筆時点では、Windows Insider のみが利用できます。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

Microsoft WSL2 カーネルをクローンします。

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

暗号化機能を選択する必要があります。私は次のメニューを使用しました:

$ 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 

そして、どんなアルゴリズムでも...

[*] 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

何をしたいのかに応じて、「XTS サポート" 下 "暗号化API「」。

設定を保存してカーネルをコンパイルします。

$ sudo make && make modules_install

次に、新しいイメージを Windows ホストにコピーします。私のイメージ ファイルは bzImage と呼ばれていました。

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

Windows ホストの「Users\your-user-name」フォルダーに「.wslconfig」というファイルを作成します (先頭のドット . に注意してください)。私は Notepad++ を使用しました。次の行を記入します。

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

WSL2 インスタンスを終了し、WSL2 インスタンスを再起動します (Powershell を使用)。

> wsl --shutdown

WSL2 bash セッションを再度開き、dm-crypt モジュールをロードしてみます。

$ sudo modprobe -v dm_crypt

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

更新1:

ブロック デバイスへのアクセスに関しては、この記事の執筆時点では、Microsoft がまだ取り組んでいるようです。https://github.com/Microsoft/WSL/issues/689

お役に立てれば幸いです :)

更新2:

WSL2 のブロック デバイス制限を回避するには、USB/IP または iSCSI プロトコルを介してホストの USB ドライブを WSL2 に提供します。USP/IP を試しましたが、USB デバイスが「ハブ」として分類されていたため、非常に問題が発生しました。そこで、Windows ホストに iSCSI ターゲットを作成し、WSL2 インスタンスからそれに接続するという iSCSI 方式を試しました。

私は、TalAloni の github リポジトリにある「iSCSIConsole」アプリケーションを使用しました。https://github.com/TalAloni/iSCSIコンソールターゲットを作成します。

USB ドライブなどの物理ディスクを接続するには、管理者権限で実行する必要があります。また、WSL2 インスタンスと通信するには、Windows ホスト ファイアウォールの通過を許可する必要がある場合もあります。私は、デフォルトの iSCSI ターゲット名「iqn.1991-05.com.microsoft:target1」を使用して USB サム ドライブを接続しました。

iSCSIターゲットの追加

物理ディスクの選択

実行したら、WSL2 インスタンスから接続できます。

まず、カスタム WSL2 カーネル用の iSCSI ドライバー モジュールがロードされていることを確認する必要があります。カーネル構成メニューでこれを有効にしてから、再コンパイルしました。

$ 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

新しいカーネルとモジュールをインストールしたら、iscsi モジュールをロードします。

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

次に、WSL2 インスタンスにクライアント/イニシエーターをセットアップします。open-iscsi を使用しますが、systemd が必要です。systemd は WSL2 ではデフォルトで有効になっていません。しかし、これは非常に簡単に実行できます。以下に、その方法についての非常に短いガイドを示します。https://forum.snapcraft.io/t/running-snaps-on-wsl2-insiders-only-for-now/13033スナップ部分は省略できます。

次に、open-iscsi をインストールします。

$ sudo apt install open-iscsi

「/etc/iscsi/iscsid.conf」を編集し、「node.startup」を「automatic」に変更します。 自動に設定すると、「ホスト」IP が変更されて再接続できなくなるため、次回再起動時に WSL セッションの起動が非常に遅くなります。

iscsi イニシエーターを起動します。

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

次に、ターゲットに接続し、ストレージ デバイスを一覧表示します。

$ 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

これで接続できます:

$ 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.

私の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

これでドライブの暗号化が可能になります...

$ 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%
...

関連情報