열기: cryptsetup 메모리 부족("키 슬롯을 열 수 있는 메모리가 부족합니다.")

열기: cryptsetup 메모리 부족("키 슬롯을 열 수 있는 메모리가 부족합니다.")

버전 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: 755294Keyslots

장치를 생성할 때 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/sda2LUKS를 삭제하고 확장한 뒤 SWAP을 LUKS 파티션 끝으로 옮긴 뒤 ROOT 파티션을 늘려야 했습니다. LUKS 시작 부분에 SWAP을 넣고 루트 파티션만 추가했습니다.

이제부터 교체하지 않으면 OOM을 얻을 수 없다는 것을 이해합니다. 행운을 만들려면 바꿔야 할 것 같아요.

시스템을 구성했으며 다음 단계는 남겨진 여유 공간을 제거 /dev/sda3하고 확장하는 것입니다 . LVM 파티션을 추가합니다 ./dev/sda2/dev/sda3root

관련 정보