Ref.

http://www.readysystem.co.kr/ready/bbs/board.php?bo_table=tech_linux&wr_id=43&sfl=&stx=&sst=wr_hit&sod=desc&sop=and&page=4



System Monitoring

시스템의 성능은 여러 가지 프로그램의 요청에 대해 현재의 시스템 자원을 얼마나 효율적으로 조정하여 사용하는가에 달려있다. 일반적으로 가장 중요한 시스템 자원은 CPU, 메모리, 디스크 입출력이며 인터넷 서비스가 일반화된 상황에서 네트워크에 대한 부분도 중요하게 다뤄져야 한다. 시스템을 안정적으로 관리하기 위해서는 지속적인 시스템 관리를 통해 문제 발생시 적절히 대처할 수 있는 기술이 필요하다. 이와 관련된 내용은 일반적인 시스템 관리 서적 및 여러 가지 자료를 통해 많이 언급되었기 때문에 여기서는 시스템 모니터링 결과를 정확히 판단하는 방법과 시스템의 문제에 대한 효과적인 대처 방법을 중심으로 알아보겠다.


1. 시스템 모니터링 분야와 관련 프로그램

문제를 점검할 모니터링 분야에 대한 시스템 모니터링 프로그램을 먼저 알아보자. 여기 있는 프로그램들은 대부분 운영체제를 설치하면서 자동으로 설치가 되는 프로그램들이다. (sar, iostat, nmap, netcat, ntop 등은 별도로 설치를 해야 하는 모니터링 프로그램이다)

Category

Monitor program

 CPU

 top, ps, uptime, vmstat, pstree, iostat, sar

 Memory

 free, vmstat, sar

 Disk I/O df, du, quota, iostat, sar 
 Network

 ping, netstat, traceroute, tcpdump, nmap, netcat, ntop 

 File (include socket)

 Lsof 

시스템이 정상적으로 작동하고 있을 때 정기적으로 모니터링을 해 두어야 시스템에 문제가 생겼을 경우 신속하게 분석하여 문제를 해결할 수 있다. 즉, 주기적인 점검이 계속되어야 한다는 것이다. 보통 이런 작업등은 반복적이고 지루한 과정이므로 자동화하기 위한 노력이 필요하며 관리자가 직접 스크립트를 작성할 수도 있고 SNMP(Simple Network Management Protocol, 간이 망 관리 프로토콜) 등의 프로그램을 응용하여 자동화할 수도 있다. 모니터링 자동화에 대해서는 이후 강의에서 다룰 예정이다.


2.Find Problem

2.1 시스템의 부하 확인

시스템에 문제가 생겼을 경우 가장 먼저 어떤 프로그램을 실행하고 어떻게 사용하고 있었는지 점검해야 한다. 그리고 uptime을 이용하여 시스템의 부하를 확인한다. 일반적으로 웹서비스의 경우에는 낮 시간대에 접속이 폭주하므로 점심시간 무렵에 시스템의 부하가 올라갈 것이다. 그런데 접속이 폭주할 시간이 아닌대도 시스템의 부하가 높아지고 있다면 특정한 프로그램에서 문제가 발생하여 시스템의 자원을 소비하고 있을 가능성이 크고 서비스 거부 공격을 받고 있을 수도 있다. 시스템 부하가 어떻게 변동하고 있는지 확인을 했다면 ps와 top을 이용하여 구체적으로 프로세스의 상태를 점검한다. 

2.2 ps와 top를 이용한 프로세스 모니터링

ps와 top을 살펴보면서 주의할 점과 중요하게 살펴볼 내용에 대해서 설명하겠다. top에서 CPU 상태는 사용자 모드, 시스템 모드, 우선 순위가 조정된 작업(niced task) 과 cpu 휴지시간(idle) 을 모두 포함한다. 그런데 여기서 우선 순위가 조정된 작업은 시스템과 사용자 시간에서 이미 계산이 되어 있으므로 100퍼센트가 넘을 수 있다. 

ps와 top을 이용하여 모니터링을 할 경우 먼저 살펴보아야 하는 것이 디스크 액세스나 페이징을 기다리고 있는 프로세스가 있는가이다. 이런 경우에는 I/O와 메모리를 같이 점검해야 한다. 리눅스에서 프로세스 대기 상태는 인터럽트 허용과 인터럽트 금지의 두 가지 형태가 있다. 세마포어를 기다리거나 파일을 읽을 수 있게 되길 기다리는 것처럼 자원을 기다리는 일반적인 대기상태는 대개 인터럽트로 처리가 가능하다(인터럽트가 허용되는 sleep 상태는 ps, top 등에서 S로 나타난다). 그렇지만 인터럽트가 금지되는 대기 상태는 스왑 파일에서 메모리로 페이지를 읽어들이는 것과 같이 일이 끝마치기를 기다리고 있는 상태이다. 

프로세스 상태에서 D는 인터럽트가 불가능한 sleep 상태로 page fault 등을 의미하며 page fault 등을 통해 I/O중인 상태를 나타낸다. W는 상주하는 페이지가 없다는 것을 의미하며 프로세스가 스왑아웃된 상태를 나타낸다. 여기서 W는 커널 프로세스에 대해서는 정확히 동작을 하지 않는다는 의미이다. 일반적인 응용프로그램을 실행하면 주기억장치에 상주한 후 프로세스가 처리되고 상대적인 주소를 가지게 된다. 그런데 커널은 다른 응용프로그램처럼 상대적 어드레스를 가지는 것이 아니라 시스템이 부팅된 후 가장 먼저 주기억 상치에 상주하기 때문에 언제나 같은 주기억 장치의 번지에 상주하게 된다. 그러므로 커널 프로세스에서 스왑을 하는 일도 없고 당연히 해서도 안되는 것이다.

ps와 top에서 메모리와 관련된 부분중 차이가 나는 것이 있다. 프로세스의 메모리 구조는 텍스트, 데이터, 스택 등으로 이루어져 있다. 텍스트에는 프로그램 코드와 상수가 정의되어 있으며 읽기만 가능한 메모리 영역이다. 데이터는 정적 변수가 저장되어 있는 영역이고 스택은 동적으로 할당되는 데이터, 함수 내의 변수, 함수의 리턴 어드레스 등이 저장되는 영역이다. 

