現在、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
に行を作成しますか?または、別の構成ファイルはありますか?
免責事項:これは決して標準的な実装ではなく、実際に戦闘テストされていません。いつでも壊れる可能性があります。自己責任。バックアップを作成!!!
だから 私の理論的な答えに加えて 、これがUbuntu 20.04デスクトップの新規インストールでのスタンドアロンDM-Integrityの実装例です。ステップ1〜4はセットアップとインストールのプロセス、ステップ5〜8はカスタムudevルールとフックです。
成分:
PARTLABEL
を提供するため。完全性にはUUIDがないため)integrity-somename
ラベルで識別される、DM-Integrityを使用する1つ以上のパーティション。integritysetup
バイナリを含むカスタムinitramfsフック、および初期設定用のudevルール段階的な実装:
ここでの重要な点は、すべての整合性パーティションがパーティションラベルを取得することです。この例では、ルートintegrity-root
とintegrity-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
パーティションをセットアップしたら、実際にそれらを整合性デバイスに変換する必要があります。
# 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
を使用しないでください。
整合性が整ったら、ファイルシステムを作成する必要もあります。それ以外の場合、Ubuntuインストーラーはこのミステリーデバイスの作成方法を認識せず、代わりにその上にパーティションテーブルを作成しようとします。
# mkfs.ext4 /dev/mapper/integrity-root
# mkfs.ext4 /dev/mapper/integrity-home
したがって、これがファイルシステムを整合性デバイスに配置するポイントです。
または、ここでRAIDまたはLVMを使用できます。 LUKSを使用することもできますが、LUKS2にIntegrityのサポートが既に組み込まれているのに、なぜそうするのでしょうか。ここでLUKSを選択した場合、誤ったチュートリアルに従っている可能性があります。
Ubuntuデスクトップインストーラーは、技術的には完全性をまったくサポートしていませんが、ファイルシステムを手動で設定するため、とにかくそれらを使用することができます。以下の手順を実行しないと起動できません。
integrity-root
をマウントポイント/
にintegrity-home
をマウントポイント/home
にブートローダーを忘れないでください! (完全性デバイスを使用することはできません)
/dev/vda1
を「予約済みBIOSブート領域」に変更/dev/vda2
をマウントポイント/boot
にこれは、UEFIセキュアブートセットアップでは完全に異なることに注意してください。簡単にするために、この例では古き良き古いBIOSのGRUBブートを使用しています。
最後に次のようになります。
「今すぐインストール」をクリックします。
続行すると、以下に示す変更がディスクに書き込まれます。それ以外の場合は、手動でさらに変更を加えることができます。
警告:これにより、削除したパーティションとフォーマットするパーティションのすべてのデータが破壊されます。
次のデバイスのパーティションテーブルが変更されます。
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
であれば、すべてが適切な場所に移動します。
インストールが完了したら、「今すぐ再起動」ではなく「テストを続行」を選択します。
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を使用した場合、これもmdadm
、lvm
などがインストールされていることを確認する必要がある場所です。
# apt-get install cryptsetup
カスタム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セットアップでは、各ドライブが異なるパーティションラベルを使用する必要があることに注意してください。
ルート/
自体が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
として保存します。
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のものと間違えます。ありがたいことに、警告は無害であり、無視できます。
すべてがうまくいった場合、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
また、lsblk
はcrypt
デバイスと誤認するため、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システムをお楽しみください!
(とにかく壊れるまで。自己責任でバックアップをとってください!!!)
残念ながら、今のところはかなり複雑です。スタンドアロンDM-Integrityはあまり広く採用されていないため、標準的な設定方法はありません。
独自に処理するには、独自のinitramfsフック/ systemdサービス/ initスクリプトを作成する必要があります 。また、ライブCD /レスキューシステムを起動するたびに、手動でセットアップする必要があります。
そのルートを使いたい場合は、追加の問題を考慮する必要があります。たとえば、バッキングデバイスにはUUIDがないため、識別できません。 PARTUUIDまたはPARTLABELを使用して回避できますが、それでも通常のUUIDよりも信頼性はかなり低くなります。
したがって、不可能ではありませんが、どういうわけか解決する必要のあるさまざまな問題がポップアップ表示されることを期待してください。
強い理由がない限り、現時点でDM-Integrityを使用する最も実用的な方法は、LUKS 2をオプションの整合性サポートを有効にして使用することです(cryptsetup luksFormat --integrity ...
)。
cryptsetup/LUKSが広く採用されています。これは、バッキングデバイスを識別するために必要なUUIDを提供し、初期の起動段階は、ほぼすべての場所で既にサポートされています。他のLUKSデバイスと同じように、最初にセットアップするのではなく、機能させるために他に何もする必要はほとんどありません。