기본적인 TPM(Trusted Platform Module) 프로그래밍에 대해 알아봅시다. 



 준비 단계 

먼저 필요한 라이브러리들을 설치해야 합니다. 


  • Fedora계열 

# yum install trousers tpm-tools trousers-devel 


  • debian 계열 

$ sudo apt-get install trousers tpm-tools libtspi-dev 


설치를 완료하고 난 후에는 TPM의 takeownership 명령을 수행해서 사용 권한을 획득해야 합니다. 자세한건 이전에 쓴 글을 참고하시면 됩니다. 



 알고 넘어가기  


  • TSS 아키텍처는 아래 그림과 같습니다. 


Architectural overview of the TSSArchitectural overview of the TSS

TPM 프로그래밍에서는 Tspi라이브러리 들을 사용합니다.


  • 다음 라이브러리들은 미리 추가해 두고 시작하는게 편합니다. 


#include <stdio.h>

#include <string.h>

#include <tss/tss_error.h>

#include <tss/platform.h>

#include <tss/tss_defines.h>

#include <tss/tss_typedef.h>

#include <tss/tss_structs.h>

#include <tss/tspi.h>

#include <trousers/trousers.h>


  • 디버깅 함수를 미리 정의해 두고 사용하면 편합니다. 


#define DEBUG 1

#define DBG(message,tResult) if(DEBUG) {printf("(Line %d, %s) %s returned 0x%08x. %s.\n", __LINE__, __func__, message, tResult, Trspi_Error_String(tResult));}


tResult값은 Tspi명령을 수행한 후 리턴 받은 값을 넣어주면 됩니다. 



  • 프로그램 초반부에 항상 필요한 값들은 미리 알아두면 편합니다. 


1. TSS_HCONTEXT 


TSS_HCONTEXT  hContext;

result =Tspi_Context_Create(&hContext);

result=Tspi_Context_Connect(hContext, NULL);



2. TSS_HTPM


TSS_HTPM hTPM;

result=Tspi_Context_GetTpmObject(hContext, &hTPM);



3. TSS_HKEY


TSS_HKEY hSRK;

TSS_UUID SRK_UUID = TSS_UUID_SRK;

result=Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSRK);


이 외의 TSS 변수들은  'include/tss/tss_typedef.h' 파일을 참고하면 됩니다. 



  • 모든 작업을 완료한 후에는 불필요한 자원을 해제해주면 됩니다. 

Tspi_Context_Close (h objects you have created);

Tspi_Context_FreeMemory(hContext, NULL);

Tspi_Context_Close(hContext);



필요한 기능 구현하기 


1. 키 생성 - 서명키(signing key)



2. 키 저장 및 로드 



3. 공개키 생성 후 파일로 저장



4. 데이터 해시 (Hashing data)



5. 데이터 실링 (Sealing data)



6. 서명 및 검증 (signing and verify)



7. 랜덤 넘버 생성 


즐거운 TPM 프로그래밍 하세요~


Posted by KT한
,

TPM은 TCG(Trusted Computing Group)에서 만든 것으로 중요한 자료를 안전하게 보호하기 위해 사용됩니다. TPM에 대한 내용은 다음에 차차 다루기로 하고 이번에는 TPM을 사용하는 법에 대해 얘기해보고자 합니다. 


여기서는 debian 환경을 기준으로 정리해보겠습니다.  먼저 TPM을 사용하기 위해서는 관련 패키지들을 설치해 줘야 합니다. 

libtspi-dev, trousers, tpm-tools 을 설치해 줍시다. 


$ sudo apt-get install  libtspi-dev  trousers  tpm-tools


tpm-tools 패키지 안에는 커맨드로 TPM 정보를 읽거나 설정 하는게 가능한 실행 파일들이 존재합니다. 

1.3.7 버전 기준으로 다음과 같습니다. 


tpm_nvread, tpm_changeownerauth, tpm_setoperatorauth, tpm_selftest, tpm_getpubek

tpm_clear, tpm_setpresence, tpm_resetdalock, tpm_restrictpubek, tpm_setclearable

tpm_revokeek, tpm_createek, tpm_nvinfo, tpm_nvrelease, tpm_version, tpm_setownable

tpm_nvwrite, tpm_nvdefine, tpm_setenable, tpm_setactive, tpm_takeownership, tpm_restrictsrk



이제 TPM을 사용하기 위한 초기화 과정을 알아봅시다. 

(명령별로 지정해준 옵션은 해당 명령에 '-h' 옵션을 주면 설명을 볼 수 있습니다. )