ps에서 보는 프로세스 정보는 ‘/proc/PID/’의 정보를 보여주는 것이다. ‘/proc/PID/status’의 내용을 확인해 보자. ps의 VSZ는 가상 메모리에서 사용중인 모든 메모리를 합친 VmSize를 보여준다. 그러나 top에서 SIZE는 코드, 데이터, 스택을 합친 크기를 보여준다. 가상 메모리는 커널에서 자동으로 조절하기 때문에 문제가 생길 일은 없으며 RSS를 통해서 실제 물리적 메모리에서 사용하는 메모리 양을 알 수 있다. 그리고 SIZE와 RSS 필드에는 페이지 테이블과 프로세스의 task_struct는 포함되어 있지 않은데 최소 12KB의 메모리를 항상 사용한다.

2.3 vmstat를 이용한 메모리와 디스크 I/O 확인

# vmstat 5 5
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
7 0 0 96940 1588 14712 337044 0 9 18 27 116 40 3 0 96
4 0 0 96940 1648 14700 336172 0 0 805 118 197 260 91 9 0
1 1 0 96940 1588 14700 335680 0 0 1000 106 203 268 93 7 0
3 1 0 96940 1708 14496 334652 0 0 1273 604 220 272 94 6 0
vmstat를 이용하여 CPU와 I/O 활동을 모니터링할 수 있는데 vmstat에서 나오는 첫 줄은 부팅 이후의 각 통계치에 대한 평균값을 보여주므로 무시하고 두 번째 줄부터 통계를 보면 된다. vmstat에서 중요한 것은 procs 영역의 b 필드이다. r은 현재 실행중인 프로세스 수이고 b는 인터럽트가 불가능한 sleep 상태에 있는 프로세스로 I/O 처리를 하는 동안 블럭 처리된 프로세스이며 w는 강제로 스왑아웃된 프로세스 수이다. si와 so는 스왑인, 스왑아웃을 말한다. 

스왑아웃이 지속적으로 발생한다면 메모리가 부족한 것이다. 그러나 일정 간격을 두고 주기적으로 스왑아웃이 발생하는 것은 정상적인 일이다. BSD 시스템에서는 비상호 대화적인 작업을 스왑아웃 한다. 현재 실행하고 있는 프로그램에서 스왑아웃이 계속 발생한다면 프로그램이 멈출 수도 있으며 심각하게 메모리가 부족하다는 것을 의미한다. 스왑아웃필드(so)는 항상 0에 가까워야 한다. 그렇지 않다면 프로세스들은 가상 메모리를 놓고 경쟁하게 되며 시스템은 페이징 상태가 된다. 페이징 활동은 심각한 가용 메모리(free)의 부족과 직접적인 관련을 가지며 간접적으로는 시스템의 높은 CPU 사용 시간 비율(sy)과 관련이 있다. 프로세스가 시작할 때 항상 이미지와 데이터를 page-in 해야 하므로 page-in 열에서 높은 숫자가 항상 심각한 것은 아니라는 사실은 기억하고 있어야 한다.

시스템에서 사용하는 시간이 지나치고 높으면(50퍼센트 이상) 디스크 I/O에서 문제가 있을 가능성이 크다. 시스템 전체의 부하가 높은데 CPU에서 휴지시간(idle time, id 항목)이 일반적으로 10퍼센트를 넘는다면 I/O나 메모리에 문제가 있을 가능성이 크다. 휴지시간(id)이 항상 0이라면 CPU를 100퍼센트 사용하고 있는 상태이다. CPU의 기능을 최대한 활용하는 것은 좋은 현상이다. 그런데 항상 100퍼센트로 활용중인 상태라면 어떤 작업이 계속 축적되고 있다는 것이며 CPU가 과부하를 가진다는 의미한다. 이 때는 CPU를 계속 사용하고 있는 프로세스를 찾아야 하며 디스크의 활동이 분산되지 않았다면 I/O 작업을 효율적으로 분산시켜야 한다. 

대부분의 사용자가 vmstat에서 si, so(스왑인, 스왑 아웃)를 주로 보고 id가 넉넉하면 시스템에 무리가 없는 것으로 생각한다. 이는 시스템의 상황에 대해서 잘못 파악할 가능성이 많은 것으로 b의 수치가 높은 경우 I/O작업을 위해 CPU가 계속 대기 상태로 있는 경우이다. 이런 경우에는 디스크 I/O 문제를 확인해야 한다. 

2.4 nice를 이용한 우선 순위 조정

nice는 프로세스의 우선 순위를 조정하는 것이다. 그런데 시스템에 문제가 있는 경우 nice를 이용하는 것은 임시방편일 뿐이다. 부하가 계속 증가한다면 nice를 이용하는 것에도 한계가 있다. 시스템을 업그레이드하거나 부하를 분산할 시스템을 구입해야 한다. 

커널이나 프로그램의 컴파일을 하는 경우에도 nice를 이용하면 조금이나마 속도의 향상이 있다. 그렇지만 때로는 nice를 잘못 사용하여 문제가 생길 수 있으니 조심해야 한다. 예를 들어 오라클에서는 오라클 사용자 프로세스와 백그라운드 프로세스들을 같은 우선 순위에 유지해야 한다. 오라클 DB의 설계가 그러한 우선 순위로 되어 있기 때문이다. 우선 순위를 변경할 경우 내용과 반응 시간에 원하지 않는 효과를 초래할 수도 있다. 예를 들어 로그 작성 프로세스(LGWR, log write process)에 낮은 우선 순위를 부여할 경우, 이 프로세스는 충분한 횟수만큼 작동하지 못하고 LGWR은 병목현상을 일으키게 된다. 반대로 LGWR이 높은 우선 순위를 부여받게 되면, 사용자 프로세스는 느린 반응시간에 시달리게 될 것이다. 세부적인 원리를 이해하지 못한채 이런 기능을 사용하면 시스템에 커다른 문제가 생길 수 있다는 것을 꼭 기억하기 바란다.

2.5 free를 이용한 자유 메모리 확인과 버퍼 캐쉬

메모리를 점검하기 위해 흔히 free를 사용한다. 그런데 free의 결과를 잘못 이해하면 전혀 이상한 결과를 초래할 수 있다.

$ free
total used free shared buffers cached
Mem: 513368 508316 5052 0 12688 339436
-/+ buffers/cache: 156192 357176
Swap: 1028152 96940 931212

먼저 버퍼 캐쉬에 대하여 알아보자(kldp.org/Translations/html/SysAdminGuide-KLDP/buffer-cache.html 참조) 디스크를 읽는 일은 메모리를 읽는 것보다 아주 느리다. 더구나 디스크의 동일한 영역을 짧은 시간 동안 반복해서 계속 읽는 일은 아주 빈번하다. 예를 들어, 누군가 e메일 메시지를 읽고, 답장을 하기 위해 편집기로 불러들이고, 그걸 보내기 위해 메일 프로그램에게 다시 읽게 하는 과정을 생각해 보자. 또한 ‘ls’와 같은 명령어를 시스템의 모든 사용자들이 얼마나 자주 사용할지 생각해 보자. 따라서 디스크로부터 한번 읽어들인 정보를 메모리에 상당시간 보관한다면 읽을 때만 시간이 소요될 뿐 속도가 전반적으로 빨라질 것이다. 바로 이런 것을 가리켜 디스크 버퍼링(disk buffering)이라고 하며, 이런 목적으로 쓰이는 메모리를 버퍼 캐쉬(buffer cache)라고 부른다. 

