재부팅 후 dm-integrity 독립형 매퍼 장치가 손실됨

재부팅 후 dm-integrity 독립형 매퍼 장치가 손실됨

현재 dm-integrity를 ​​사용하여 독립형 모드로 실행하려고 합니다. 이를 위해 가상 머신에 기본 우분투 서버 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? 아니면 다른 구성 파일이 있습니까?

답변1

부인 성명:이는 표준 구현이 아니며 실제로 테스트되지도 않았습니다. 언제든지 깨질 수 있습니다. 자신의 책임하에 사용하십시오. 백업을 하세요! ! !

그래서내 이론적 답변 외에도이는 새로운 Ubuntu 20.04 데스크탑 설치에서 독립형 DM-Integrity를 ​​구현한 예입니다. 1~4단계는 설정 및 설치 프로세스이고, 5~8단계는 사용자 정의 udev 규칙 및 후크입니다.

원료:

  • GPT 파티션 구성표를 사용하는 드라이브( PARTLABEL무결성으로 인해 UUID를 제공하는 데 사용됨)
  • integrity-somename레이블로 식별되는 DM-Integrity를 ​​사용하는 하나 이상의 파티션 .
  • 표시된 각 파티션에 대해 DM-Integrity를 ​​설정하려면 udev 규칙을 사용자 정의하세요.
  • integritysetup초기 설정을 위해 바이너리 및 udev 규칙을 포함하도록 initramfs 후크를 사용자 정의하세요.

단계별 구현:

1. 파티션 생성

여기서 중요한 점은 각 무결성 파티션에 각각 루트 와 파티션 에 대한 파티션 레이블(이 경우 1 integrity-root과 1 ) 이 있다는 것입니다.integrity-home//home

# 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. 진실성을 확립하라

파티션을 설정한 후에는 실제로 파티션을 무결성 장치로 전환해야 합니다.

# 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과 충돌하므로 integrityVG 이름으로 사용하면 안 됩니다.

3. 파일 시스템, RAID 또는 LVM

무결성을 위해서는 파일 시스템도 생성해야 합니다. 그렇지 않으면 Ubuntu 설치 프로그램은 이 신비한 장치로 무엇을 해야 할지 모르고 대신 그 장치에 파티션 테이블을 만들려고 시도합니다.

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

따라서 이것이 파일 시스템이 무결성 장치에 배치되는 지점입니다.

또는 여기에서 RAID 또는 LVM을 사용할 수 있습니다. LUKS를 사용할 수도 있다고 생각합니다. 하지만 LUKS2에 이미 Integrity에 대한 지원이 내장되어 있는데 왜 그렇게 하시겠습니까? 여기서 LUKS를 선택하면 잘못된 튜토리얼을 따르고 있을 가능성이 높습니다.

4. 우분투 설치

기술적으로 Ubuntu 데스크탑 설치 프로그램은 무결성을 전혀 지원하지 않지만 파일 시스템을 수동으로 설정하므로 어쨌든 사용할 수 있습니다. 아래 추가 단계를 따르지 않으면 부팅되지 않습니다.

  • 설치 유형 대화 상자에서 기타(수동 파티셔닝의 경우)를 선택합니다.
  • integrity-root마운트 지점으로 "변경"/
  • integrity-home마운트 지점으로 "변경"/home

부트로더를 잊지 마세요! (무결성 장치는 사용할 수 없습니다)

  • "변경"을 /dev/vda1"BIOS 부팅 영역 유지"로 변경
  • /dev/vda2마운트 지점으로 "변경"/boot
  • 다른 파티션 유지(무결성 장치를 포맷하지 않음)

UEFI 보안 부팅 설정에서는 이는 완전히 다릅니다. 단순화를 위해 이 예제에서는 오래된 BIOS grub을 사용하여 부팅합니다.

결국 다음과 같아야 합니다.

Ubuntu 설치 프로그램의 설치 유형은 무결성 루트가 /, 무결성 홈이 /home, vda2가 /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가 실제로 독립적인 무결성 파티션 설치를 지원하려면 새로운 설치로 루트를 변경하고 사용자 정의 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

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.

이로 인해 udev는 파티션 레이블이 있는 모든 파티션에 대해 개방형 통합 설정을 실행하게 됩니다 integrity-xyz. 이러한 이름은 시스템 전체에서 고유해야 하므로 RAID 설정에서 각 드라이브에는 서로 다른 파티션 레이블이 필요합니다.

7. 사용자 정의 initramfs 후크(Ubuntu 전용)

udev 규칙 자체가능한/루트 자체가 무결성에 있지 않은 경우 이미 잘 작동합니다. 기준파일 시스템 초기화비무결성 rootfs는 훌륭하게 마운트되어야 하며, 이 시점에서 전체 시스템이 다른 모든 것을 처리하게 됩니다.

그러나 Integrity의 rootfs 자체에는 다음이 필요합니다.파일 시스템 초기화우리를 위해 설정해 주세요. 그렇지 않으면 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

장치 lsblk로 잘못 식별되었으므로 실제로 장치 인지 확인하십시오 .cryptdmsetup tableintegrity

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

안타깝게도 현재 상황은 상당히 복잡합니다. 독립형 DM-Integrity는 널리 채택되지 않았으므로 이를 설정하는 표준 방법이 없습니다.

직접 처리하려면 자체 initramfs 후크/systemd 서비스/init 스크립트를 만들어야 합니다.또한 Live CD/복구 시스템을 시작할 때마다 수동으로 설정해야 합니다.

그 길로 가고 싶다면 다른 문제를 고려해야 합니다. 예를 들어 지원되는 장치에는 UUID가 없으므로 인식되지 않습니다. PARTUUID 또는 PARTLABEL을 사용하여 이 문제를 해결할 수 있지만 이는 여전히 일반 UUID보다 훨씬 더 안정적입니다.

따라서 불가능하지는 않지만 어떤 방식으로든 해결해야 할 다양한 문제가 발생할 것으로 예상됩니다.

그렇게 하지 않을 특별한 이유가 없는 한 현재 DM-Integrity를 ​​사용하는 가장 실용적인 방법은 선택적 무결성 지원이 활성화된 LUKS 2( cryptsetup luksFormat --integrity ...) 를 사용하는 것입니다.

cryptsetup/LUKS가 널리 채택되었습니다. 지원되는 장치를 식별하는 데 필요한 UUID를 제공하며 초기 부팅 단계는 이미 거의 모든 곳에서 지원됩니다. 따라서 다른 LUKS 장치처럼 먼저 설정할 필요가 없으며 작동을 위해 다른 작업을 거의 수행할 필요가 없습니다.

관련 정보