먼저, TPM이 정상적으로 인식되는지 확인 해 봅시다. 


$ tpm_version 

  TPM 1.2 Version Info:

  Chip Version:        1.2.37.13

  Spec Level:          2

  Errata Revision:     2

  TPM Vendor ID:       ATML

  TPM Version:         01010000

  Manufacturer Info:   41XXXXX


버전 정보가 제대로 출력되지 않는 다면 TPM이 정상적으로 설치 되지 않았다는 의미입니다. 



TPM을 사용하기 위해서는 궁극적으로는 tpm_takeownership 명령을 수행해 줘야 합니다. 

하지만, 처음 이 명령을 실행하면  다음과 같은 오류가 연쇄적으로 발생하게 됩니다. 


$ tpm_takeownership 


Tspi_TPM_TakeOwnership failed: 0x00000006 - layer=tpm, code=0006 (6), TPM is deactivated

activate되어 있지 않는 다는군요. 


$ tpm_setactive -a 


Tspi_TPM_SetStatus failed: 0x00000007 - layer=tpm, code=0007 (7), TPM is disabled

enable되어 있지 않다고 합니다. 


$ tpm_setenable -e -f 


Tspi_TPM_SetStatus failed: 0x0000002d - layer=tpm, code=002d (45), Bad physical presence value

persence를 해줘야 할것 같군요. 


$ tpm_setpresense -a 


Tspi_TPM_SetStatus failed: 0x0000002d - layer=tpm, code=002d (45), No SRK 

SRK(Storeage Root Key)가 없다고 합니다. SRK는 takeownership을 해줘야 생성됩니다. 결국, 문제는 다시 원점으로 오게 됩니다. 



이를 해결하기 위한 절차는 다음과 같습니다. 


먼저 run level을 single user mode로 변경해 줘야 합니다. 

그렇지 않고 tpm_setenable 명령어를 수행해 보면 


$ tpm_setenable -e -f 


Tspi_TPM_SetStatus failed: 0x0000002d - layer=tpm, code=002d (45), Bad physical presence value 처럼 오류가 발생합니다.


$sudo init 1


자.. run level을 변경한 후..  다시 해보면 .. 


Tspi_Context_Connect failed: 0x00003011 - layer=tsp, code=0011 (17), Communication failure와 같은 오류가 발생하게 됩니다.

trousers 서비스를 시작 시켜줘야 합니다.


$sudo service trousers start


toursers를 실행 해 주고.. 다시 enable을 시켜 줍시다. 


$ tpm_setenable -e -f


만약, 이 때 Tspi_TPM_SetStatus failed: 0x0000002d - layer=tpm, code=002d (45), Bad physical presence value 와 같은 오류가 여전히 발생 한다면..  setpresence 명령어를 실행해 줘야 합니다. 


$ tpm_setpresence -a


별 에러 없이 수행이 완료되면 성공! 다시 한 번 enable해주고..


$ tpm_setenable -e -f


enable이 성공했다면 활성화를 시켜 줍니다. 


$ tpm_setactive -a


정상적으로 active 가 되었다면 .. 'Action requires a reboot to take effect' 이런 메시지가 나옵니다.  리부팅을 시켜줍니다. 


$ sudo reboot


이제 takeownership을 해봅시다. 


$ tpm_takeownership


Tspi_TPM_TakeOwnership failed: 0x00000023 - layer=tpm, code=0023 (35), No EK 와 같은 오류가 발생한다면.. EK(Endorsement Key)가 없다고 하니 EK를 먼저 생성해 줍시다. 


$ tpm_createek


Tspi_TPM_TakeOwnership failed: 0x00002004 - layer=tcs, code=0004 (4), Internal software error 와 같은 에러 메시지가 발생한다면..

다시 한번 reboot을 해줍시다. 


$ tpm_takeownership


오류가 발생하지 않았다면 드디어 ownership을 획득에 성공한 것입니다. 


사용하다가 설정을 다시 초기화 하고 싶다면 clear 명령을 실행하면 됩니다. 


$ tpm_clear 


이상으로 TPM을 사용하기 위한 절차를 알아봤습니다. 

Posted by KT한
,

TPM(Trusted Platform Module)은 TCG(Trusted Computing Group)-신뢰할 수 있는 컴퓨팅 그룹에서 만든 것으로 우리말로는 신뢰(할 수 있는) 플랫폼 모듈 정도로 해석 할 수 있습니다.  암호 키를 매우 안전하게 보관할 수 있는 금고 정도로 생각하면 됩니다. 