그러나 메모리는 아쉽게도 한정되어 있는 중요한 자원이기 때문에 버퍼 캐쉬는 일반적으로 큰 크기를 가질 수 없다. 즉, 우리에게 필요한 모든 데이터를 담아둘 수 있을 정도로 크지는 않다. 따라서 캐쉬가 가득 채워지면 오랫동안 쓰이지 않은 데이터는 버려지며 그 빈 공간을 새로운 데이터가 채우게 된다.

이런 디스크 버퍼링은 쓰기에도 똑같이 적용된다. 데이터들은 쓰여지자 마자 곧바로 다시 읽혀지므로(예를 들어, 소스 코드 파일은 일단 파일로 저장된 후, 컴파일러에 의해 다시 읽혀진다), 이런 데이터들을 캐쉬에 넣어두는 것이 효율적이다. 또한 쓰기 작업을 디스크에 직접 하지 않고 캐쉬에 넣어두면, 프로그램들이 그만큼 출력을 빨리 끝낼 수 있기 때문에 전반적인 시스템 성능 향상에도 도움이 된다. 

대부분의 운영체제들이 버퍼 캐쉬를 갖고 있기는 하지만 모두 위와 같은 원리로 동작하는 것은 아니다. 한가지 방법은 ‘write-through’라는 것인데, 이 방법은 쓰기를 할 때면 언제나 디스크에도 즉시 기록하는 것이다(물론 캐쉬에도 남겨둔다). 또 다른 방법은 write-back이라 불리는 것으로 일단 캐쉬에 기록해 두었다가 나중에 한꺼번에 디스크에 기록하는 방식이다. 효율적이기는 write-back 방식이 뛰어나지만, 대신 약간의 에러가 발생할 소지가 있다. 즉, 시스템이 갑자기 멈춰버린다거나, 갑자기 전원이 꺼진다거나 캐쉬 내용을 미처 기록해 두기 전에 플로피 디스크를 빼 버린다면, 캐쉬에 담겨 있던 내용들은 고스란히 없어져 버리고 만다. 특히 손실된 정보가 파일 시스템 유지에 필요한 데이터였다면, 자칫 전체 파일 시스템을 망가뜨리고 마는 결과를 초래할 수도 있다. 

그런데 사실상 캐쉬는 파일을 버퍼링하는 것은 아니고, 실제로는 디스크 입출력의 가장 작은 단위인 블럭을 버퍼링한다(리눅스에서는 보통 1KB 크기이다). 그러므로 디렉토리라든가, 수퍼 블럭들, 다른 파일 시스템의 유지 데이터, 심지어 파일 시스템이 없는 디스크까지도 캐쉬될 수 있는 것이다. 

캐쉬의 효율성은 기본적으로 그 크기에 좌우된다. 캐쉬의 크기가 너무 작으면 다른 데이터를 캐쉬하기 위해서 캐쉬된 데이터를 계속 내보내야 하므로, 사실상 작은 캐쉬는 별 쓸모가 없는 셈이다. 캐쉬의 최소 크기는 얼마나 많은 데이터가 읽고 씌여지는 지와, 같은 데이터가 얼마나 자주 액세스 되는지에 달려있는데 이것을 알아보기 위한 유일한 방법은 실험해 보는 것 뿐이다. 

만일 캐쉬의 크기가 고정되어 있다면, 그 크기가 너무 큰 것도 곤란한 일이다. 캐쉬가 너무 크면 여유 메모리는 그만큼 줄어들 것이고, 많은 스와핑을 일으켜서 시스템은 느려지게 된다. 리눅스는 자동적으로 모든 램의 빈공간을 버퍼 캐쉬로 사용하여 메모리의 효율성을 높이려 하는데, 프로그램들이 많은 메모리를 필요로 할 때는 자동적으로 캐쉬를 크기를 줄여 준다. 그래서 완전 자동화된 리눅스는 캐쉬를 사용하는 데 있어서 전혀 신경쓸 필요가 없는 OS인 것이다. 다만 셧다운 할 때와 플로피를 빼낼 때의 절차는 꼭 지켜야 한다. 

위와 같이 디스크 접근을 줄여 시스템의 성능을 향상시킬 목적으로 있는 것이 버퍼 캐쉬이다. 만일 캐쉬의 크기가 고정되어 있다면 그 크기가 너무 커도 메모리 부족 현상이 생길 수 있고 지나친 스와핑을 발생하게 해서 시스템이 느려질 가능성이 크다. 리눅스에서는 자동적으로 모든 램의 빈 공간을 버퍼 캐쉬로 사용하여 메모리를 효율성을 높이고 있으며 프로그램에서 많은 메모리를 필요로 하는 경우에는 자동으로 캐쉬의 크기를 줄인다. 위에서 실제로 사용 가능한 메모리는 ‘free+buffers+cached’이다. 다음 내용을 보면 현재 메모리를 알아볼 수 있는 원리를 잘 반영하고 있다. 

-/+ buffers/cache: 156192 357176 

자 그러면 이제 올바른 답을 내릴 수 있을 것이다. 현재 여유가 있는 메모리는 ‘free+buffers+cached’를 합친 양으로 위의 소스에서는 357M이다. 그리고 전체 열에 나오는 수치도 실제 물리적인 램 양보다는 약간 적은 양이 표시된다. 왜냐하면 커널이 자체적으로 사용하고 있는 메모리를 뺀 양이기 때문이다.

2.6 iostat와 sar 활용한 디스크 I/O 및 시스템 모니터링


vmstat 명령을 통해 I/O부하를 확인할 수 있다는 것을 알았다. 그런데 여러 개의 하드 디스크를 사용하는 경우 vmstat를 이용해서는 어느 디스크에서 속도가 느리거나 병목 현상이 생기는지 확인을 할 수 없다. 다만 디스크 전체의 평균값만 나타내기 때문이다. 이런 경우에 사용할 수 있는 프로그램이 iostat이다. iostat 프로그램은 레드햇 6.2에는 기본으로 들어있지 않지만 레드햇 7.0 이후 버전에는 기본으로 들어있다(배포본은 6.2이지만 커널은 2.4대에 보안 및 reiserfs, lvm패치 등을 사용하고 있다). iostat는 sysstat라는 패키지에 들어있으며 현재 설치되지 않은 경우에는 다음 사이트에서 다운로드 받을 수 있다.


