LUKS — 리눅스 디스크 전체 암호화

LUKS2 구조(dm-crypt·keyslot·Argon2id), cryptsetup으로 암호화 볼륨 생성·마운트·키슬롯 관리, /etc/crypttab 자동 해제, TPM 연동까지 실전 중심으로 설명합니다.

· 6 min read · PALDYN Team

지난 글에서 Secure Boot로 부팅 체인을 검증하는 방법을 살펴봤습니다. 이번에는 디스크 자체를 암호화하는 LUKS(Linux Unified Key Setup) — 리눅스의 표준 디스크 암호화 방법을 다룹니다. 노트북 분실이나 서버 폐기 시에도 데이터가 노출되지 않도록 합니다.

LUKS 아키텍처

LUKS 암호화 레이어 구조

LUKS는 dm-crypt 커널 모듈 위에 구축된 표준화된 헤더 포맷입니다.

  • dm-crypt: Linux Device Mapper의 암호화 타깃 — AES-XTS-256 방식으로 투명하게 암호화
  • LUKS 헤더: 암호화 메타데이터와 최대 32개의 Keyslot 보유
  • Keyslot: 마스터 키를 패스프레이즈로 암호화한 사본. 여러 패스프레이즈로 같은 볼륨 접근 가능

LUKS1 vs LUKS2

항목LUKS1LUKS2
KDFPBKDF2Argon2id (메모리하드)
Keyslot 수8개32개
헤더 크기1MB4MB (헤더 이중화)
인증 암호화미지원AEAD 지원
권장 여부레거시✓ 권장

암호화 볼륨 생성

LUKS 볼륨 생성 · 키슬롯 관리 명령

# 1. 디스크 확인
lsblk
fdisk -l /dev/sdb

# 2. LUKS2 포맷 (⚠ 기존 데이터 삭제됨)
sudo cryptsetup luksFormat --type luks2 /dev/sdb

# 강력한 옵션 명시
sudo cryptsetup luksFormat --type luks2 \
    --cipher aes-xts-plain64 \
    --key-size 512 \
    --hash sha256 \
    --iter-time 2000 \
    /dev/sdb

--iter-time 2000은 KDF(키 유도 함수) 반복 시간을 2초로 설정해 브루트포스를 어렵게 합니다.

볼륨 열기 · 마운트

# LUKS 열기 (가상 블록 디바이스 생성)
sudo cryptsetup luksOpen /dev/sdb data_crypt

# /dev/mapper/data_crypt 가 생성됨
ls -la /dev/mapper/data_crypt

# 파일시스템 생성 (처음 한 번만)
sudo mkfs.ext4 /dev/mapper/data_crypt

# 마운트
sudo mkdir -p /mnt/data
sudo mount /dev/mapper/data_crypt /mnt/data

# 언마운트 · 닫기
sudo umount /mnt/data
sudo cryptsetup luksClose data_crypt

키슬롯 관리

LUKS2는 최대 32개의 키슬롯을 지원합니다. 여러 패스프레이즈를 등록하거나 기존 것을 안전하게 교체할 수 있습니다.

# 헤더 정보 확인
sudo cryptsetup luksDump /dev/sdb

# 새 패스프레이즈 추가 (키슬롯 1)
sudo cryptsetup luksAddKey /dev/sdb

# 특정 키슬롯 제거
sudo cryptsetup luksKillSlot /dev/sdb 1

# 패스프레이즈 변경 (기존 입력 후 새 입력)
sudo cryptsetup luksChangeKey /dev/sdb

헤더 백업 (필수)

LUKS 헤더가 손상되면 데이터 복구가 불가능합니다.

# 헤더 백업
sudo cryptsetup luksHeaderBackup /dev/sdb \
    --header-backup-file /secure/sdb_header.bak

# 헤더 복원
sudo cryptsetup luksHeaderRestore /dev/sdb \
    --header-backup-file /secure/sdb_header.bak

백업 파일은 암호화된 별도 스토리지(USB, 원격 서버)에 보관합니다.

/etc/crypttab 자동 해제

부팅 시 자동으로 암호화 볼륨을 해제하려면 /etc/crypttab/etc/fstab을 설정합니다.

# /etc/crypttab
# <name>    <device>    <keyfile>    <options>
data_crypt  /dev/sdb    none         luks,timeout=60
# /etc/fstab
/dev/mapper/data_crypt  /mnt/data  ext4  defaults,nofail  0  2

키 파일로 자동 해제

부팅 시 패스프레이즈 입력 없이 키 파일을 사용할 수 있습니다. 키 파일 자체는 안전한 위치에 보관해야 합니다.

# 랜덤 키 파일 생성
sudo dd if=/dev/urandom of=/etc/luks/data.key bs=4096 count=1
sudo chmod 400 /etc/luks/data.key

# 키 파일을 keyslot에 추가
sudo cryptsetup luksAddKey /dev/sdb /etc/luks/data.key

# /etc/crypttab 에 키 파일 지정
# data_crypt  /dev/sdb  /etc/luks/data.key  luks

파일 컨테이너로 LUKS 사용

파티션 전체가 아니라 파일 안에 LUKS 볼륨을 만들 수 있습니다. VeraCrypt 컨테이너와 유사한 방식입니다.

# 500MB 파일 생성
dd if=/dev/urandom of=vault.img bs=1M count=500

# LUKS 포맷
sudo cryptsetup luksFormat vault.img

# 루프 디바이스로 연결
sudo losetup -f vault.img
LOOP=$(sudo losetup -j vault.img | cut -d: -f1)

# 열기
sudo cryptsetup luksOpen "$LOOP" vault
sudo mkfs.ext4 /dev/mapper/vault  # 처음 한 번

# 마운트
sudo mount /dev/mapper/vault /mnt/vault

TPM 연동

LUKS2는 TPM 2.0과 연동해 패스프레이즈 없이 부팅 시 자동 해제를 지원합니다. systemd-cryptenroll이 이 기능을 담당합니다.

# TPM2에 마스터 키 바인딩 (PCR 7 = Secure Boot 상태)
sudo systemd-cryptenroll --tpm2-device=auto \
    --tpm2-pcrs=7+14 /dev/sdb

# 기존 패스프레이즈 슬롯은 유지 (백업용)

TPM PCR 7은 Secure Boot 상태를 반영합니다. Secure Boot가 꺼지거나 키가 변경되면 TPM이 마스터 키 해제를 거부합니다.

정리

시나리오방법
파티션 암호화cryptsetup luksFormat /dev/sdXN
자동 마운트/etc/crypttab + 키 파일
부팅 디스크 암호화설치 시 “암호화” 옵션 선택 (LUKS on LVM)
패스프레이즈 없는 자동 해제systemd-cryptenroll + TPM 2.0

지난 글: Secure Boot — 부팅 체인 검증으로 부트킷 막기

다음 글: 권한 강화 — 최소 권한 원칙 적용


읽어주셔서 감사합니다. 😊