web-dev-qa-db-ja.com

Linux 1または2のWindowsサブシステムでUbuntu Server 18.04 LTSにdm-cryptをロードする

Windows 10システムでLinux用のWindowsサブシステム(WSL1)を使用していて、USBデバイスからallデータを削除し、次の疑似乱数で上書きしようとしました thisチュートリアル (ドイツ語でのみ見つかりましたが、この質問ではそれほど重要ではありません)が、必要なカーネルモジュールをロードできませんでした。

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とUbuntu18.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
2
AnHeuermann

WSL1を保証することはできませんが、完全なLinuxカーネルを実行しているため、WSL2は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

MicrosoftWSL2カーネルのクローンを作成します。

$ 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

やりたいことは、「Cryptographic API」の下の「XTS Support」を選択する必要があります。

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

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

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

TalAloniのgithubリポジトリで「iSCSIConsole」アプリケーションを使用しました: https://github.com/TalAloni/iSCSIConsole ターゲットを作成しました。

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

iSCSIターゲットの追加

物理ディスクの選択

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

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

$ export 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/130 。スナップパーツはスキップできます。

次に、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%
...
2