http://perso.wanadoo.fr/sebastien.godard/ 


http://freshmeat.net/에서 검색을 해도 된다.




# lynx ftp://metalab.unc.edu/pub/Linux/system/status/sysstat-4.0.1-1.i386.rpm


# rpm -Uvh sysstat-4.0.1-1.i386.rpm 


sysstat ##################################################




# rpm -ql sysstat


/usr/bin/iostat


/usr/bin/isag


/usr/bin/mpstat


/usr/bin/sar


/usr/lib/sa/sa1


/usr/lib/sa/sa2


/usr/lib/sa/sadc


/usr/man/man1/iostat.1


/usr/man/man1/isag.1


/usr/man/man1/mpstat.1


/usr/man/man1/sar.1


/usr/man/man8/sa1.8


/usr/man/man8/sa2.8


/usr/man/man8/sadc.8


/usr/share/locale/de/LC_MESSAGES/sysstat.mo


/usr/share/locale/es/LC_MESSAGES/sysstat.mo


/usr/share/locale/fr/LC_MESSAGES/sysstat.mo


/usr/share/locale/pt/LC_MESSAGES/sysstat.mo


/var/log/sa



리스트 4. sysstat 프로그램 설치 




iostat만이 아니라 isag, mpstat, sar, sa1, sa2, sadc 등의 프로그램이 같이 들어있다. 여기서 iostat와 sar는 다른 유닉스에서도 시스템 모니터링을 위해서 자주 사용하고 있는 프로그램이다. 여기서도 iostat와 sar을 같이 살펴보겠다.




# iostat 


Linux 2.4.4 (tunelinux.pe.kr) 07/17/01




avg-cpu: %user %nice %sys %idle


0.30 0.00 27.30 72.40




Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn


dev8-0 252.20 4.80 60099.20 24 300496


dev8-1 0.00 0.00 0.00 0 0


dev8-2 379.80 48880.00 9.60 244400 48


dev8-3 0.00 0.00 0.00 0 0



리스트 5. iostat 이용하여 디스크 I/O 모니터링하기




위에서 보듯이 iostat는 CPU와 디스크 I/O에 대한 통계를 보여준다. CPU가 여러 개 있는 SMP 시스템에서 CPU 통계는 모든 프로세스를 합한 평균값을 나타낸다. 사용자 모드(응용 프로그램), nice 우선권을 가진 사용자 모드, 시스템 모드(커널), CPU idle 시간으로 통계를 보여준다. CPU 관련 통계는 다른 프로그램을 이용해도 확인을 할 수 있으므로 여기에서 관심이 가는 것은 디스크 드라이브에 대한 통계이다. 여기에서는 현재 네 개의 디바이스가 있다. 출력한 결과가 나타내는 의미는 다음가 같다.




Tps

해당 디바이스에 대한 초당 전송 숫자인데, 여기서는 디바이스에 대한 I/O 요청을 말한다


Blk_read/s

해당 디바이스에서 초당 읽은 블럭 수


Blk_wrtn/s

해당 디바이스에서 초당 기록한 블럭 수


Blk_read

전체 읽은 총 블럭 수


Blk_wrtn

전체 기록한 총 블럭 수



표 2. iostat 의 모니터링 대상




이외에도 초당 읽은 섹터 수, 디바이스에 요청한 평균 크기(섹터 단위) 디바이스에 요청한 평균 큐의 크기, 해당 디바이스 I/O요청을 했을 때의 CPU 시간 등도 모니터링이 가능하다. 그런데 이 기능을 위해서는 커널 패치가 필요한데 아직까지 2.4 버전은 보이지 않는 것 같다. 리눅스에서는 아직까지 디스크 어카운팅 기능이 부족해서 각 블럭 디바이스에 대한 KB/s는 기본적으로 사용하지 못하고 있다고 프로그램 제작자는 지적하고 있다. 그래서 위에서 확장된 다른 기능을 보기 위해서는 커널 패치를 해야 한다는 것이다. ‘/proc/stat’와 ‘/proc/partitions’가 iostat 패키지와 연관된 파일이다. 솔라리스에도 iostat 프로그램이 있는데 여기에서는 ‘-xn’이라는 옵션을 이용하여 큐에서 기다린 시간, 디스크의 바쁜 정도, 평균 서비스 시간 등을 확인할 수 있다. 큐에서 서비스를 받기 위해 기다린 시간을 통해 디스크 병목 여부를 판단하고 디스크의 바쁜 정도의 변화에 따른 응답 시간 변화를 살펴 볼 수 있다.


Sysstat 패키지에 같이 들어있는 모니터링 프로그램 중 하나인 sar 프로그램은 시스템의 다양한 활동에 대하여 모니터링을 할 수 있는데 모니터링 대상이 상당히 넓은 편이다. 기본값은 CPU 활동에 대한 통계를 출력한다. sar는 각종 활동에 대한 통계를 다른 프로그램을 이용하여 파일로 저장하고 통계치를 출력할 수 있는 기능을 제공한다. 




# sar –A 5


Linux 2.4.4 (tunelinux.pe.kr) 07/17/01




02:31:58 AM proc/s


02:32:03 AM 0.00




02:31:58 AM cswch/s


02:32:03 AM 8.80




02:31:58 AM CPU %user %nice %system %idle


02:32:03 AM all 0.00 0.00 0.20 99.80


02:32:03 AM 0 0.00 0.00 0.40 99.60


02:32:03 AM 1 0.00 0.00 0.00 100.00



리스트 5. sar 이용한 시스템 모니터링




sar에서 모니터링 가능한 항목은 다음과 같다.




- I/O 전송량


- 페이징


- 프로세스 생성 숫자


- 블락 디바이스 활동


- 인터럽트


- 네트워크 통계


- run 큐 및 시스템 부하 평균


- 메모리와 스왑 공간 활용 통계


- 메모리 통계


- CPU 이용도


- 특정 프로세스에 대한 CPU 이용도


- inode, 파일, 기타 커널 테이블에 대한 상태


- 시스템 스위칭 활동(context switch)


- 스와핑 통계


- 특정 프로세스 통계


- 특정 프로세스의 자식 프로세스 통계


- TTY 디바이스 활동




