암호화를 제거하려고 할 때 Cryptsetup/LUKS가 내 데이터를 손상시켰습니다. 왜?

암호화를 제거하려고 할 때 Cryptsetup/LUKS가 내 데이터를 손상시켰습니다. 왜?

암호화를 제거하려고 할 때 Cryptsetup/LUKS2가 내 데이터를 손상시켰습니다. 이유는 무엇입니까?

저는 Cryptsetup 2.3.3을 사용하고 있습니다. 저는 LUKS(다행히도 가상 머신에서)를 시험해보고 있으며 LUKS2 암호화 파티션에 ext4 파일 시스템을 가지고 있습니다. 저는 실행 중인 블록 장치에서 암호화를 비파괴적으로 제거하는 LUKS의 기능을 테스트하기로 결정했고, cryptsetup reencrypt --decrypt헤더에 전달해야 하는 오류를 받았습니다. 분리된 헤더를 사용하지 않기 때문에 장치에서 헤더를 읽을 수 있도록 장치를 전달합니다. 암호 해독에서는 "표준" 경고가 표시됩니다.

WARNING!
========
Unable to decide if device /tmp/file is activated or not.
Are you sure you want to proceed with reencryption in offline mode?
It may lead to data corruption if the device is actually activated.
To run reencryption in online mode, use --active-name parameter instead.

그런 다음 오류가 보고되지 않고 암호 해독이 진행됩니다. 그러면 데이터가 손실됩니다.

처음에 ext4로 파티션을 포맷한 것처럼 이전 LUKS2 장치 내부의 ext4 시스템이 운영 체제에 표시될 것으로 예상했습니다. 그러나 blkid파티션은 여전히 TYPE="crypto_LUKS"​​. 그런데 비밀번호 입력 후 오류가 발생했습니다.

Keyslot open failed.
No usable keyslot is available.

그리고 luksDumps활성 키 홈이 표시되지 않습니다.

cryptsetup이 내 데이터를 파괴하는 이유는 무엇입니까?

답변1

cryptsetupLUKS2 장치의 암호 해독은 제대로 문서화되어 있지 않으며 데이터 손상에 도움이 될 수 있는 몇 가지 매우 잘못된 설계 선택이 포함되어 있습니다.

OP에 설명된 질문의 경우 문제는 cryptsetup분리된 헤더를 사용한다고 가정하지만 명시적으로 어디에도 명시되어 있지 않다는 것입니다. 이러한 실수를 방지하기 위한 기본적인 온전성 검사는 포함되어 있지 않으며 해당 테스트에서는 이 경우를 다루지 않습니다.

확인해보면,시험이를 위해 모두 분리된 헤더로 생성된 장치를 사용합니다. 명령이 오프라인 암호 해독을 허용하더라도 온라인 암호 해독만 테스트하는 것 같습니다.

분리된 헤더가 있는 LUKS2 장치에서 암호 해독을 테스트했는데 작동합니다. 암호 해독 후 파티션이 ext4 파일 시스템으로 포맷된 것으로 감지되었습니다.

cryptsetup이 장치에 이미 헤더가 있는지 확인하고 최소한 이 상황을 사용자에게 경고하는 것은 간단한 일입니다. 오프라인에서는 암호화된 블록 장치도 매개변수로 전달되었는지 쉽게 판단하고 --header이를 정상적으로 처리하거나 진행을 거부할 수 있습니다. 하지만 둘 다 그렇지 않습니다.

암호 해독(오프라인 모드에서만 가능)은 LUKS1에서 작동하지만 이를 위해서는 (그 자체로 혼란스럽기 때문에) 사용하지 않고 cryptsetup reencrypt --decrypt대신 이라는 별도의 명령을 사용해야 합니다 cryptsetup-reencrypt. 이 명령은 기본적으로 LUKS1을 지원하지만 LUKS2는 지원하지 않습니다. 설상가상으로 적어도 Fedora에서는 이 명령이 의 일부로 패키지되지 않고 기본적으로 설치되지 않는 cryptsetup별도의 패키지로 패키지되어 있습니다.cryptsetup-reencrypt

간단히 말해서:

  • 2.3.3부터 LUKS2 드라이브는 분리된 헤더를 사용하지 않는 한 직접 복호화할 수 없습니다. 헤더가 있는 장치를 인수로 전달하면 --header오류가 발생하지 않으며 cryptsetup은 자동으로 데이터를 삭제합니다.
  • luks2에서 luks1로 변환한 다음 별도의 cryptsetup-reencrypt명령을 사용하여 암호를 해독할 수 있습니다. 아직 테스트하지는 않았지만 작동할 것입니다.

이 문제를 업스트림으로 보고하려고 시도했지만 gitlab은 익명으로 등록하려는 사용자를 차단합니다.

관련 정보