내 이동식 장치에는 암호화된 데이터가 포함된 파티션이 포함되어 있고 임의의 데이터와 구별할 수 있는 다른 항목이 없는 설정이 있습니다. 물리적으로 분리된 장치에는 GPG 암호화 키를 사용하여 장치를 켜거나 끄는 스크립트 쌍이 있습니다.
open.sh
#!/bin/bash
# The crypt UUID is hard-coded. That way it will not try to decrypt the wrong
# device.
cryptuuid='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
# The UUID of the decrypted device is hard-coded. This is currently how the
# script knows what to mount after decrypting.
deviceuuid='yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
# The encrypted key bits are fed to cryptsetup with specific parameters to
# decrypt the crypt.
gpg2 --decrypt <<- END | sudo cryptsetup --offset 0 --cipher aes-xts-plain64 --key-size 256 --hash sha256 --key-file - open --type plain "/dev/disk/by-partuuid/$cryptuuid" Secrets
-----BEGIN PGP MESSAGE-----
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzz
-----END PGP MESSAGE-----
END
# A small delay is necessary to give time for the decrypted device to show up.
sleep 1
# Mount the decrypted device as if the user did it using the GUI.
gvfs-mount -d $(readlink -f $(blkid -U "$deviceuuid"))
닫기.sh
#!/bin/bash
# The UUID of the decrypted device is hard-coded. This is currently how the
# script knows what unmount.
deviceuuid='yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
# Find all processes using the decrypted device and issue a “friendly” kill
# signal.
sudo lsof -t $(findmnt -rn -S UUID="$deviceuuid" -o TARGET) | while read process; do kill -HUP $process; done
# Try to unmount the decrypted device and then close it with cryptsetup. findmnt
# identifies the path which the device is mounted. lsblk finds the decrypted
# device (minus “/dev/” from the UUID). dmsetup finds the decrypted device name
# given the block device name from before.
gvfs-mount -u $(findmnt -rn -S UUID="$deviceuuid" -o TARGET) && sudo cryptsetup close $(sudo dmsetup info --columns --noheadings --options Name --select BlkDevName=$(lsblk --raw --noheadings --output KNAME,UUID | awk '{if ($2=="'"$deviceuuid"'") { print $1}}'))
이러한 스크립트는 작동하지만 이상적으로는 암호화된 파티션에 대해 내장된 GUI 지원을 최대한 활용하여 터미널 사용을 줄이고 싶습니다.
이 목표에 더 가까워지기 위해 LVM(Logical Volume Manager)의 JBOD 기능을 살펴보았습니다. 아이디어는 파일 관리자에 표시되는 LUKS 파티션을 가지면서 암호화된 데이터가 임의의 데이터와 구별되지 않도록 LUKS 헤더를 암호화된 데이터에서 멀리 유지하는 것입니다.
이를 달성하기 위해 저는 두 권의 책을 사용했습니다.
- 하나의 문서제목.img(정확히 2,139,648바이트)
- 물리적 장치/dev/sdx
제목.img전체 LUKS 헤더를 수용할 수 있을 만큼 큰 LVM PV를 호스팅하는 GPT 파티션이 포함되어 있습니다./dev/sdx암호화된 데이터가 포함된 LVM PV를 호스팅하는 GPT 파티션이 포함되어 있습니다.
다음 단계를 사용하여 생성됩니다.
fallocate -l 2139648 header.img
첫 번째 PV를 저장할 이미지를 만듭니다.- 이미지를 마운트하고 그 안의 PV에 대해 4,112 섹터의 GPT 파티션(GUID: xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)을 생성했습니다.
sudo pvcreate --labelsector 0 --metadatatype 2 --pvmetadatacopies 1 --metadatasize 32768b --dataalignment 512b /dev/disk/by-partuuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
헤더의 물리 볼륨을 생성합니다.- 다음과 같은 장치의 경우/dev/sdx) 암호화된 데이터를 저장하려는 곳에 필요한 파티션 정렬을 결정하고 LVM 헤더 시작 부분에 섹터를 추가합니다. SSD 드라이브가 섹터 65536에서 시작하는 파티션으로 사전 포맷된 경우 해당 파티션을 삭제하고 섹터 65535에서 시작하는 파티션을 생성하십시오. 이렇게 하면 파일 시스템이 여전히 최적으로 정렬된 상태로 유지됩니다.
sudo pvcreate --labelsector 0 --pvmetadatacopies 0 --metadatasize 0b --dataalignment 512b '/dev/disk/by-partuuid/yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
LVM 헤더만 포함하고 메타데이터는 포함하지 않는 물리 볼륨을 생성합니다.vgcreate --metadatacopies unmanaged --physicalextentsize 512b Secrets '/dev/disk/by-partuuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' '/dev/disk/by-partuuid/yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
이 두 개의 물리적 볼륨 위에 볼륨 그룹을 생성합니다.lvcreate --contiguous n --extents 100%FREE Secrets --name Crypt
볼륨 그룹에서 사용 가능한 모든 공간을 차지하는 논리 볼륨을 생성합니다.- 이제 제가 겪고 있는 특별한 문제는 논리 볼륨에 데이터를 쓰면 항상 가장 큰 물리 볼륨에 먼저 기록된다는 것입니다. LUKS 헤더가 2개의 물리적 볼륨 중 더 작은 볼륨에 기록되기를 원하기 때문에 이는 좋지 않습니다. 볼륨 그룹의 데이터를 물리 볼륨의 순서를 변경할 수 있는 텍스트 파일로 내보내 문제를 해결했습니다
vgcfgbackup -f metadata.txt Secrets
. - 생성된 텍스트 파일을 편집하는 것은 매우 간단합니다. 해당 섹션 아래에는 다음 과
logical_volumes
같은 이름의 세그먼트 2개가 있어야 합니다 . 각 항목 아래의 합계 값을 편집해야 합니다 . 및가 있어야 하며 더 큰 물리적 볼륨과 동일해야 합니다. 이 볼륨은 리소스 섹션에서 찾을 수 있습니다. 너segment1
segment2
start_extent
extent_count
segment1
start_extent = 0
extent_count = 4040
segment2
start_extent = 4040
extent_count
pe_count
physical_volumes
가능한교체pv0
및pv1
둘러싸기가 필요하지만 볼륨 정의를 다시 확인하여 합리적인지 확인하세요. vgcfgrestore -f metadata.txt Secrets
변경 사항이 볼륨 그룹에 적용됩니다.cryptsetup --verbose --cipher aes-xts-plain64 --key-size 512 --hash sha512 --align-payload 1 luksFormat /dev/Secrets/Crypt
LUKS 암호화 볼륨을 생성합니다.- 새 볼륨을 열고 필요한 작업을 수행합니다.
- 꺼내기: 암호화된 볼륨의 모든 파일 시스템을 마운트 해제하고 닫은 후 를 실행합니다
vgchange -an Secrets
. 그런 다음 물리 볼륨을 분리 및/또는 꺼낼 수 있습니다.
언제/dev/sdx삽입하고제목.img디스크 유틸리티를 사용하여 설치할 때 클릭하면 볼륨 잠금을 해제하기 위한 암호를 묻는 아이콘이 실행 프로그램에 나타납니다. 논리 볼륨이 등록되지 않은 임의의 경우를 제외하고는 모든 단계에 터미널이 필요하지 않습니다. 그런 다음 실행vgscan --mknodes
그리고udevadm trigger
딸꾹질 문제를 해결하는 것 같습니다.
문제는 볼륨을 마운트 해제할 때 루프 장치를 제거하고 암호화된 저장소를 꺼내기 전에 터미널을 사용하여 LVM 볼륨 그룹(VG)을 비활성화해야 한다는 것입니다. 저장 매체를 물리적으로 제거해도 볼륨 그룹이 사라지는 것 같지 않으며 루프 장치가 마운트 해제되지 않습니다.
장치 제거 문제를 해결하는 것은 괜찮지만, 이렇게 설정을 만들고 유지하는 것만으로는 일이 너무 복잡해지는 것 같습니다.
현재 사용하기 쉬운 다단계 전체 디스크 암호화를 지원하는 Linux 배포판이 있습니까?