sar을 이용해 iostat와 비슷하게 I/O통계를 낼 수 있음은 물론 위의 내용과 같이 다양한 시스템 상태를 모니터링할 수 있다. 일반적인 리눅스 서적이나 자료에는 iostat나 sar에 대한 소개가 거의 없는 편이어서 아직까지는 사용하는 사람이 적은 듯 하다. 예를 들어 메모리 규모에 맞게 최대 열 수 있는 파일 갯수 (file-max)와 아이노드 개수를 조정하는데 sar를 이용하여 실제 얼마나 파일 핸들을 사용했는지 최대 file-max와 실제 사용한 파일 핸들의 비율 등도 통계를 낼 수가 있다. 이러한 통계를 주기적으로 내어 적절하게 활용하기 바란다. 참고로 최대 파일 핸들의 경우 4M당 256개로 잡아주고 아이노드 개수는 이의 3-4배 정도로 설정을 한다. file-max 는 /proc/sys/fs/file-max 를 이용하여 설정하며 /proc/sys/fs/file-nr 파일을 이용 현재 할당된 파일수를 확인할 수 있다.




# sar -v 5 5


Linux 2.4.4 (tunelinux.pe.kr) 07/17/01




03:30:21 dentunusd file-sz %file-sz inode-sz super-sz %super-sz dquot-sz %dquot-sz rtsig-sz %rtsig-sz


03:30:26 97582 92 0.28 92582 8 3.12 0 0.00 0 0.00


03:30:31 97582 93 0.28 92600 8 3.12 0 0.00 0 0.00


03:30:36 97582 93 0.28 92610 8 3.12 0 0.00 0 0.00


03:30:41 97582 93 0.28 92622 8 3.12 0 0.00 0 0.00


03:30:46 97582 93 0.28 92636 8 3.12 0 0.00 0 0.00


Average: 97582 93 0.28 92610 8 3.12 0 0.00 0 0.00



리스트 6. sar 이용하여 파일 및 아이노드 상황 모니터링




2.7 df 이용하여 하드 디스크 공간 확인하기


df는 현재 시스템에 마운트된 드라이브의 빈 디스크 공간을 보여준다. 간단한 프로그램이므로 길게 설명할 필요는 없지만 한가지 알아두어야 할 것이 블락 크기이다. 리눅스에서 기본 블락 크기는 1,024byte이다. df, du 등을 사용할 때 블락 크기를 잘못 지정하면 나오는 결과에 대하여 잘못 파악할 수 있는 가능성이 있다. (물론 아래처럼 블락 크기를 바꾸어서 내용을 보는 경우는 거의 없을 것이라 생각이 된다) 지나친 노파심일수 있겠지만 컴퓨터에서는 기본 단위에 대해 잘못 파악을 하는 경우 전혀 엉뚱한 일이 생길 수 있는 것은 한두가지가 아닐 것이다.




리스트 7. df 이용하여 하드 디스크 공간 확인하기


# df --block-size=512


Filesystem 512-blocks Used Available Use% Mounted on


/dev/sda2 4032088 1607824 2219440 42% /


/dev/sda1 124386 21972 95992 19% /boot


/dev/sda4 12444672 5684496 6128024 48% /home


/dev/sdc2 34265688 2748664 29776384 8% /var


tmpfs 4185192 0 4185192 0% /dev/shm




# df


Filesystem 1k-blocks Used Available Use% Mounted on


/dev/sda2 2016044 803912 1109720 42% /


/dev/sda1 62193 10986 47996 19% /boot


/dev/sda4 6222336 2842248 3064012 48% /home


/dev/sdc2 17132844 1374332 14888192 8% /var


tmpfs 2092596 0 2092596 0% /dev/shm

Posted by kissuu
,

Environment

Program

Version

 Window window7

 python

 Python 3.6.4

 cx_freeze 

 5.1.1




Troubleshooting

Execution

Command 

Description

 python 으로 실행시

 python example.py

 정상적으로 실행됨

 executable file로 실행시

 example.exe

error 1)

 tk_agg error


error 2)

 import _tkinter # If this fails your Python may not be configured for Tk



Solution

1. Source Code
1
2
3
4
import numpy as np
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
cs


2. Setup Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import sys
import matplotlib
from cx_Freeze import setup, Executable
from pip._vendor.requests import packages
 
