본문 바로가기

Linux

[Linux] LUKS로 저장장치 암호화하기

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

회사 기밀이나 개인정보가 들어있는 저장장치는 보안이 중요합니다. 기본적으로 유출이 되지 않는게 최선이지만 만일의 사태로 인해 유출이 되었을 때 데이터를 빼내지 못하게 암호화를 하는 것이 좋습니다. 리눅스에서는 커널단에서 LUKS라는 암호화 레이어를 제공하고 있습니다. 그러므로 LUKS를 사용하면 어떤 리눅스에서든지 사용가능합니다.

 

LUKS를 사용자 단에서 조작하기 위한 프로그램으로 cryptsetup이 있습니다. 아치리눅스는 기본적으로 포함되어 있지만 다른 배포판들은 어떤지 모르겠습니다. 만약 해당 명령이 없다면 cryptsetup 패키지를 설치해야 합니다.

 

먼저 저장장치를 LUKS로 사용하기 위해서 포맷을 해야합니다. 포맷은 아래의 명령으로 가능합니다.

# cryptsetup --type luks2 luksFormat /dev/<암호화할 저장장치 위치>

 

현재 최신의 LUKS 버전은 2이기 때문에 LUKS2를 사용하도록 옵션을 넣었습니다. 만약 옵션을 사용하지 않는다면 LUKS1으로 포맷됩니다.

 

만약 해당 저장장치가 파티션이 나누어져있고 특정 파티션만 LUKS로 하고싶다면 /dev/sdb2 처럼 파티션을 지정해서 포맷하면 됩니다. 저는 그냥 귀찮아서 파티션 테이블 없이 USB 통째로 LUKS로 만들었습니다. 리눅스 device mapper는 상당히 창의적으로 활용이 가능하기 때문에 LVM 위의 논리적 볼륨에 LUKS를 각각 적용하거나 LUKS 위에 LVM을 구성하고 사용하는 것도 가능합니다.

 

이제 암호화된 장치가 생겼고 암호화와 복호화를 담당하는 레이어를 통하여 사용해야 합니다. 이 레이어를 통하는 가상의 장치를 만들면 일반 장치처럼 사용하여도 물리 장치에는 암호화되어 저장됩니다. 이를 생성하기 위한 명령은 아래와 같습니다.

# cryptsetup open /dev/<암호화된 저장장치> <가상장치 이름>

 

원래 LUKS 장치를 열기위한 luksOpen 이란 액션이 있지만 open 액션의 기본 옵션이 --type luks이고 버전은 알아서 인식하기 때문에 그냥 open 하셔도 됩니다. 비밀번호를 올바르게 입력했다면 /dev/mapper에 마지막 인자로 준 가상장치 이름의 블록 디바이스가 생성됩니다. 이 가상장치를 통해서 일반 장치처럼 마운트하여 사용하면 됩니다.

 

마운트하기 전에 이 가상장치는 어떤 파일시스템으로도 포맷되어있지 않은 상태라 먼저 포맷을 해야합니다. 파일시스템이야 사용자 취향이나 시스템에 따라 일반 장치를 포맷하듯이 mkfs 계열 명령으로 하면 됩니다. 저는 ext4로 포맷했습니다.

# mkfs.ext4 /dev/mapper/<가상장치 이름>

 

이제 마운트하여 사용하시면 됩니다.

# mount /dev/mapper/<가상장치 이름> <마운트 위치>

암호화된 장치의 사용이 끝났다면 역순으로 해제하시면 됩니다.

마운트 해제를 한 뒤,

# umount <마운트 위치>

LUKS 장치를 닫고,

# cryptsetup close <가상장치 이름>

저장장치를 뽑아버리거나 하시면  됩니다.

 

만약 특정 파티션을 LUKS로 암호화하고 부팅과 종료 때 반자동으로 연결되게 하고싶다면 /etc/crypttab와 /etc/fstab을 사용하시면 됩니다. 혹시 root 파티션을 포함한 시스템 대부분을 암호화하고 싶다면 initramfs의 후크와 커널 파라미터를 추가해야 합니다. 이것은 배포판마다 설정하는 방법이 다를 수 있기 때문에 사용하시는 배포판의 위키를 보는게 좋습니다.

 

참고로 LUKS는 복호화할 수 있는 비밀번호를 하나 이상 만들 수 있습니다. 각 비밀번호는 Key Slot이라 부르고 LUKS1은 최대 8개, LUKS2는 32개까지 추가할 수 있습니다. 이 Key Slot을 추가, 삭제, 변경하기 위해 luksAddKey, luksRemoveKey, luksChangeKey 액션이 사용됩니다.

# cryptsetup luksAddKey /dev/<암호화된 저장장치>
# cryptsetup luksRemoveKey /dev/<암호화된 저장장치>
# cryptsetup luksChangeKey /dev/<암호화된 저장장치>