samsung 970 evo 에 TCG OPAL로 HW Encryption 적용하기

보통 파일이나 드라이브를 암호화 하기위해서는 소프트웨어에서 암호화를 진행하거나 CPU의 힘을 빌려 암호화를 진행한다.
이경우 암복호화 작업에 CPU연산이 소모되며 키관리도 OS에서 하다보니 여러가지 문제점이 생긴다.
SED(self-encrypting drives)의 경우 디바이스 자체적으로 암복호화하여 스토리지에 저장하는 방식을 지원한다.
당연 CPU연산이 불필요한 만큼 속도와 보안적인 측면에서 이점이 있다.

최근 구매한 970 EVO는 Class 0, TCG OPAL, Encrypted Drive  세가지 하드웨어 암호 옵션을 제공한다.
Class 0은 BIOS의 지원하에 부팅과정에서 암호를 입력하면 드라이브가 잠기거나 풀린다.
TCG OPAL과 Encrypted Drive의 경우 부팅 이후 특정 명령어를 컨트롤러로 보내 드라이브를 잠그거나 해제할 수 있다.

가장 간단한건 BIOS에서 지원하는 Class 0 방법을 사용하는것이다.
하지만 최근 구매한 Lenovo E585의 경우 영문자 + 숫자 조합만 가능하며 특수문자는 지원하지 않는 문제가 있다.
패스워드에 특수문자가 들어가지 않는다면 패스워드 크랙에 소요되는 시간을 크게 줄일 수 있고 그만큼 보안에 취약해진다.
따라서 현재 BIOS 상태에서는 Class 0는 선호하는 방법이 될 수 없다.
Encrypted Drive는 윈도우를 사용하는경우 여기에서 활성화 방법을 다루고 있다. (Microsoft eDrive 와 같은건가?)
이글에서는 TCG OPAL을 사용하여 SED를 활성화 하는 방법을 설명하고자 한다.

TCG OPAL을 설정하기 이전 간단한 구조부터 알고가면 이해가 쉬워진다.
OPAL이 활성화 된 Drive는 다음과 같은 동작을 한다.
처음 전원 투입으로 PC가 부팅하면서 Drive를 액세스 하면 Drive는 지정된 이미지(PBA:Pre-boot authrization)를 보여준다.
PBA는 부팅 가능한 작은 리눅스 이미지 이며 부팅과 함께 패스워드를 입력받아 이 패스워드를 Drive로 전달하는 역할을 한다.
Drive에서는 입력된 패스워드가 일치하면 Drive를 Unlock하게되며 이때부터는 암호화된 데이터를 읽고 쓸 수 있게된다.
PBA가 보여지는동안 즉, 패스워드가 입력이 안된 경우(실패한경우) 다른 매체를 통해 부팅하게되면 이 드라이브는 사용할 수 없다.

PBA가 보여지는동안 리눅스에서 Gparted로 확인하면
이렇게 보이지만 unallocated 영역을 파티셔닝하게되면
이런 에러가 뜨게된다.
윈도우에서 해당영역에 접근하면 이렇게 뜨게된다.
한마디로 읽지도 쓰지도 못한다.

서론이 길었지만 본론으로 돌아가서 TCG OPAL을 활성화 하는 방법은 libata.allow_tpm를 활성화 하여 sedutil을 사용하는 방법과 부팅가능한 USB에 rescue system을 구워서 그걸로 부팅해서 sedutil을 사용하는 방법이 있다.
본인의 경우 현재 시스템에 아무런 OS가 없어 Bootable USB를 사용하여 진행하였다.