# <added>
import os.path
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'= os.path.join(PYTHON_INSTALL_DIR, 'tcl''tcl8.6')
os.environ['TK_LIBRARY'= os.path.join(PYTHON_INSTALL_DIR, 'tcl''tk8.6')
 
 
if __name__ == '__main__':
    build_exe_options = dict(
            #compressed = True,
            packages = ["matplotlib","tkinter"],
            includes = ["sys","matplotlib.pyplot","numpy.core._methods","numpy.lib.format"],
            #include_files = []
            include_files = [r"C:\Python\Python36\DLLs\tcl86t.dll",
                 r"C:\Python\Python36\DLLs\tk86t.dll"]
    )
 
    base = None
    if sys.platform == "win32":
        base = "Win32GUI"
 
    setup(
        name = "HelloTest",
        version = "1.0",
        author="kissuu",
        description = "It is test code to check matplotlib",
        options = {"build_exe": build_exe_options},
        #options = {"build_exe": {"packages":["tkinter"]}},
        #options={"build_exe": {"includes": includes, "include_files": include_files}},
        executables = [Executable("../../Hello/src/Hello.py", base=base, targetName="hello.exe")]
    )
cs



Ref.

https://stackoverflow.com/questions/43568915/import-tkinter-if-this-fails-your-python-may-not-be-configured-for-tk



'Language > Python' 카테고리의 다른 글

[Python] 추천 IDE  (0) 2020.03.23
Posted by kissuu
,

Ref. : http://www.autoelectronics.co.kr/article/articleView.asp?idx=1953


유럽의 선진 자동차 관련 기업들은 일찍부터 자동차 보안 관련 프로젝트를 진행해왔다. 그 중 하나가 EVITA이다. EVITA 프로젝트의 출범 이유와 요구사항, 관련 기술 및 시큐리티 프레임워크의 하드웨어 기술인 HSM 설계를 소개한다. 이를 통해 자동차 보안에 대한 관심과 연구개발이 더욱 활발해지기를 바란다.


1. Background

현시점에서 자동차의 전장부품 연구는 크게 두 가지 방향으로 진행 중이다. 하나는 차량 통신의 통합이고, 다른 하나는 기능의 중앙 집중화다. 차량에 적용되는 통신 기법은 다양하다. CAN, LIN, FlexRay, MOST등이 있고, Ethernet을 도입하려는 연구 역시 활발하다. Ethernet의 적용은 여러 통신방식을 통합할 수 있는 기술로서 주목받고 있다. 이와 더불어 차량의 여러 ECU를 통합하려는 연구 역시 활발하게 진행 중이다. 70개가 넘는 ECU의 기능을 통합하고 그 수를 줄임으로써 자동차의 중량을 줄이고 ECU관리를 효율적으로 할 수 있다. 여기에 전장부품 개발을 위한 표준 제정 및 인터페이스 표준화를 통해 개발을 용이하게 하고 여러 공급사들이 각 소프트웨어의 일부 모듈을 개발해 생산할 수 있는 형태로 진행 중이다.

기존 차량 통신은 차량 내부의 전장부품간 통신으로 국한됐던 반면, 점차 차량 간 통신(V2V), 차와 센터 간 통신(V2I), 차와 개인 휴대단말기 간 통신(V2N) 등 자동차와 외부 시스템간 통신을 요구하는 기능이 개발되고 있다.

이러한 차량 외부 통신으로 인해 자동차 보안은 새로운 국면을 맞고 있다. 자동차 보안에서는 차량 내부 정보의 보안과 여러 기능이 안전하게 수행되는 것이 중요하기 때문에 차량 내부에서 사용되는 데이터의 무결성, 확실성, 신뢰성을 요구하게 된다. 이러한 요구사항을 만족하기 위해서는 각 기능의 보안 요구 수준에 따라 해당 프로그램을 수행하는 영역을 다르게 하는 방법, 인터페이스의 분리 등의 추상화 기능, 효율적 보안 기능 수행을 위한 하드웨어 지원 등 복합적인 기술이 필요하다.

EVITA(E-safety Vehicle Intrusion proTected Applications) 프로젝트는 이와 같은 자동차 환경의 변화에 따라 요구되는 차량 보안을 위해 암호화 과정에서 사용되는 정보나 차량 제어, 사용자 정보 등 중요한 정보들을 해킹이나 도청 등으로부터 보호하기 위한 시스템 설계 및 인터페이스 설계 등을 목적으로 The seventh European Framework Program에서 2008년 10월부터 2011년 12월까지 진행한 프로젝트다.

이 글은 EVITA의 목적과 범위를 알아보고, 목적에 부합하는 요구사항의 기술, 그에 따라 필요한 기술의 정리와 더불어 하드웨어 지원의 필요성 및 하드웨어 기능 영역, 그리고 EVITA에서 진행했던 기술 적용 예시를 알아본다.


2. EVITA 목적과 범위

EVITA 명세서의 목적은 현재와 미래에 필요한 애플리케이션을 개발할 때 보안기능을 만족시키는 요구사항을 기술하고, 이를 토대로 시큐리티 프레임워크(security framework)를 정의하는 데 있다.

새로운 애플리케이션의 보안 요구사항이 늘어남에 따라 시큐리티 프레임워크는 다양한 애플리케이션 기능의 보안이 가능하도록 설계돼야 한다. 이는 새로운 기능이나 새로운 요구사항이 추가될 때 기존의 시큐리티 프레임워크에 적용이 쉽게 진행되도록 설계됨을 의미한다. 효과적이고 유지하기 쉬운 설계를 위해서 다음과 같은 내용이 충족돼야 한다.

- 적용되는 보안 기능들의 표준화
- 보안 기능의 단계적 설정 가능
- 다른 차량 기기로의 쉬운 이식
- 자동차의 수명 주기 동안 지속적으로 업데이트가 가능할 것
- 새로운 보안 기능 및 요구사항의 통합 및 확장
- 애플리케이션 개발자가 쉽게 사용 및 적용이 가능할 것
- 각 모듈별로 여러 보안 수준 적용이 가능할 것

위에서 언급한 내용은 전장부품의 보안에 초점을 맞추고 있다. 이는 차량 간 통신이나 차량과 외부 기지국 혹은 서비스 서버등과의 통신 설계는 포함되지 않는다.

위와 같은 목적을 통해서 EVITA는 여러 모듈이나 인터페이스 형태로 보안 기능을 제공한다. 이는 애플리케이션 개발자가 사용하기에 용이하도록 설계돼야 한다. 또한 기능에 따라 소프트웨어와 하드웨어 형태의 기능으로 구성돼야 한다. 이에 대해 간단히 요약하면 다음과 같다.

- 사용자의 인증과 권한 제어를 전장부품에 쉽게 적용 가능
- 통신 제어, 멀웨어 방지, 침입 확인 및 대응 기술 제공
- 데이터나 애플리케이션, 계산 수행 과정의 구획화 및 분리
- 개인정보와 중요 정보의 은닉 기능
- 보안정책과 업데이트에 대한 일관적인 관리
- 차량 내에 신뢰할 수 없는 애플리케이션의 동작을 한정적으로 운영되도록 하는 환경 제공
- 인증과 권한 제어를 담당하는 소프트웨어 모듈
- 보안 저장 기능 및 암호의 가속, 연산의 보안 등을 담당하는 하드웨어 모듈


3. Requirement

차량 내에서 동작하는 전장부품은 다양한 통신방식을 제공하고 있으며, 최근의 화두인 멀티미디어 데이터 통신을 위해 보다 빠르고 차량 외부 시스템과 통신할 수 있는 기술이 연구되고 있다. 하지만, 저 사양 혹은 단순 기능을 제공하는 센서를 위해 LIN, CAN과 같은 통신 방식 역시 여전히 사용된다. 이러한 통신방식은 보안을 위한 기술 적용이 돼 있지 않고 아직 개발 중이다.
그 이유는 CAN이나 LIN의 경우, 기본적인 구조로 인해 보안 성능을 높이기 위한 기존 기법들이 네트워크에 상당한 과부화를 유발하기 때문이다.

예를 들어 특정 CAN Message에 대한 인증을 위해 Message Authentication Code(MAC)를 추가로 보내면, CAN Message는 최대 8 byte이므로 Message Authentication Code의 크기에 따라 추가로 전송하는 message가 발생하게 된다. 예컨대 MAC의 크기가 16 byte이면 한 개의 CAN Message의 인증을 위해 추가로 2개의 CAN Message를 전송해야 한다. 이는 현재 CAN 네트워크의 bus load로 볼 때 엄청난 부담이 될 수밖에 없다.

EVITA 프로젝트는 앞서 언급한 것과 같은 차량에서 위협이 될 수 있는 요소 및 보안 사항에 대한 분석과 적용 가능 기술을 파악한 후 요구사항을 정리했다. 이는 다음과 같은 목적이 있다.

- 전장부품 내에 허가되지 않은 통신을 허락하지 않는다.
- 보안이나 모바일 커머스 등의 애플리케이션에 대한 허가되지 않은 업데이트 및 수정을 금지한다.
- 운전자의 개인정보를 보호한다.
- 제조업체 및 보급품의 지적재산권을 보호한다.

위와 같은 목적을 기반으로 8개의 기능적 요구사항이 도출된다.

1. 보안 연관 이벤트의 무결성: 특정 중요 정보를 다루는 동작들은 무결성과 신뢰성이 기반이 된 상태에서 이루어진다.
2. ECU의 펌웨어 설정 및 설치의 무결성: ECU의 펌웨어 추가, 업데이트 혹은 전장부품의 새로운 설정은 무결성과 신뢰성이 기반이 된 상태에서 이루어진다. 특히 무결성과 신뢰성을 가지는 보안 모듈에 대해서 더욱 보호가 되어야 한다.
3. 안전한 실행 환경: 보안이 신뢰할 수 있는 연산 영역이 존재하여 외부침입에 의한 연산 오류로부터 보호돼야 한다.
4. 차량 접근 제어: 자동차 동작 기능 및 정보들에 접근이 통제돼야 한다.
5. 소프트웨어 동작의 신뢰성: 조작된 설정에 의해 소프트웨어가 오동작을 일으키지 않아야 한다.
6. 애플리케이션이 사용하는 정보가 기밀성 유지 및 접근 제어를 위한 저장 기능에 의해 관리돼야 한다.
7. 차량 내부 및 외부 통신에 대한 기밀성: 통신 시 보안 기능이 있어서 송수신되는 정보의 기밀성이 유지돼야 한다.
8. 개인정보보호 정책이 존재해야 한다.

EVITA 프로젝트는 위와 같은 8가지 보안 요구사항과 이러한 보안 기능으로 인해 성능 저하가 발생하면 안 된다는 기능 요구사항을 정의했다. 따라서 이에 대한 보안기능들을 살펴보고, 요구사항에 맞는 기능들을 분석 적용해서 시큐리티 프레임워크에 대한 구조를 설계했다.


4. Security Framework 설계를 위한 보안 기술

시큐리티 프레임워크 설계는 다양한 보안 기술에 대한 이해가 필요하다. EVITA에서 설계한 시큐리티 프레임워크를 이해하기 위해서는 여러 관점에서 시큐리티 프레임워크의 구성을 파악하고 분류하면서 필요한 기술을 파악하는 것이 필요하다. EVITA에서는 시큐리티 프레임워크 구성을 위한 기술을 네트워크 보안 기술호스트 기반의 보안 기술로 나누어 분석했다.

[네트워크 보안 설계]는 일반적으로, 보안을 위한 통신 프로토콜 기술과 네트워크상에서 연결을 위한 자원에서 구현되는 보안 기술이 있다. 이러한 기술들은 네트워크의 구성에 따라 보안 영역이 결정되고 각 호스트의 보안을 공유한다.

[호스트 기반의 설계]는 종단 간 보안 설계 기술을 포함한다. 각 호스트에서 사용하게 되는 보안 기술로는 대표적으로 데이터 암호화 기술이 이에 속한다. 데이터 암호화 기술은 네트워크를 구성하는 두 호스트 간에 데이터를 송수신 할 때, 보내는 쪽에서는 암호화하고 중간의 전송 과정에는 아무 조건이 없고 이를 수신하는 측에서 올바른 방법으로 복호화 하는 방식이다. 이와 같이 호스트 기반의 기술들은 종단 간 보안 기능으로 구성된다.

EVITA는 또 다른 관점에서 시큐리티 프레임워크의 보안 기능을 수행하는 계층을 구분했는데, 이는 보안 기능의 애플리케이션, 보안 기반의 운영체제, 보안 기반의 추상화 프로그램의 형태로 분류했다.

애플리케이션 보안의 경우, 보안에 관련된 기능을 하부 계층과 관계없이 사용하게 되고 독립적인 데이터 처리를 수행한다.
보안 기반의 운영체제에서는 신뢰성있는 연산 영역을 운영하는 기능을 포함한다. 예를 들어 보안 기능의 메모리 영역 설정, 시스템 콜의 제어 기능 등을 가지고 운영체제의 판단에 따라 이를 제어하게 된다.

보안 기반의 추상화 프로그램은 주로 데이터 흐름의 제어를 담당하는 기능을 포함한다. 데이터 흐름을 물리적 전장부품에 대한 제약에서 벗어나 여러 전장부품의 자원을 공유하고, 이에 대한 보안을 위한 인증 및 제어 기능을 제공한다.

위에서 언급한 여러 기능을 구현하기 위해서 암호화 모듈, 인증 모듈, 보안 네트워크 통신 모듈, 권한 모듈 등 다양한 기능들을 토대로 시큐리티 프레임워크가 설계됐고, 실제 개발을 위한 전개 과정에서 특성에 따라 소프트웨어로 구현될 부분과 하드웨어로 구현될 부분을 나누어 기술하고 있다.


5.H/W 기반의 보안 기술

시큐리티 프레임워크를 설계할 때 기밀 유지나 연산의 신뢰성, 성능에 대한 요구사항을 만족시키기 위해 다양한 보안 기술이 필요하다. 특히 Trusted Computing, Cryptographic Hardware, Smartcards, Tamper Protection, Physically Unclonable Functions 등의 하드웨어로 구현되는 기술들이 필요하다. 이 중 EVITA에서 정의하는 HSM(Hardware Secure Module)에서는 Trusted Computing과 Cryptographic Hardware 기능을 제공했다.

Trusted computing은 연산의 신뢰성을 위해 사용된다. 이 기술은 운영체제에서 필요로 하는 보안 기술과 더불어 보안이 취약한 응용 프로그램과의 연동이나 분산화 되어 있는 환경에서 사용되는데, 이를 좀 더 자세히 살펴보면 Trusted Platform Module이라 불리는 암호화 기능과 Core Root of Trust for Measurement라 불리는 pre-BIOS 기능, 애플리케이션과 운영체제 사이의 보안 인터페이스 기능을 하는 Trusted Software Stack 등으로 나뉜다.

Trusted Platform Module은 기능 동작을 위해 필요한 연산을 보안이 유지되는 곳에서 수행하는 것을 의미한다. 이에 대한 세부 기능으로는 다음과 같은 것들이 있다.

- 하드웨어 기반의 난수 발생
- 암호화 엔진
- 해시 함수 엔진
- 보안저장매체(ROM, RAM, EEPROM)

Core Root of Trust Measurement는 전장부품의 부팅 시 변조나 허가받지 않은 소프트웨어가 동작하는 것을 방지하는 기능이다. 부팅 과정에서 전장부품의 이전 저장되어 있는 상태와 비교해 변동 사항이 없음을 확인함으로써 전장부품에 대한 침입이 없음을 증명하게 된다.
Trusted Software Stack은 보안 운영체제나 애플리케이션에게 제공되는 보안 기능들에 대한 소프트웨어 모듈이나 컴포넌트를 의미한다. 이를 위해 암호화 인터페이스를 제공하고 보안 동작을 위한 보안 키를 관리한다.

이밖에 위에서 언급한 Trusted Computing을 다루는 소스들이 존재하여 운영체제나 애플리케이션들이 해당 소스를 이용해 Trusted computing 기능을 사용하게 된다.

Trusted computing 외에 암호화 엔진이 사용되는 또 다른 이유는 암호화 가속 기능으로 기존의 기능처리 시간 요구사항을 만족시키기 위함이다. 암호화처럼 계산 양이 많고 복잡한 계산을 소프트웨어로 구현할 경우 많은 자원을 사용하며 시간이 많이 소모된다.

이 경우 원래 기능의 시간적 요구사항을 만족시키지 못하는 문제가 발생할 수 있고 저 사양 전장부품의 경우 해당 문제가 더 빈번하게 발생할 수 있다. 따라서 암호화 기능이 필요한 부분에 하드웨어 지원이 필요하다.



6. 전장부품 통신 환경에 필요한 보안 H/W

자동차 전장부품의 통신 환경은 여러 통신 기술들의 집중화와 다양성이 커지면서 탄력적이고 여러 단계를 제공하는 보안 기술이 요구된다. 다양한 보안 기술을 제공하기 위해서 보안 하드웨어가 제공돼야 한다. 여러 단계의 보안 기술을 적용하기 위해서 자동차에 존재하는 전장부품을 ECU와 센서, 액추에이터로 분류할 수 있다. 이는 각 전장부품의 역할과 성능에 대한 요구사항이 다르기 때문이다.

예를 들어 ECU와 센서 사이의 통신에는 우선 각 전장부품이 공용 키를 가지고 있어야 한다. 이 공용 키는 통신을 위해 계속 사용돼야 하는 키이므로 비휘발성 저장매체에 저장돼야 하기 때문에 보안 기능이 있는 비휘발성 저장매체가 각 전장부품에 존재해야 한다. 그리고 통신을 통한 정보 이동에서 암호화 기능이 필요하므로 양쪽에 암호화 모듈이 필요하다. 이는 사양에 따라 하드웨어 혹은 소프트웨어로 구현된다.

이외에 통신의 주체에 대한 확신을 위해 Message Authentication Code와 같이 인증 기능이 요구된다. ECU의 경우, 위에서 언급한 기능들을 수행하기 위해 독립적인 타이머나 프로세서, 난수 발생 모듈 등의 기능이 필요하다. 반면, 센서의 경우 ECU와 같은 고 사양의 전장부품이 아니므로 암호화모듈이 소프트웨어로 제공되거나 내부 RAM에 보안 기능이 없을 수 있다. ECU의 경우에도 어떤 기능의 ECU인가에 따라서 요구되는 기능이 달라질 수 있다.


7. HSM 일반적 구조

HSM은 자동차에서 보안을 위해 필요한 기능 중 하드웨어로 구현되는 부분을 말한다. 여기에는 보안 기능을 위한 코프로세서가 동작하도록 설계돼 있다. 이에 대한 설계도는 그림 1과 같다.

save image

HSM은 암호화 기능을 포함하고 명확성을 확인하는 기능과 전자서명 기능을 포함했다. 이 뿐만 아니라 난수 발생 기능과 비대칭 암호화 엔진도 포함돼 있다. 이러한 암호화 기능 이외에 보안 저장매체 기능이 존재하고, 이를 동작시키기 위한 CPU가 포함됐다. 그리고 보안 기능들을 애플리케이션에서 사용할 수 있도록 인터페이스가 존재한다. 그런데 실제 HSM을 구현하는 과정에서 인터페이스를 구현하는 방식에 따라 아래와 같이 분류할 수 있고 장단점이 존재한다. EVITA에서는 여러 구현방식에 대해 장단점을 파악하고 시큐리티 프레임워크 설계에 맞는 방식을 택했다.

- HSM 칩이 주 CPU와 분리된 경우: HSM과 주 CPU가 다른 칩으로 구성돼 있어서 추가적인 핀이 필요하고, 그에 따라 가격도 올라간다. 게다가 안전성도 떨어지게 된다. 이는 두 연결 핀이 해킹 가능한 지점이 되기 때문이다. 이 경우는 사용기간이 짧은 전장부품이나 보안 요구도가 낮은 애플리케이션을 구동할 때 사용할 수 있다.

- HSM과 주 CPU가 한 칩에 있지만 HSM이 상태 기계(state machine)에 따라 동작하는 경우: 위에서 언급한 인터페이스 방식보다 보안이 유지되고 경제적이지만 HSM의 동작이 고정적이다. 새로운 암호 알고리즘이나 업데이트 등이 불가능하다.

- HSM과 주 CPU가 한 칩에 있고 HSM이 프로그래밍 가능한 경우: HSM에 programmable CPU가 적용돼 있어서 암호화 기능에 대해 다양한 구현이 가능하다.

따라서 다양한 외부 애플리케이션에서 보안 기능을 사용할 수 있고 새로운 암호 알고리즘이나 동작에 대한 업데이트가 용이하다. EVITA의 요구사항을 만족하기 위해서는 이와 같은 형태의 HSM이 구성돼야 한다.

EVITA의 요구사항에서 언급한 바와 같이, 보안 기능은 다양한 성능을 선택 가능하게 하는 설계가 요구되는데, 이는 가격적인 측면에서도 중요하다. 자동차에 들어가는 전장부품 중 그 필요 기능에 따라 하드웨어 성능도 다르게 설계돼야 가격적인 면을 고려할 수 있게 된다. 따라서 EVITA에서는 HSM의 보안수준을 3종류(full, medium, light)로 구분했다. 그림 2는 전장부품마다 필요한 HSM의 보안 수준을 나타낸다.

헤드 유닛처럼 V2X 메시지를 처리하는 경우는 빠른 비대칭 암호화 처리 및 키관리, 인증 기능 등이 필요하므로 full HSM이 필요하고, 각 ECU의 경우 비대칭 암호의 처리는 상대적으로 덜 중요하고 대칭키 암호화 처리나 키 관리 등의 기능을 수행하기 위해서 medium HSM이 사용된다. 센서나 액추에이터와 같이 상대적으로 저 사양 및 보안 요구사항이 낮은 경우 light를 사용한다.

'차차차 > Safety' 카테고리의 다른 글

Safety란?  (0) 2017.09.26
Posted by kissuu
,