버전 2.3.2의 cryptsetup을 포함하는 yocto 배포판을 개발 중입니다.
1GB RAM이 있는 마더보드에서 이러한 배포판을 실행하고 있는데 제대로 디버깅되지 않는 암호화된 파티션을 열려고 하면 "메모리 부족" 오류가 발생합니다. 어떤 아이디어가 있나요?
내 배포판은 3개의 파티션이 있는 mSD에서 실행됩니다. 세 번째(30MB)는 암호화되어 있습니다.
나는 사용했다ArchLinux 가이드에 설명된 단계ext4 대신 ext3을 사용하여 파티션 암호화
# cryptsetup -y -v luksFormat /dev/sda2
# cryptsetup open /dev/sda2 cryptroot
# mkfs.ext3 /dev/mapper/cryptroot
하지만 마더보드의 파티션을 열려고 하면 오류가 발생합니다.
cryptsetup --debug open /dev/mmcblk0p3 cryptroot
# cryptsetup 2.3.2 processing "cryptsetup --debug open /dev/mmcblk0p3 cryptroot"
# Running command open.
# Locking memory.
# Installing SIGINT/SIGTERM handler.
# Unblocking interruption on signal.
# Allocating context for crypt device /dev/mmcblk0p3.
# Trying to open and read device /dev/mmcblk0p3 with direct-io.
# Initialising device-mapper backend library.
# Trying to load any crypt type from device /dev/mmcblk0p3.
# Crypto backend (OpenSSL 1.1.1k 25 Mar 2021) initialized in cryptsetup library version 2.3.2.
# Detected kernel Linux 4.1.35-rt41 ppc.
# Loading LUKS2 header (repair disabled).
# Acquiring read lock for device /dev/mmcblk0p3.
# Opening lock resource file /run/cryptsetup/L_179:3
# Verifying lock handle for /dev/mmcblk0p3.
# Device /dev/mmcblk0p3 READ lock taken.
# Trying to read primary LUKS2 header at offset 0x0.
# Opening locked device /dev/mmcblk0p3
# Veryfing locked device handle (bdev)
# LUKS2 header version 2 of size 16384 bytes, checksum sha256.
# Checksum:43e122216ab19330fdfb6d2f9d7b586c4e5189884aef24be884e7159228e9ee5 (on-disk)
# Checksum:43e122216ab19330fdfb6d2f9d7b586c4e5189884aef24be884e7159228e9ee5 (in-memory)
# Trying to read secondary LUKS2 header at offset 0x4000.
# Reusing open ro fd on device /dev/mmcblk0p3
# LUKS2 header version 2 of size 16384 bytes, checksum sha256.
# Checksum:4ed9a44c22fde04c4b59a638c20eba6da3a13e591a6a1cfe7e0fec4437dc14cc (on-disk)
# Checksum:4ed9a44c22fde04c4b59a638c20eba6da3a13e591a6a1cfe7e0fec4437dc14cc (in-memory)
# Device size 32505856, offset 16777216.
# Device /dev/mmcblk0p3 READ lock released.
# Only 1 active CPUs detected, PBKDF threads decreased from 4 to 1.
# Not enough physical memory detected, PBKDF max memory decreased from 1048576kB to 255596kB.
# PBKDF argon2i, time_ms 2000 (iterations 0), max_memory_kb 255596, parallel_threads 1.
# Activating volume cryptroot using token -1.
# Interactive passphrase entry requested.
Enter passphrase for /dev/mmcblk0p3:
# Activating volume cryptroot [keyslot -1] using passphrase.
device-mapper: ioctl: 4.31.0-ioctl (2015-3-12) initialised: [email protected]
# dm version [ opencount flush ] [16384] (*1)
# dm versions [ opencount flush ] [16384] (*1)
# Detected dm-ioctl version 4.31.0.
# Device-mapper backend running with UDEV support enabled.
# dm status cryptroot [ opencount noflush ] [16384] (*1)
# Keyslot 0 priority 1 != 2 (required), skipped.
# Trying to open LUKS2 keyslot 0.
# Keyslot 0 (luks2) open failed with -12.
Not enough available memory to open a keyslot.
# Releasing crypt device /dev/mmcblk0p3 context.
# Releasing device-mapper backend.
# Closing read only fd for /dev/mmcblk0p3.
# Unlocking memory.
Command failed with code -3 (out of memory).
답변1
LUKS2 목적아르곤2i키 파생 기능은 메모리 하드입니다. 즉, GPU를 사용한 무차별 공격을 방지(또는 적어도 더 어렵게 만들기)하려면 장치를 여는 데 많은 메모리가 필요합니다. 장치를 여는 데 필요한 메모리 양을 확인할 수 있습니다. 아래 줄을 cryptsetup luksDump /dev/sda2
찾으세요 .Memory: 755294
Keyslots
장치를 생성할 때 cryptsetup
사용 가능한 메모리 양을 확인하고 이에 따라 여는 데 필요한 메모리 양을 조정하십시오. 그러나 LUKS 장치를 다른 컴퓨터에서 생성하는 경우(예: 데스크탑에서 SD 카드를 포맷하는 경우 등) 또는 동일한 장치에서도 가능합니다. 머신에 더 많은 메모리가 있습니다. 현재 메모리가 부족할 수 있습니다. 이 경우 스왑을 사용하지 않고 RAM에 대해서만 이야기하고 있습니다.
--pbkdf pbkdf2
추가 메모리를 사용하지 않는 "이전"(LUKS1의 기본값) 키 파생 함수 PBKDF2로 전환 하려면 LUKS 장치를 다시 만드는 것이 좋습니다 . 또는 --pbkdf-memory <num>
기본 Argon2i 메모리 양을 강제로 줄이는 방법을 사용할 수 있습니다 .
답변2
Vojtech Trefny는 Argon2i가 너무 많은 메모리를 필요로 하기 때문에 이런 일이 발생한다고 설명했습니다. 실제로,man cryptsetup
:
PBKDF2의 경우 시간 비용(반복 횟수)만 적용됩니다. Argon2i/id의 경우 메모리 비용(키 파생 프로세스 중에 필요한 메모리)과 병렬성 비용(키 파생 프로세스 중에 병렬로 실행되는 스레드 수)도 있습니다.
그러나 충분한 메모리 1 가 있는 하드웨어에 액세스할 수 있는 한 장치를 다시 만드는 것은 과도할 수 있습니다.
대신 메모리가 충분한 컴퓨터를 사용하여 다음 명령을 사용하여 암호화 장치에 키를 추가하면 됩니다 pbkdf2
.
cryptsetup luksAddKey -S 1 --pbkdf pbkdf2 /dev/sdxy
키 슬롯 1이 비어 있다고 가정합니다( 를 확인하여 비어 있는 키 슬롯을 찾을 수 있음 cryptsetup luksDump /dev/sdxy
).
그런 다음 성능이 낮은 컴퓨터에서 다음 명령을 사용하여 장치 잠금을 해제합니다.
cryptsetup luksOpen -S 1 /dev/sdxy name
이는 -S 1
필수입니다. 그렇지 않으면 더 비싼 키를 사용해도 OOM 킬러가 계속 실행될 수 있습니다.
1: 최소한의 셸 및 핵심 유틸리티(Debian ISO가 이를 대신해 줍니다)를 사용하여 부팅 가능한 USB를 항상 유지할 수 있으며 대부분의 컴퓨터에서 USB를 부팅하고 암호화된 볼륨에 액세스할 수 있다는 것을 기억하십시오.
답변3
가장 중요한 답변 외에도 여기에 넣고 싶습니다. 메모리가 더 많은 컴퓨터를 사용하면 다음과 같은 방법으로 기존 키에 대한 메모리 요구 사항을 줄일 수 있습니다. 메모리 요구 사항은 KB 단위입니다. 이는 디스크에 이미 데이터가 있는 경우 유용합니다.
cryptsetup luksConvertKey --key-file /path/to/keyfile --pbkdf-memory=10240 /dev/<device>
답변4
최근에 구입한 VPS를 암호화하려고 할 때 동일한 문제가 발생했습니다. 실제로 제 경우에는 # cryptsetup luksFormat /dev/<Partition>
솔브를 실행할 때 동일한 "메모리 부족"이 발생하여 다음과 같이 파티션 테이블을 다시 생성했습니다 | /dev/sda1 ( EXT4, BOOT ) | /dev/sda2 ( LUKS, ROOT and SWAP ) | /dev/sda3 ( SWAP ) |
.
LUKS 파티션을 생성할 때 일부 구성을 변경하는 방법이 있을 수 있지만 조금이라도 보안이 덜해질 수 있습니다.
생성된 디스크 파티션 테이블
파티션 테이블 | /dev/sda1 | /dev/sda2 | /dev/sda3 |
---|---|---|---|
GPT | 시작하다 | 운이 좋은 | 교환 |
좌심실 용적 | 해당 없음 | 스왑/루트 | 해당 없음 |
그래서 SWAP을 켰습니다 /dev/sda3
( #swapon /dev/sda3
). 그런 다음 성공 명령을 실행합니다 cryptsetup luksFormat /dev/sda2
.
LUKS 내부에서 SWAP을 생성한 다음 EXT4/ROOT를 생성하기로 결정했습니다. 처음에는 SWAP 뒤에 넣으려고 했는데 /dev/sda2
LUKS를 삭제하고 확장한 뒤 SWAP을 LUKS 파티션 끝으로 옮긴 뒤 ROOT 파티션을 늘려야 했습니다. LUKS 시작 부분에 SWAP을 넣고 루트 파티션만 추가했습니다.
이제부터 교체하지 않으면 OOM을 얻을 수 없다는 것을 이해합니다. 행운을 만들려면 바꿔야 할 것 같아요.
시스템을 구성했으며 다음 단계는 남겨진 여유 공간을 제거 /dev/sda3
하고 확장하는 것입니다 . LVM 파티션을 추가합니다 ./dev/sda2
/dev/sda3
root