본문 바로가기
정리/시스템

[데비안] 리눅스 디스크/파티션 LUKS로 암호화하기

by 정재희 2017. 5. 9.

데이터가 너무나도 중요해서 물리적으로 디스크를 분실해도 해독이 불가능하도록 디스크 자체에 암호화를 걸어야 될 때가 있다.


Windows에서는 한때 유명했던 TrueCrypt 프로그램(구조적인 문제 때문인지 현재는 개발이 중단되었다)이나 MS의 BitLocker를 사용하면 된다.


리눅스에서는 디스크를 암호화 시킬 수 있는 프로그램이 여러 가지다. (https://wiki.archlinux.org/index.php/disk_encryption)

여기서는 DM-Crypt를 기반으로 암호화 시켜주는 LUKS를 사용 할 것이며, 프로그램은 CryptSetup를 사용 할 것이다.


접기

DM은 Device Mapper로 리눅스 커널 2.6과 3.x 버전에 포함되어 있는 프레임워크로, 물리적인 디스크를 가상의 디스크로 인식하도록 돕는 시스템으로, 여러개의 물리적인 디스크를 하나의 디스크처럼 쓸 수 있도록 도와주는 역할을 한다고 생각하면 된다. (가상의 레이드 시스템으로 보면 된다.)


DM-Crypt는 DM의 서브시스템으로 보면 된다. 즉, 리눅스 커널에 있는 DM을 기반으로 커널의 crypto-API를 사용해 디스크를 암호화 시키는 시스템이라고 보면 된다.

접기

 

접기

LUKS : Linux Unified Key Setup

리눅스 디스크를 암호화 시키는 표준이 LUKS다. LUKS의 장점은 아래와 같다.


무료.

표준화를 통한 호환성.

낮은 엔트로피 공격에 대한 안정성.

멀티 키 지원.


접기




설치 환경


OS : Debian 7 - 32 bit

Hardware : SSD1 - OS / SSD2 - 암호화 할 디스크

Require Programs : lvm2, cryptsetup




목차


1. 프로그램 설치

   1-1. LVM 설치

   1-2. CryptSetup 설치

2. 디스크 추가 및 파티션 설정

   2-1. 디스크 추가 및 파티션 확인

   2-2. 디스크 파티션 설정 및 생성

3. 볼륨 생성

   3-1. 물리 볼륨 생성

   3-2. 논리 볼륨 그룹 생성

   3-3. 논리 볼륨 생성

   3-4. 볼륨 생성 확인

4. 볼륨 암호화

   4-1. LUKS 포맷

   4-2. LUKS Open 및 Close

   4-3. 볼륨 포맷

   4-4. 볼륨 Mount

5. 부팅시 자동 인식 설정 (옵션)

   5-1. 자동 LUKS Open 프로시저 추가

   5-2. 자동 Mount 프로시저 추가

   5-3. 자동 해독 프로시저 추가





1. 프로그램 설치


디스크를 암호화하기 위해 우선 볼륨 관리 및 LUKS 셋팅을 위한 CryptSetup 툴을 설치하도록 한다.




1-1. LVM 설치


디스크의 볼륨 상태 설정하고 확인을 하기 위해 LVM(Logical Volumn Management) 툴을 설치해야 한다.


$ apt-get install lvm2


LVM 툴은 Logical volume management의 약자로 논리적인 볼륨들을 관리한다.

주된 명령은 아래와 같다. (목차 4 논리 볼륨 생성 과정 수행시 개인적으로 scan 관련 명령어를 사용해 보자)


lvscan - Logical Volumns Cacn

pvscan - Phisical Volumns Scan

vgscan - Volumn Groups Scan

pvcreate - Physical Volumns Create

vgcreate - Volumn Group Create

lvcreate - Logical Volumn Create




1-2. CryptSetup 설치


LUKS로 디스크를 암호화 해줄 프로그램 CryptSetup을 설치한다.


$ apt-get install cryptsetup 


주된 명령어는 아래와 같다.


cryptsetup luksFormat

cryptsetup luksOpen

cryptsetup luksClose

cryptsetup luksAddKey

cryptsetup luksRemoveKey




2. 디스크 추가 및 파티션 설정


디스크 추가 작업 및 디스크를 사용 할 수 있도록 파티션을 나누는 작업을 해야 한다.

파티션은 하나의 디스크에 최소 1개의 파티션이 있어야 한다.

파티션을 나누면 디스크가 여러 개인 것 처럼 사용 할 수 있기 때문에 각 개별로 포맷 할 수 있는 장점이 있다.




2-1. 추가된 디스크 확인


암호화 할 디스크를 컴퓨터에 장착하면 본래 OS가 설치된 SSD(이하 SSD1)외에 추가로 장착된 SSD(이하 SSD2)를 리눅스가 인식하게되며, 인식된 디스크는 리눅스에서 하나의 파일로 취급되어, /dev 디렉토리 하위에 디스크명으로 생성된다.


디스크명은 물리적인 디스크 개수대로 생성되며 sda, sdb, sdc 등등 알파벳 순으로 sd#이 생성된다. (SATA/iSCSI 방식이면 sd#으로 PATA 방식이면 hd#으로 생성됨)



이제, fdisk 또는 cfdisk 명령어를 통해 추가된 SSD2의 파티션을 확인하자.



$ fdisk -l

또는

$ cfdisk /dev/sdb


명령어를 수행한 결과 아래 2장의 그림 처럼 각 결과가 나타난다.





fdisk 명령을 수행한 결과 붉은 박스 맨 아래에 /dev/sdb가 존재하는 것이 보인다. sdb가 추가된 SSD2를 의미한다.





cfdisk 명령을 수행한 결과에는 Free Space만 덩그란이 있는 부분을 볼 수 있다.


둘다, 갓 나온 SSD를 추가로 장착했기때문에, 파티션이 없어서 디스크를 사용 할 수 없다.

파티션 작업과 포맷을 통해 SSD를 사용 할 수 있지만, 여기서는 암호화 작업을 해야되기 때문에 포맷 작업은 뒷 부분에서 다루겠다.




2-2. 디스크 파티션 설정 및 생성


sdb를 실제 사용 가능하도록 파티션을 생성하도록 한다.

여기서는 추가된 SSD가 대용량이라는 시나리오 진행으로 파티션을 2개로 나누는 작업을 했다.


fdisk 명령어를 사용해도 되지만, GUI가 직관적이고 다루기 쉽기 때문에 cfdisk를 이용해 작업하도록 하자.


$ cfdisk /dev/sdb






파티션 생성을 위해 [New] 메뉴를 선택한다.





파티션은 2개의 타입으로 나뉘는데 바로 Primary와 Logical이다.

Primary와 Logical의 큰 차이점은 생성 할 파티션에 OS를 설치 할 것인지에 따른다. (OS를 부팅하기 위해서는 Primary 파티션에 OS를 설치해야되기 때문이다.)

OS를 추가된 디스크에 설치하려고 한다면 [Primary] 메뉴를 선택하면 되고, 단순 데이터 저장용인 개념이라면 [Logical] 메뉴를 선택하면 된다.


여기 시나리오에서는 멀티 OS를 위해서라는 개념으로 Primary 파티션 1개와 단순 데이터 저장용 Logical 파티션 1개를 만든다.





디스크 총 용량 1073.75Mb 중에 500Mb를 Primary로 생성하고 나머지 용량을 Logical로 생성하도록 했다.

아래 그림처럼 자신이 만든 피티션 상태가 맞는지 잘 확인하도록 하자.





참고로 Name 항목에 sdb1 다음에 sdb2가 아니라 sdb5가 나온건, Primary 파티션이 1~4번에, Logical 파티션은 5번부터 부여받도록 정해졌기 때문이다.

(Primary는 최대 4개까지만 생성 가능하며, 4개 모두 생성시 Logical 영역은 생성 할 수 없다. 대신 Primary 3개 까지만 생성시 Logical은 수없이 생성 할 수 있다)


위 그림까지는 현재 계획만 잡은 상태이며, 디스크에 기록은 하지 않은 상태다.

다시 한번 파티션을 설정한 값이 맞는지 확인 후 [Write] 메뉴를 눌러 디스크에 기록한다. 

디스크에 기록을 하게 되면 데이터가 소실되므로 데이터가 있는 상태라면 백업여부를 확인하도록 한다.




3. 볼륨 생성


볼륨은 파티션 1개를 1개의 볼륨으로 또는 다량의 파티션을 1개의 볼륨으로 지정 할 수 있다.

아래 LVM 레이어그림의 구성처럼 볼륨은 파티션 위에 존재한다.







3-1. 물리 볼륨 생성


2개의 파티션에 물리적인 볼륨을 각각 1개씩 생성하도록 한다.


$ pvcreate /dev/sdb1

$ pvcreate /dev/sdb5





만약, 볼륨을 삭제해야 한다면 아래 명령어를 사용하면 된다.


$ pvremove /dev/sdb1

$ pvremove /dev/sdb5



3-2. 볼륨 그룹 생성


이제 볼륨 그룹을 생성하도록 한다.

볼륨 그룹은 여러개로 분산된 물리 볼륨을 하나의 논리 볼륨처럼 해주기 위한 그룹 정책이라고 보면 된다.

즉, 물리적인 디스크가 여러개 있으며, 각각의 디스크에도 여러개의 파티션이 있는데, 이 파티션을 하나의 볼륨 그룹으로 만들면, 물리적으로, 파티션으로 분리되어 있어도 하나의 디스크처럼 리눅스가 다룰 수 있게 된다. 즉, 소프트웨어적인 RAID로 구성 할 수 있다는 것이다.


여기서 sdb1과 sdb5를 각각 분리된 논리 볼륨으로 생성 할 예정이므로 볼륨 그룹도 각각 만들면 된다.

볼륨 그룹명으로는 필자가 임의로 각각 Secondary 및 Tertiary 라는 이름으로 만들어 할당 했다.


$ vgcreate Secondary /dev/sdb1

$ vgcreate Tertiary /dev/sdb5




만약, 볼륨 그룹을 삭제해야 한다면 아래 명령어를 사용하면 된다.

$ vgremove Secondary

$ vgremove Tertiary


만약, 2개 이상의 물리 볼륨들을 논리 볼륨 그룹 1개로 만든다면, 아래처럼 물리 불류명을 나열하여 하나의 논리 볼륨 그룹으로 생성하면 된다.

$ vgcreate 만들볼륨그룹명 물리불륨명 물리불륨명 물리불륨명....



3-3. 논리 볼륨 생성


볼륨 그룹을 실제 사용하기 위해서는 논리 볼륨을 생성해야 한다.


S1과 T1는 각각의 논리 볼륨명이다. 

논리 볼륨명 또한 임의로 만들었으니, 마음에 안드면 바꿔서 사용하면 된다.

$ lvcreate --name S1 -l100%FREE Secondary

$ lvcreate --name T1 -l100%FREE Tertiary


-l100%FREE 옵션은 FREE 영역에 100% 할당한다는 뜻이다.




만약, 논리 볼륨을 삭제해야 한다면 아래 명령어를 사용하면 된다.


$ lvremove Secondary

$ lvremove Tertiary




3-4. 볼륨 생성 확인


지금까지 추가된 디스크를 파티션으로 나누고, 각 파티션에 물리 볼륨 및 논리 볼륨 그룹, 논리 볼륨을 생성했다.

생성된 볼륨은 아래 그림처럼 


/dev/볼륨그룹명/볼륨명

/dev/mapper/볼륨그룹명-볼륨명


위치에 생성된 것을 확인 할 수 있다. (Symbolic Link로 연결된 것이며 실제 볼륨 파일은 /dev/dm-0과 /dev/dm-1에 있는 것을 확인 할 수 있다.)







4. 볼륨 암호화


이 글의 목적인 디스크 함호화를 CryptSetup 툴을 사용해 LUKS로 암호화 시켜보도록 하자.




4-1. LUKS 포맷


논리 볼륨을 LUKS로 포맷해야 한다.

$ cryptsetup luksFormat /dev/mapper/Secondary-S1

$ cryptsetup luksFormat /dev/mapper/Tertiary-T1


암호화된 볼륨을 해독할 패스워드를 만들면 디스크 암호화 작업을 수행하게 된다.





4-2. LUKS Open 및 Close


암호화된 볼륨을 Open하여 일반적인 볼륨처럼 인식하도록 하는 작업이 필요하다.

바로 luksOpen 명령어를 사용하면 된다.


$ cryptsetup luksOpen /dev/mapper/Secondary-S1 normalDisk1

$ cryptsetup luksOpen /dev/mapper/Tertiary-T1 normalDisk2


해독 암호를 입력하면 이제 일반 디스크처럼 사용이 가능하도록 LUKS 볼륨이 해독되어 접근 가능한 볼륨 파일이 생성된다.(이 파일이 sdb1, sdb5 처럼 사용된다.) 




만약, Open된 볼륨을 Close 시키기 위해서는 아래 명령어를 사용하면 된다. (단, 해당 볼륨이 unmount 되있어야 한다.)


$ cryptsetup luksClose /dev/mapper/normalDisk1

$ cryptsetup luksClose /dev/mapper/normalDisk2



2개의 암호화된 볼륨을 각각 normalDisk1, normalDisk2라는 볼륨 명으로 열었다.

해독된 볼륨이 생성된 파일 위치는 아래 그림과 같이 dm-2, dm-3로 생성 됐으며, /dev/mapper 디렉토리 내부에 Symbolic Link가 생성 되었다.






4-3. 볼륨 포맷


해독된 볼륨인 normalDisk1과 normalDisk2는 처음 사용하는 디스크를 추가한 것과 같기 때문에 포맷 작업이 필요하다.

여기 시나리오상에서는 리눅스 파일 시스템 중 최근 FS인 ext4를 사용하여 포맷한다.


$ mkfs.ext4 /dev/mapper/normalDisk1

$ mkfs.ext4 /dev/mapper/normalDisk2






4-4. 볼륨 Mount


포맷된 볼륨을 마운트하면 일반적인 디스크를 추가하여 사용하는 것처럼 사용 할 수 있게 된다.


마운트 할 지점을 만들기 위해 임의의 디렉토리를 생성하고 해당 디렉토리에 mount를 시킨다.


$ mkdir /mnt/sdba

$ mkdir /mnt/sdbb


$ mount -t ext4 /dev/mapper/normalDisk1 /mnt/sdba

$ mount -t ext4 /dev/mapper/normalDisk2 /mnt/sdbb



드디어, 암호화된 볼륨을 일반 디스크처럼 사용 할 수 있도록 모든 작업을 마쳤다.

앞으로는 LUKS 볼륨을 사용 할 때 목차 4-2와 4-4 부분를 반복해서 사용하면 된다.




5. 부팅시 자동 인식 설정 (옵션)


암호화된 뷸륨은 재부팅시 자동으로 해제된다.

부팅시 자동으로 암호화된 볼륨을 해독하도록 프로시저를 추가 할 수 있다.




5-1. 자동 LUKS Open 프로시저 추가


Crypt Tables을 수정하면 부팅시 자동으로 LUKS 볼륨을 Open하도록 암호를 묻는 프로시저를 추가 할 수 있게 된다.

$ vi /etc/crypttab


아래 내용을 뒤에 추가하여 저장한다.


$ normalDisk1 /dev/mapper/Secondary-S1 none luks 

$ normalDisk2 /dev/mapper/Tertiary-T1 none luks



이제, 부팅중에 암호화된 볼륨을 해제 하도록 요구하는 프로시저가 추가된 모습을 아래 그림에서 확인 할 수 있다.






5-2. 자동 마운트 프로시저 추가


부팅시 암호화된 볼륨을 해제하더라도, 자동으로 마운트가 되지 않아 부수적으로 마운트 작업을 해줘야 하는 불편함이 따른다.

이런 불편함을 줄이기 위해 마운트 작업을 자동화 하도록 FS Table를 수정해야 한다.


$ vi /etc/fstab


내용 추가

$ /dev/mapper/normalDisk1 /mnt/sdba ext4  defaults        0       1

$ /dev/mapper/normalDisk2 /mnt/sdbb ext4  defaults        0       1



FS Table내용을 기반으로 initramfs를 업데이트 한다. (initramfs에 대한것은 여기 참조 http://wiki.gentoo.org/wiki/Initramfs/HOWTO/ko)


$ update-initramfs -u -k all


자, 이제부터 부팅시 암호만 입력하면, 일반 디스크처럼 암호화된 디스크를 편하게 사용 할 수 있게 됐다.




5-3. 자동 해독 프로시저 추가


마지막으로, LUKS 볼륨을 해독하기 위해 부팅시마다 암호를 묻는 데, 암호를 입력하는 것 마저 자동화 하고 싶다면, key를 등록해 부팅시 자동으로 인증할 수 있게 하면 된다.



키를 생성하는데 1024bit면 충분 할 것이므로 아래 명령처럼 생성하도록 한다.

of옵션에는 생성되는 key path이며, 리눅스 권한때문에 일반 유저도 key에 접근 할 수 있으므로 path를 잘 고려하도록 한다.


$ dd if=/dev/urandom of=/root/keyfile bs=1024 count=4



key를 LUKS 볼륨에 등록한다.


$ cryptsetup luksAddKey /dev/Secondary/S1 /root/keyfile

$ cryptsetup luksAddKey /dev/Tertiary/T1 /root/keyfile


LUKS의 장점 중 하나가 멀티 키 지원이므로 여러개의 키를 만들어서 LUKS에 등록 후 배포하면 해당 key를 갖은 사람도 해독 할 수 있는 구조를 만들 수 도 있다.



Crypt Table에서 key가 있는 경로를 설정해 주면 앞으로 부팅시 자동으로 해독될 것이다.

목차 5-1에서 none으로 적었던 key path 경로를 생성한 키가 위치한 path로 수정하면 된다.


키파일 경로 추가


$ vi /etc/crypttab


기존 내용 수정

$ normalDisk1 /dev/mapper/Secondary-S1 /root/keyfile luks 

$ normalDisk2 /dev/mapper/Tertiary-T1 /root/keyfile luks




모두 마쳤다.

이제 암호화된 디스크를 부팅해도 자연스럽게 일반 디스크처럼 사용 할 수 있게 됐다.



참고로, 지금까지 작업한 내용을 아래 명령어를 통해 현재 디스크의 상태를 확인해보자


$ df





$ blkid



$ fdisk -l 




이 글을 쓰면서, 부족한 점이나 잘못된 내용이 있다면 지적 부탁드린다. 나도 리눅스 파일 구조에 대해서 정확하게 알고 있지는 않기 때문이다.



출처: http://sacstory.tistory.com/268 [나긋한 개발]

'정리 > 시스템' 카테고리의 다른 글

sendmail TCP 587번 포트 사용하기  (0) 2017.05.15
grep 간단 명령어 활용  (0) 2017.05.15
ssh  (0) 2017.04.16
망분리  (0) 2017.03.27
스토리지  (0) 2017.03.11

댓글