web-dev-qa-db-ja.com

dm-integrityスタンドアロンマッパーデバイスが再起動後に失われる

現在、dm-integrityを使用してスタンドアロンモードで実行しようとしています。そのために、仮想ボックスVMにプレーンUbuntuサーバー20.04をインストールします。

次のステップでは、dm-integrityデバイス、ext4ファイルシステムを作成してマウントします。

integritysetup format /dev/sdb
integritysetup open /dev/sdb hdd-int
mkfs.ext4 /dev/mapper/hdd-int
mkdir /data
mount /dev/mapper/hdd-int /data
echo "/dev/mapper/hdd-int /data ext4 defaults 0 0" >> /etc/fstab

注:簡略化のため、/dev/sdbではなく/dev/disk/by-id/<ID>を使用します。

ここで再起動すると、デバイス/ dev/mapper/hdd-intが存在しないため、/dataへのマウントが失敗したことがわかります。

質問:dm-integrityデバイスの情報を永続的に永続化して、再起動後のマウントがすでに存在するようにするにはどうすればよいですか? /etc/fstabに行を作成しますか?または、別の構成ファイルはありますか?

4
schlagi123

免責事項:これは決して標準的な実装ではなく、実際に戦闘テストされていません。いつでも壊れる可能性があります。自己責任。バックアップを作成!!!

だから 私の理論的な答えに加えて 、これがUbuntu 20.04デスクトップの新規インストールでのスタンドアロンDM-Integrityの実装例です。ステップ1〜4はセットアップとインストールのプロセス、ステップ5〜8はカスタムudevルールとフックです。

成分:

  • gPTパーティションスキームを使用するドライブ(PARTLABELを提供するため。完全性にはUUIDがないため)
  • integrity-somenameラベルで識別される、DM-Integrityを使用する1つ以上のパーティション。
  • ラベル付きパーティションごとにDM-Integrityを設定するカスタムudevルール
  • integritysetupバイナリを含むカスタムinitramfsフック、および初期設定用のudevルール

段階的な実装:

1.パーティションを作成する

ここでの重要な点は、すべての整合性パーティションがパーティションラベルを取得することです。この例では、ルートintegrity-rootintegrity-homeパーティションにそれぞれ使用される//homeの1つです。 。

# parted /dev/vda
GNU Parted 3.3
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit mib                                                         
(parted) mklabel gpt
(parted) disk_set pmbr_boot on                                            
(parted) mkpart grub 1MiB 2MiB
(parted) set 1 bios_grub on
(parted) mkpart boot 2MiB 1024MiB
(parted) set 2 lvm on                                                     
(parted) mkpart integrity-root 1024MiB 10240MiB
(parted) set 3 lvm on                                                     
(parted) mkpart integrity-home 10240MiB 100%                              
(parted) set 4 lvm on                                                     
(parted) print free                                                       
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 19456MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: pmbr_boot

Number  Start     End       Size     File system  Name            Flags
        0.02MiB   1.00MiB   0.98MiB  Free Space
 1      1.00MiB   2.00MiB   1.00MiB               grub            bios_grub
 2      2.00MiB   1024MiB   1022MiB               boot            lvm
 3      1024MiB   10240MiB  9216MiB               integrity-root  lvm
 4      10240MiB  19455MiB  9215MiB               integrity-home  lvm
        19455MiB  19456MiB  0.98MiB  Free Space

(parted)                                                                  
Information: You may need to update /etc/fstab.

パーティションが/dev/disk/by-partlabelの下に表示されていることを確認します。

# ls -l /dev/disk/by-partlabel
total 0
lrwxrwxrwx 1 root root 10 May  2 17:52 boot -> ../../vda2
lrwxrwxrwx 1 root root 10 May  2 17:52 grub -> ../../vda1
lrwxrwxrwx 1 root root 10 May  2 17:52 integrity-home -> ../../vda4
lrwxrwxrwx 1 root root 10 May  2 17:52 integrity-root -> ../../vda3

2. Integrityをセットアップする

パーティションをセットアップしたら、実際にそれらを整合性デバイスに変換する必要があります。

# integritysetup format /dev/disk/by-partlabel/integrity-root 

WARNING!
========
This will overwrite data on /dev/disk/by-partlabel/integrity-root irrevocably.

Are you sure? (Type uppercase yes): YES
Formatted with tag size 4, internal integrity crc32c.
Wiping device to initialize integrity checksum.
You can interrupt this by pressing CTRL+c (rest of not wiped device will contain invalid checksum).
Finished, time 01:14.903, 9081 MiB written, speed 121.2 MiB/s

# integritysetup open /dev/disk/by-partlabel/integrity-root integrity-root

/dev/disk/by-partlabel/integrity-homeについても同様に繰り返し、/dev/mapperの下に存在することを確認します。