왜 TPM과 같은 것이 필요할까요?


개인 PC나 노트북에 다른 사람에게 공개되면 안되는 중요한 자료가 있다고 생각해봅시다. 해커가 이 자료를 훔쳐가지 못하게 하려면 어떻게 해야 할까요? 

아마도 가장 먼저 떠오르는 것은 백신일 겁니다. 이 외에도 애드웨어, 개인 방화벽 등이 해커들의 간단한 공격을 막아 줄 수는 있지만 완벽하게 공격을 차단할 수 있는 소프트웨어란 현실적으로 불가능합니다. 버그가 없는 소프트웨어를 만든다는게 거의 불가능에 가깝기 때문이기도 하지만, 금전적인 이익을 얻기 위한 해커들의 공격 수법이 날로 진화하고 있기 때문이기도 합니다. 


백신등으로 해커의 침입을 완벽하게 막았다 치더라도, 노트북을 분실하거나 A/S를 맡겼을 때 다른 사람이 데이터를 빼간다거나 하는 경우에는 속수무책일 수 밖에 없습니다. 데이터를 복사해가고 원본을 그대로 놔둔다면 자료가 유출됐는지 조차 알아채지 못할 겁니다. 


결국 이런 문제들을 해결하기 위해 중요한 자료를 암호화해서 보관하는게 좋겠다는 결론에 이르렀습니다. 


그래서 인터넷에서 데이터를 암호화 하는 프로그램을 다운로드 받아 중요한 데이터를 암호화 했다면 이제 안전 할까요? 

이전에 비해 상당히 안전해 진 것은 맞습니다. 하지만, 안타깝게도 암호키가 유출된다면 우리의 노력은 수포로 돌아가게 됩니다. 



그림에서 보는것 처럼 컴퓨터만 잠궈두게 되면 하드디스크만 띄어서 다른 컴퓨터에 연결하게 되면 그 안의 자료는 모두 볼 수 있게 됩니다. 


그래서 TCG에서는 이를 보완하기 위해 하드웨어적으로 암호화하는 방법을 고안해 냈고 그게 바로 TPM입니다. TPM을 사용하면 해당 TPM에서만 암호화된 자료를 복호화 할 수 있도록 하여 디스크만 추출해서 내부 자료를 탈취하려는 시도도 막아줍니다. 

TPM의 주요 기능에는 RTM(Root of Trust for Measurement), RTS(Root of Trust for Storage), RTR(Root of Trust for Report)가 있습니다. 


1) RTS(Root of Trust for Storage)

 RSA 암호화 알고리즘을 사용해 암호화 및 복호화를 수행합니다. 

 외부 스토리지에 암호화된 데이터를 저장하기 위해 내부에 보유하고 있는 SRK를 이용해 키를 생성 및 관리하고, 트리 형식으로 스토리지의 데이터를 암호화 하여 관리합니다. 컴퓨터에 저장된 자료를 모두 TPM을 사용해서 암호화 해두었다면 설령 컴퓨터를 도둑 맞더라도 자료가 유출되는 걱정은 하지 않아도 됩니다. 


2) RTM(Root of Trust for Measurement)

 디바이스가 부팅될 때 외부 사용자로부터 불법적인 변경 및 조작이 있었는지에 대한 상태를 점검하고 이전에 저장되어 있는 상태와 비교하여 변화된 동작이 없음을 확인함으로써 디바이스가 무결하다는 것을 증명하는 과정을 말합니다. 

한마디로 누군가 장치에 접근해서 펌웨어와 같은 것을 변조해서 TPM에 있는 키를 빼내려 하는 시도를 막아주기 위한 기능입니다. 


3) RTR(Root of Trust for Report)

 외부의 사용자에 의해서 디바이스에 대한 무결성 인증 요청을 받았을 경우 RTM과정을 통해서 무결성을 인증했던 데이터의 정보를 제공해 주는 역할을 수행합니다. 사실 이것이 보장되지 않는다면 RTM이 보장된다 하더라도 해커에 의해 공격을 받을 수 있기 때문에 반드시 필요한 기능입니다. 



이런 기능들을 제공하기 위한 TPM의 구조는 아래 그림과 같습니다. 



우리는 이제 TPM의 이런 기능 덕분에 노트북과 같은 장치를 도둑맞을 수 있어도 그 내부에 저장된 자료는 도둑맞지 않을 수 있는게 가능합니다. 물론, 노트북을 되찾기는 어렵겠지만요.. 









Posted by KT한
,