USB를 통해 부팅하는경우 다음과 같은 로그인 화면이 나타난다.
나타난대로 login id는 root이며 패스워드는 없다.
사용가능한 Drive를 확인하기 위해 “sedutil-cli –scan” 명령을 입력하면 다음과 같은 결과가 나타난다.
이때 /dev/nvme0 뒤에 나타나는 숫자 2는 TCG OPAL 2.0을 지원한다는 의미이다.
이후 명령부터는 Drive를 초기화 할 수 있으니 데이터는 반드시 백업하여야 한다.
“linuxpba”명령은 앞서 말한 패스워드를 입력받아 Drive를 활성화 하는 명령이다.
패스워드로 “debug”를 입력하면 현재 설정만 보여주고 재부팅 하지 않는다.(다른거 입력하면 재부팅한다;)
현재는 설정이 아무것도 되어있지 않다.
“linuxpba” 명령을 통해 Drive가 보이며 해당 드라이브가 “is OPAL NOT LOCKED” 상태이면 잠글 수 있는 상태이다.
(본인의경우 linuxpba명령을 썼을때 디버그 메시지가 출력되어  less 나 more 명령어로 stdout만 따로 보았다)
예제에서 패스워드는 debug로 설정한 뒤 마지막 단계에서 원하는 패스워드로 바꾸게 된다.
진짜 이후 명령어부터는 기존 데이터가 어떻게 될지 모르니까 반드시 백업하고 진행하여야 한다.
Drive 잠금을 설정하기 위해 다음의 명령어를 입력한다.
sedutil-cli –initialsetup debug /dev/nvme0 # 초기화
sedutil-cli –enablelockingrange 0 debug /dev/nvme0 # 락0활성화
sedutil-cli –setlockingrange 0 lk debug /dev/nvme0 # 락0 크기 설정
sedutil-cli –setmbrdone off debug /dev/nvme0 # MBR done 설정, pba image 설정하기위한 명령어인듯
gunzip /usr/sedutil/UEFI64-n.nn.img.gz # 압축해제
sedutil-cli –loadpbaimage debug /usr/sedutil/UEFI64-n.nn.img /dev/nvme0 #pba image설정
n.nn은 해당하는 rescue 이미지의 버전마다 달라진다. 본인의 경우 UEFI64-1.5.1.img를 사용하였다.
순서대로 차례대로 입력하면 다음과 같은 결과가 나타난다.
여기까지 했다면 “linuxpba” 명령을 내리면 대상 Drive는 “is OPAL Unlocked” 상태로 표시되게 된다.
“not locked”와 “unlocked” 모두 한글로 보면 잠겨있지 않음이지만, not locked의 경우 잠금이 설정이 되지않은 상태, unlocked는 잠금이 설정되었지만 풀려있는 상태로 “is OPAL Unlocked” 상태가 되면 잠금이 설정되어 있는상태이다.
설정된 패스워드는 debug 이며 패스워드 변경을 위해 다음의 명령어를 입력한다. 이때 yourrealpassword의 경우 실제 적용될 패스워드로 변경하면 된다. (쉘에 직접 입력하는 방식이다보니 백슬러시를 통한 문자열 이스케이프가 필요하다)
sedutil-cli –setsidpassword debug yourrealpassword /dev/nvme0
sedutil-cli –setadmin1pwd debug yourrealpassword /dev/nvme0
패스워드 변경명령은 아무것도 출력되지 않는다. (성공메시지 조차도….)
패스워드 변경이 정상적으로 되었는지 확인하기위해 다음의 명령어를 실행하면
sedutil-cli –setmbrdone on yourrealpassword /dev/nvme0
변경된 패스워드가 맞을경우 MBRDone set on 이라고 뜨게 된다. (틀릴경우 method status code NOT_AUTHORIZED)
확인까지 끝났으면  전원을 “완전히” 껐다가 설정된 Drive로 부팅하게되면  PBA가 뜨게 된다.
설정한 패스워드를 정확히 입력하면 “is OPAL Unlocked” 가 뜨며 자동적으로 재부팅하게된다 (여기서도 debug를 입력하면 쉘로 빠지며 sedutil을 사용할 수 있다)
재부팅할때 BIOS에서 다른 부팅매체를 선택해 Windows 나 Linux 등의 OS를 설치할 수 있다.
아래는 샘숭의 매지션 소프트웨어에서 확인결과.

TCG OPAL 단점
부팅을 두번한다. (느리다 빠른부팅이 되지않는다.)
설정이 생각보다 간단하지 않다.(Class 0만큼 쉽지않아..)
절전모드(S3)에 들어가면 깨어나질 못한다. (드라이브 전원차단 = 인증해제, 다시 인증할 방법이 커널에 구현되어 있지 않음 sedutil에 –prepareForS3Sleep 과 같은 명령어를 쓰면 된다고하나 난 아직 잘안됨… 해결방법 아시면 피드백 부탁드립니다)
설정은 했는데 오버프로비저닝이 잘 적용 되는지 모르겠다.

ps. 패스워드 까먹으면 어떻게해야할지 모른다. (초기화로 되려나? 서비스센터 가져가야되나? 이미 OS 설치해버려서 테스트하기 귀찮…)
몇일전 Self-encrypting deception: weaknesses in the encryption of solid state drives (SSDs)  이런 논문이 나왔다.
라고한다.

참고문헌
https://wiki.archlinux.org/index.php/Self-Encrypting_Drives
https://github.com/Drive-Trust-Alliance/sedutil/wiki/Encrypting-your-drive

 

 

++++ 20181206 +++ 추가 +++

디스크 매니저에서는 잘 보이나

매지션 소프트웨어에서는 안보임…
시간날때 삼성에 문의해봐야지

Leave a Reply

Your email address will not be published. Required fields are marked *