# ls -l /dev/mapper
total 0
crw------- 1 root root 10, 236 May  2  2020 control
lrwxrwxrwx 1 root root       7 May  2 18:07 integrity-home -> ../dm-1
lrwxrwxrwx 1 root root       7 May  2 18:07 integrity-root -> ../dm-0

この命名方式は技術的にLVMと競合するため、VG名としてintegrityを使用しないでください。

3.ファイルシステム、RAIDまたはLVM

整合性が整ったら、ファイルシステムを作成する必要もあります。それ以外の場合、Ubuntuインストーラーはこのミステリーデバイスの作成方法を認識せず、代わりにその上にパーティションテーブルを作成しようとします。

# mkfs.ext4 /dev/mapper/integrity-root
# mkfs.ext4 /dev/mapper/integrity-home

したがって、これがファイルシステムを整合性デバイスに配置するポイントです。

または、ここでRAIDまたはLVMを使用できます。 LUKSを使用することもできますが、LUKS2にIntegrityのサポートが既に組み込まれているのに、なぜそうするのでしょうか。ここでLUKSを選択した場合、誤ったチュートリアルに従っている可能性があります。

4. Ubuntuをインストールする

Ubuntuデスクトップインストーラーは、技術的には完全性をまったくサポートしていませんが、ファイルシステムを手動で設定するため、とにかくそれらを使用することができます。以下の手順を実行しないと起動できません。

  • [インストールの種類]ダイアログで、[何か他のもの]を選択します(手動パーティション設定の場合)。
  • "変更" integrity-rootをマウントポイント/
  • "変更" integrity-homeをマウントポイント/home

ブートローダーを忘れないでください! (完全性デバイスを使用することはできません)

  • 「変更」/dev/vda1を「予約済みBIOSブート領域」に変更
  • "変更" /dev/vda2をマウントポイント/boot
  • 他のパーティションはそのままにします(整合性デバイスをフォーマットしないでください)。

これは、UEFIセキュアブートセットアップでは完全に異なることに注意してください。簡単にするために、この例では古き良き古いBIOSのGRUBブートを使用しています。

最後に次のようになります。

Ubuntu installer Installation type showing integrity-root as /, integrity-home as /home, vda2 as /boot

「今すぐインストール」をクリックします。

続行すると、以下に示す変更がディスクに書き込まれます。それ以外の場合は、手動でさらに変更を加えることができます。

警告:これにより、削除したパーティションとフォーマットするパーティションのすべてのデータが破壊されます。

次のデバイスのパーティションテーブルが変更されます。

Virtual disk 1 (vda)

次のパーティションがフォーマットされます:

LVM VG integrity, LV home as ext4
LVM VG integrity, LV root as ext4
partition #2 of Virtual disk 1 (vda) as ext2

基本的にはインストーラーをだましてターゲットとして整合性デバイスを使用するため、LVM VG-LVコンスタレーションを誤って想定します。無視して続行してください。

ただし、再起動しないでください。まだ機能しません。

インストールの実行中に、ターミナルでlsblkを実行することにより、インストールがスムーズに行われていることを確認できます。

# lsblk
vda                252:0    0    19G  0 disk  
├─vda1             252:1    0     1M  0 part  
├─vda2             252:2    0  1022M  0 part  /target/boot
├─vda3             252:3    0     9G  0 part  
│ └─integrity-root 253:0    0   8.9G  0 crypt /target
└─vda4             252:4    0     9G  0 part  
  └─integrity-home 253:1    0   8.9G  0 crypt /target/home

lsblkでも完全性デバイスはまだサポートされていませんが、暗号化デバイスであると誤って想定しています。完全性のルートが/target、完全性のホームが/target/home/dev/vda2/target/bootであれば、すべてが適切な場所に移動します。

インストールが完了したら、「今すぐ再起動」ではなく「テストを続行」を選択します。

5. Chrootと完全性セットアップのインストール

UbuntuがスタンドアロンIntegrityパーティションのマウントを実際にサポートできるようにするには、フレッシュインストールにchrootし、カスタムudevルールとinitramfsフックを設定する必要があります。

# mount /dev/mapper/integrity-root /target
# mount /dev/mapper/integrity-home /target/home
# mount /dev/vda2 /target/boot
# mount --bind /dev /target/dev
# mount --bind /proc /target/proc
# mount --bind /run /target/run
# mount --bind /sys /target/sys
# chroot /target

現在、integritysetupはおそらくまだインストールされていません。 RAIDまたはLVMを使用した場合、これもmdadmlvmなどがインストールされていることを確認する必要がある場所です。

# apt-get install cryptsetup

6.カスタムudevルール

カスタムudevルールは/etc/udev/rules.dに入ります。参考までに、/dev/disk/by-partlabel/リンクを作成する標準ルールは次のようになります。

ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"

したがって、カスタムルールは次のようになります。

ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="integrity-?*", RUN+="/usr/sbin/integritysetup open $env{DEVNAME} $env{ID_PART_ENTRY_NAME}"

