LUKS2 vs LUKS1: 차이점, 확인 방법, 변환 방법
LUKS2는 LUKS1에 비해 Argon2id, 중복 JSON 헤더, 토큰, 무결성 기능을 추가합니다. cryptsetup luksDump로 버전을 확인하고, 헤더를 백업한 뒤 안전하게 변환하세요.
짧은 답변: LUKS2는 Linux 디스크 암호화의 현재 온디스크 형식이며 cryptsetup 2.1부터 기본값입니다. LUKS1과 비교해 체크섬이 있는 중복 JSON 메타데이터 헤더, PBKDF2 대신 메모리 집약적인 Argon2id 키 유도, 8개 대신 32개의 키슬롯, TPM2·FIDO2 잠금 해제를 위한 토큰, 선택적 인증 암호화를 추가합니다. 오래된 GRUB이 직접 `/boot`를 복호화해야 하는 경우가 아니라면 LUKS2를 사용하세요.
두 형식 모두 데이터는 같은 방식(보통 AES-XTS)으로 암호화합니다. 다른 것은 헤더입니다. 키를 저장하는 방식, 패스프레이즈를 무차별 대입하기가 얼마나 어려운지, 어떤 도구가 읽을 수 있는지가 다릅니다. 이 가이드는 차이점, 어떤 형식을 쓰고 있는지 확인하는 방법, 그리고 디스크를 잃지 않고 `cryptsetup convert`로 변환하는 방법을 다룹니다. 소형 VPS의 셀프호스팅 스택을 위해 새 서버를 암호화한다면 LUKS2를 선택하세요.
LUKS2 vs LUKS1 한눈에 보기
| 기능 | LUKS1 | LUKS2 |
|---|---|---|
| 헤더 | 단일 592바이트 바이너리 헤더 + 키슬롯 영역 | 바이너리 헤더 2개 + 체크섬이 있는 JSON 메타데이터, 중복 사본 포함 |
| 기본 헤더 / 데이터 오프셋 | 2 MiB | 16 MiB |
| 키슬롯 | 8 | 32 |
| 키 유도(PBKDF) | PBKDF2만 | Argon2id(기본), Argon2i 또는 PBKDF2 |
| 토큰(TPM2, FIDO2, PKCS#11, Clevis) | 없음 | 있음 |
| 인증 암호화(dm-integrity) | 없음 | 선택 사항, 실험적 |
| 온라인 재암호화 | 오프라인만 | 가능, 마운트된 장치에서 `cryptsetup reencrypt` |
| 영구 플래그와 레이블 | 없음 | 있음, 예: `--allow-discards --persistent` |
| 암호화된 /boot의 GRUB 잠금 해제 | 가능 | 업스트림 GRUB에서는 PBKDF2 키슬롯만 |
헤더 형식과 키슬롯
LUKS1 헤더는 고정된 바이너리 구조 뒤에 8개의 키슬롯 영역이 이어집니다. 실수로 실행한 `mkfs`나 파티션 도구 등으로 장치의 첫 섹터가 덮어써지면 모든 키슬롯이 사라지고, 헤더 백업이 없다면 데이터를 잃게 됩니다.
LUKS2는 바이너리 헤더와 JSON 메타데이터 영역을 저장하고 둘 다 두 번째 사본을 유지합니다. 각 사본에는 체크섬이 있어 `cryptsetup`이 손상을 감지하고 다른 사본으로 대체할 수 있습니다. JSON 영역은 키슬롯, 세그먼트, 다이제스트, 토큰을 기술하며, 덕분에 형식을 다시 바꾸지 않고도 새 기능을 추가할 수 있습니다. 그래도 중복성이 헤더 백업을 대체하지는 않습니다. 첫 몇 메가바이트를 완전히 덮어쓰면 두 사본이 모두 파괴됩니다.
Argon2id vs PBKDF2
패스프레이즈는 절대 키로 직접 사용되지 않습니다. 키 유도 함수가 패스프레이즈를 늘려 각 추측에 비용이 들게 만듭니다. LUKS1은 GPU와 ASIC에서 저렴하게 실행되는 PBKDF2만 사용할 수 있으므로, 헤더를 복사한 공격자는 패스프레이즈를 고속으로 병렬 테스트할 수 있습니다.
LUKS2의 기본값은 Argon2id로, 추측마다 설정 가능한 양의 메모리(기본 최대 1 GiB, 포맷 시점의 가용 RAM으로 제한)가 필요하고 병렬화 비용이 훨씬 큽니다. 강력한 패스프레이즈가 여전히 주된 방어책이지만, Argon2id는 각 추측의 비용을 크게 높입니다.
소형 서버에서는 메모리 비용에 유의하세요. RAM이 많은 머신에서 만든 키슬롯은 NoctisNode Wisp 요금제 같은 1 GB VPS가 initramfs 안에서 감당할 수 있는 것보다 많은 메모리를 잠금 해제에 요구할 수 있습니다. 큰 머신에서 작은 머신용으로 포맷하거나 키를 추가할 때는 `--pbkdf-memory`(KiB 단위)로 명시적으로 설정하세요.
# Inspect PBKDF parameters of each keyslot
cryptsetup luksDump /dev/vda3 | grep -A6 '^ [0-9]*: luks2'
# Re-derive keyslot 0 with Argon2id and 512 MiB memory cost
cryptsetup luksConvertKey /dev/vda3 --key-slot 0 \
--pbkdf argon2id --pbkdf-memory 524288토큰, 무결성, GRUB 관련 주의 사항
토큰은 LUKS2 헤더 안의 JSON 객체로, 도구에 키를 자동으로 얻는 방법을 알려 줍니다. `systemd-cryptenroll`은 토큰을 이용해 키슬롯을 TPM2 칩, FIDO2 보안 키, PKCS#11 스마트카드에 바인딩하고, Clevis는 Tang 서버를 이용한 네트워크 바인딩 잠금 해제에 사용합니다. LUKS1에는 이 중 어느 것도 없습니다.
무결성 모드(`cryptsetup luksFormat --integrity hmac-sha256`)는 암호화와 dm-integrity를 결합해, 변조된 섹터가 조용히 변경된 데이터 대신 읽기 오류를 내게 합니다. 디스크 공간과 쓰기 속도를 희생하고, 포맷 시 전체 초기화가 필요하며, 아직 실험적 기능으로 표시되어 있습니다. 대부분의 서버는 사용하지 않습니다.
사람들이 아직 LUKS1을 마주치는 주된 이유는 GRUB입니다. 업스트림 GRUB 2.06 이상은 LUKS2를 열 수 있지만, Argon2 지원이 업스트림 GRUB에 포함되지 않아 PBKDF2를 사용하는 키슬롯만 가능합니다. GRUB이 직접 암호화된 `/boot`를 복호화해야 한다면 LUKS1이나 `--pbkdf pbkdf2` 키슬롯을 가진 LUKS2를 사용하세요. Debian과 Ubuntu 설치 프로그램은 `/boot`를 암호화하지 않으므로 커널과 initramfs가 잠금 해제를 담당하며, SSH를 통한 원격 잠금 해제를 포함해 Argon2id가 작동합니다.
볼륨이 LUKS1인지 LUKS2인지 확인하는 방법
실행 중인 시스템에서 root로 다음 중 어느 것이든 사용할 수 있습니다. `cryptsetup luksDump`의 `Version:` 줄이 확실한 답이며, 덤프에는 키슬롯, PBKDF 유형, 토큰도 표시됩니다.
# Find encrypted partitions (FSVER column shows 1 or 2)
lsblk -f
# Authoritative: header version
cryptsetup luksDump /dev/vda3 | grep -E '^Version'
# Version: 2
# Exit code 0 only if the device is LUKS2
cryptsetup isLuks --type luks2 /dev/vda3 && echo LUKS2cryptsetup convert로 변환하기
`cryptsetup convert`는 헤더를 제자리에서 다시 쓰며, 암호화된 데이터는 건드리지 않습니다. 장치가 닫혀 있어야 하므로 루트 파일 시스템이라면 복구 시스템이나 라이브 시스템에서 실행합니다. 변환 도중의 실패나 전원 차단은 헤더를 사용할 수 없게 만들 수 있으므로 백업 단계는 선택 사항이 아닙니다.
- 01.복구 시스템이나 라이브 시스템으로 부팅하고 LUKS 장치가 열려 있지 않은지 확인하세요(필요하면 `cryptsetup close`).
- 02.`cryptsetup luksHeaderBackup`으로 헤더를 백업하고 파일을 서버 밖으로 복사하세요. 이 파일과 이전 패스프레이즈를 가진 사람은 누구나 디스크를 잠금 해제할 수 있으므로 암호화해서 보관하세요.
- 03.`cryptsetup convert --type luks2`로 LUKS1을 LUKS2로 변환하세요. 기존 키슬롯은 PBKDF2로 남습니다.
- 04.GRUB이 읽어야 하는 경우가 아니라면 `cryptsetup luksConvertKey --pbkdf argon2id`로 각 키슬롯을 Argon2id로 업그레이드하세요.
- 05.장치가 열리는지 테스트한 다음 `update-initramfs -u`로 initramfs를 재생성하고 재부팅하세요.
- 06.LUKS2에서 LUKS1로 되돌리려면 먼저 모든 키슬롯을 PBKDF2로 변환하고 토큰과 LUKS2 전용 기능을 제거하세요. 그렇지 않으면 `cryptsetup convert --type luks1`이 거부합니다.
# From a rescue system, device closed
cryptsetup luksHeaderBackup /dev/vda3 --header-backup-file /root/vda3-luks-header.img
cryptsetup convert --type luks2 /dev/vda3
cryptsetup luksConvertKey /dev/vda3 --key-slot 0 --pbkdf argon2id
cryptsetup open /dev/vda3 cryptroot && cryptsetup close cryptroot
# Emergency restore (overwrites the current header!)
# cryptsetup luksHeaderRestore /dev/vda3 --header-backup-file /root/vda3-luks-header.imgNote · 헤더를 복원하면 백업 시점에 유효했던 패스프레이즈가 다시 작동하며, 나중에 제거한 것도 포함됩니다. 패스프레이즈를 교체할 때는 이전 헤더 백업을 삭제하세요. 현재 백업은 restic 백업 가이드에서 설명하는 저장소처럼 별도의 장소에 보관하세요.
FAQ
QLUKS2가 LUKS1보다 나은가요?
A거의 모든 새 구성에서 그렇습니다. LUKS2에는 중복 헤더, Argon2id 키 유도, TPM2나 FIDO2용 토큰, 온라인 재암호화가 있습니다. LUKS1은 오래된 GRUB이 직접 `/boot`를 복호화해야 할 때만 필요합니다.
QLUKS 버전은 어떻게 확인하나요?
Aroot로 `cryptsetup luksDump /dev/sdX | grep Version`을 실행하면 1 또는 2가 출력됩니다. `lsblk -f`도 crypto_LUKS 파티션의 FSVER 열에 버전을 표시합니다.
Q데이터 손실 없이 LUKS1을 LUKS2로 변환할 수 있나요?
A네. `cryptsetup convert --type luks2`는 장치가 닫힌 상태에서 헤더만 다시 씁니다. 변환이 중단되면 볼륨을 읽을 수 없게 될 수 있으므로 먼저 `cryptsetup luksHeaderBackup`으로 헤더를 백업하세요.
QGRUB은 LUKS2를 지원하나요?
A업스트림 GRUB 2.06 이상은 LUKS2를 잠금 해제할 수 있지만, Argon2id가 아닌 PBKDF2를 사용하는 키슬롯만 가능합니다. 이는 `/boot` 자체가 암호화된 경우에만 문제가 되며, 암호화되지 않은 `/boot`라면 initramfs가 Argon2id를 사용하는 LUKS2를 정상적으로 잠금 해제합니다.
QLUKS2는 기본적으로 어떤 암호화를 사용하나요?
A현재 cryptsetup의 기본값은 512비트 키의 `aes-xts-plain64`(XTS 모드의 AES-256)와 키 유도용 Argon2id입니다. 시스템에 컴파일된 기본값은 `cryptsetup --help`로 확인하고, 전체 설정은 LUKS 암호화 루트 가이드를 참고하세요.