/etc/udev/rules.d/99-integrity.rulesとして保存します。

これにより、integrity-xyzパーティションラベルが付いたすべてのパーティションに対してudev run integersetupが開きます。これらの名前はシステム全体で一意である必要があるため、RAIDセットアップでは、各ドライブが異なるパーティションラベルを使用する必要があることに注意してください。

7.カスタムinitramfsフック(Ubuntu固有)

ルート/自体がIntegrityにない場合、udevルールmight自体はすでに正常に機能しています。標準のinitramfsは、完全性のないrootfsを正常にマウントする必要があります。この時点で、システム全体が他のすべての処理を引き継ぎます。

しかし、Integrityのrootfs自体では、initramfsを設定してセットアップする必要があります。そうしないと、rootfsをマウントできず、起動に失敗します。つまり、integritysetupバイナリとudevルール自体を追加します。

Ubuntuのinitramfs-toolsでは、これは カスタムフックスクリプト を作成することで実現できます。

#!/bin/sh
PREREQ=""
prereqs()
{
    echo "$PREREQ"
}

case $1 in
    prereqs)
        prereqs
        exit 0
        ;;
esac

. /usr/share/initramfs-tools/hook-functions

# Begin real processing below this line

force_load dm_integrity
copy_exec /usr/sbin/integritysetup /usr/sbin
copy_file text /etc/udev/rules.d/99-integrity.rules

/etc/initramfs-tools/hooks/integrityとして保存します。

8. initramfsを更新する

Initramfs構成に対するすべての変更と同様に、有効にするにはinitramfsを再構築する必要があります。

# update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-5.4.0-28-generic
cryptsetup: WARNING: target 'integrity-root' not found in /etc/crypttab
update-initramfs: Generating /boot/initrd.img-5.4.0-26-generic
cryptsetup: WARNING: target 'integrity-root' not found in /etc/crypttab

残念ながら、Ubuntuのデフォルトのcryptsetupフックは混乱しており、完全性デバイスをcryptsetupのものと間違えます。ありがたいことに、警告は無害であり、無視できます。

9.再起動

すべてがうまくいった場合、Live CDからインストールされたシステムに再起動した後、ターミナルでlsblkが次のように挨拶するはずです。

integrity@ubuntu $ lsblk
vda                252:0    0   19G  0 disk  
├─vda1             252:1    0    1M  0 part  
├─vda2             252:2    0 1022M  0 part  /boot
├─vda3             252:3    0    9G  0 part  
│ └─integrity-root 253:0    0  8,9G  0 crypt /
└─vda4             252:4    0    9G  0 part  
  └─integrity-home 253:1    0  8,9G  0 crypt /home

また、lsblkcryptデバイスと誤認するため、dmsetup tableをチェックして、それらが実際にintegrityデバイスであることを確認します。

integrity@ubuntu:~$ Sudo dmsetup table
[Sudo] password for integrity: 
integrity-root: 0 18598008 integrity 252:3 0 4 J 6 journal_sectors:130944 interleave_sectors:32768 buffer_sectors:128 journal_watermark:50 commit_time:10000 internal_hash:crc32c
integrity-home: 0 18595960 integrity 252:4 0 4 J 6 journal_sectors:130944 interleave_sectors:32768 buffer_sectors:128 journal_watermark:50 commit_time:10000 internal_hash:crc32c

これで完了です。スタンドアロンインテグリティで新しいLinuxシステムをお楽しみください!

(とにかく壊れるまで。自己責任でバックアップをとってください!!!)

2
frostschutz

残念ながら、今のところはかなり複雑です。スタンドアロンDM-Integrityはあまり広く採用されていないため、標準的な設定方法はありません。

独自に処理するには、独自のinitramfsフック/ systemdサービス/ initスクリプトを作成する必要があります 。また、ライブCD /レスキューシステムを起動するたびに、手動でセットアップする必要があります。

そのルートを使いたい場合は、追加の問題を考慮する必要があります。たとえば、バッキングデバイスにはUUIDがないため、識別できません。 PARTUUIDまたはPARTLABELを使用して回避できますが、それでも通常のUUIDよりも信頼性はかなり低くなります。

したがって、不可能ではありませんが、どういうわけか解決する必要のあるさまざまな問題がポップアップ表示されることを期待してください。

強い理由がない限り、現時点でDM-Integrityを使用する最も実用的な方法は、LUKS 2をオプションの整合性サポートを有効にして使用することです(cryptsetup luksFormat --integrity ...)。

cryptsetup/LUKSが広く採用されています。これは、バッキングデバイスを識別するために必要なUUIDを提供し、初期の起動段階は、ほぼすべての場所で既にサポートされています。他のLUKSデバイスと同じように、最初にセットアップするのではなく、機能させるために他に何もする必要はほとんどありません。

2
frostschutz