강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

리눅스보안기본#2 : 커널 업데이트 및 패치

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

커널 업데이트 및 패치

 

리눅스 커널이라는 용어는 자주 들어왔지만 실제로 커널 컴파일 및 패치는 초보자에게 두려움의 용어라 할 수 있다.

 

왜냐하면 잘못 설정했다가는 아예 부팅조차 안 될 수 있기 때문이다.

 

더군다나 최근과 같이 서버가 IDC등 원격지에 위치하고 있다면 더더욱 문제가 될 것이다.

 

따라서 커널 컴파일을 제대로 할 수 있는가, 없는가에 따라 초급과 중급자로 나누기도 한다.

 

하지만 그럼에도 불구하고 서버관리자라면 더군다나 보안에 관심 있는 관리자라면 커널 컴파일 및 패치는 반드시 하여야 한다. 왜냐하면 리눅스 커널은 매우 우수하지만 빈번하게 보안취약성과 이를 이용한 공격코드가 발표되고 있는 것이 사실이기 때문이다.

 

 

물론 모든 취약성에 대해 공격코드가 존재하는 것은 아니지만 아래의 URL에 접속해 보면 리눅스 및 커널과 관련하여 수 백 개의 취약성이 공개된 것을 확인할 수 있다.

 

 

http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=linux

http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=kernel

 

CVE? : 어떠한 시스템에 대한 침입 행위를 방어하고자 보안제품 및 서비스를 제공하는 보안업체 간에 동일하게 사용할 수 있고, 전 세계 수많은 보안제품에 일반적으로 적용할 수 있도록 표준화시킨 시스템 취약성 및 해킹패턴, 정보노출 등의 명칭.

 

 

 

(1) 커널의 개요

흔히들 리눅스를 서버로 사용하는 유저에게 리눅스의 버전이 어떻게 되냐고 물으면 페도라7” 또는 센토스 5.0”이라고 말한다.

 

그러나 엄격히 말한다면 이는 틀린 대답인데, 왜냐하면 이는 단지 레드햇 등 일부 배포판 업체나 기관에서 커널을 기반으로 GNU 유틸리티와 각 벤더의 유틸리티를 포함하여 패키징을 한 배포판에 붙인 임의의 버전일 뿐이며 실제로 리누스(Linus)가 관리하며 발표하는 리눅스(커널)와는 직접적으로 관계가 없기 때문이다.

 

리눅스는 그 자체로, 일반적으로 이야기하는 넒은 범위의 리눅스라는 운영 체제의 핵심 부분이라 할 수 있는 커널을 뜻하는 것이며, 따라서 정확하게 이야기한다면 리눅스란 커널을 뜻하는 것이다.

 

그러나 일반적으로는 커널 및 각종 패키지를 포함한 각 벤더의 배포판을 그냥 리눅스라 칭하기도 한다.

 

커널에 대해서는 공식 홈페이지인 http://www.kernel.org/ 에 접속하면 자세한 정보를 확인할 수 있는데, 현재 커널은 2.4.x 버전과 2.6.x 버전이 개발되고 있다.

 

최근 배포판은 기본적으로 2.6.x 커널이 설치되는 등 2.4.x에서 2.6.x 버전을 많이 사용하는 추세이다.

 

현재 시스템의 커널버전은 다음의 명령어로 확인해 볼 수 있다.

 

 

“uname -r”

“sysctl -n kernel.osrelease“

“cat /proc/version"

 

만약 커널 버전을 속이거나 다른 문구를 추가하고자 할 경우에는 다음과 같이 하면 된다.

 

. 먼저 커널 소스가 있는 /usr/src/linux 디렉토리로 이동하여 vi등으로 Makefile을 읽어본다.

 

여기에 보면 다음과 같은 부분이 있는데, 이는 커널 컴파일 시 2.6.xx 버전이 됨을 뜻한다. 만약 다른 버전으로 보이고 싶다면 이를 적당히 수정 후 커널 컴파일을 하면 된다.

 

.

 

VERSION = 2

PATCHLEVEL = 6

SUBLEVEL = xx

EXTRAVERSION =

 

만약 커널 컴파일 후 버전이 2.10.xx-secured라고 보이고자 한다면 다음과 같이 하면 될 것이다.

 

 

VERSION = 2

PATCHLEVEL = 10

SUBLEVEL = xx

EXTRAVERSION =-secured

 

 

(2) 커널 컴파일 및 패치방법

 

현재 설정되어 있는 커널에 취약성이 발견되어 업그레이드나 패치를 하려고 한다.

 

업그레이드를 하기 위해서는 직접 소스파일을 다운로드하여 설치하는 방법과 kernel 관련 rpm 파일을 다운로드하는 방법이 있는데, 권장하는 방법은 소스를 이용하여 직접 설치하는 방법이다.

 

 

소스 컴파일로 업데이트 설치방법

 

소스컴파일로 설치를 하려면 kernel 소스파일을 다운로드하기 위해

http://ftp.kernel.org/pub/linux/kernel/에 접속하여 적당한 파일을 다운로드하면 된다.

 

.

 

이후 /usr/src 디렉토리에서 다음과 같이 작업하면 된다.

 

.

[root@www /usr/src]# rm -f linux

[root@www /usr/src]# tar zxvfp linux-2.6.xx.tar.gz

[root@www /usr/src]# ln -s linux-2.6.xx linux

[root@www //usr/src]# cd /usr/src/linux

[root@www /usr/src/linux]# make menuconfig

[root@www /usr/src/linux]# make ; make install

/etc/lilo.conf 설정 변경 후 아래와 같이 실행한다.(LILO 이용 시)

[root@www /boot]# /sbin/lilo

만약 원격지에서 서버관리를 하는 경우, 숙련자들도 새로운 커널로 적용할 때 정상적으로 부팅이 될 지 자신이 없을 때가 있다.

 

이러한 경우 새롭게 커널을 재 컴파일한 후 새로운 커널이 정상적으로 작동하는지 확인하기 위해 default로 설정하지 말고, lilo.conf에 추가만 한 후

# lilo -R 새로운커널label panic=10

 

와 같이 명령을 준 후 reboot하면 새로운커널label로 부팅을 진행하다가 만약 커널의 에러로 패닉(kernel panic)이 일어나면, 자동으로 리부팅 되면서 default 커널로 부팅하므로 안심해도 된다.

 

. 새로운 커널로 정상적으로 부팅되면 이후 default로 설정하면 된다.

 

.

grub을 이용할 때의 fallback 기능에 대해서는 아래 URL을 참고하기 바란다.

http://www.gnu.org/software/grub/manual/html_node/Booting-fallback-systems.html

 

초기에는 부트로더로 lilo를 많이 사용했지만 최근에는 grub를 많이 사용하는 추세이다.

 

그러나 개인적인 성향에 따라 혼합해서 사용할 수 있고 일부 시스템의 경우 동시에 설정이 되어 있는 경우가 있는데, 현재의 시스템이 grub으로 부팅한 것인지 아니면 lilo로 부팅했는지 확인해 보아야 할 경우 다음과 같이 확인할 수 있다.

 

 

여기에서는 루트파티션이 /dev/sda라고 가정하겠다.

 

# grub으로 부팅하였을 경우

[root@server root]# dd if=/dev/sda count=1 | od -s

0000566 GRUB

0000574 Geom

0000601 Hard Disk

0000613 Read

0000620 Error

1+0개의 레코드를 입력하였습니다

1+0개의 레코드를 출력하였습니다

 

# lilo로 부팅하였을 경우

[root@server root]# dd if=/dev/sda count=1 | od -s

1+0개의 레코드를 입력하였습니다

1+0개의 레코드를 출력하였습니다

 

만약, 부트로더로 grub 또는 lilo로 변경하려면 각각 다음과 같이 실행하면 된다.

 

.

# grub으로 부팅하고자 할 경우

[root@server root]# grub-install /dev/sda

 

# lilo로 부팅하고자 할 경우

[root@server root]# lilo

 

 

여기에서 “make menuconfig”를 실행 후 설정 옵션에 주의하여야 하는데, 특히 다음 옵션에 주의하여야 한다.

 

- 적절한 CPU타입 선택

 

현재 시스템의 cpu에 맞는 타입을 선택하여야 한다. 만약 cpu 선택 메뉴에서 386을 사용하면 모든 cpu에서 사용 가능하나 Pentium-III를 선택하면 펜티엄이나 486의 경우에는 사용할 수 없게 되니 주의하여야 한다.

 

, 자신의 현재 사양보다 낮은 타입을 선택할 수는 있으나 현재 사양보다 높은 타입은 선택할 수 없는 것이다.

 

물론 현재 사양보다 낮은 타입을 선택하면 그 정도의 성능밖에 낼 수 없으므로 정확한 타입을 선택하는 것이 좋다.

 

현재의 시스템에서 어떤 cpu를 사용하는지 잘 모르겠으면 “cat /proc/cpuinfo”로 확인하면 된다.

 

.

 

- SMP(Symmetric Multi-Processing) 지원여부

 

현재 시스템이 single cpu인지 아니면 dual cpu인지에 따라 선택 사항이 다소 달라진다. single cpu인데 SMP를 선택하거나, dual cpu인데 SMP를 선택하지 않는 것은 시스템의 안정성이나 성능 상으로 좋지 않다.

 

이 역시 부팅 시 메시지나 cat /proc/cpuinfo로 확인하면 된다.

 

.

 

- 파일 시스템

 

리눅스에서 사용할 파일 시스템을 적절히 선택하여야 한다. 특히 파일 시스템을 잘못 선택하거나 모듈로 설정할 경우 부팅이 되지 않을 수도 있으니 주의하여야 한다.

 

만약 동일한 시스템이 여러 개 있을 경우 일일이 동일한 컴파일 작업을 반복할 필요가 없다. /usr/src/linux/ 에 있는 .config 파일을 그대로 복사해서 컴파일해도 되고 (이는 한 시스템에서 커널 버전을 업그레이드할 때도 마찬가지이다.

 

) 간단히 커널 이미지(vmlinuz)만 복사해서 부팅해도 무방하다.

 

rpm으로 커널 업데이트 방법

 

앞의 방법이 일일이 커널컴파일 메뉴를 선택해야 한다는 부담이 있는 반면 모듈 기반의 rpm 커널을 그대로 이용하는 방법도 고려해 볼 수 있다.

 

가장 쉽게 이용할 수 있는 방법은 yum을 이용하는 것으로 간단히 다음과 같이 실행하여 설치하면 자동으로 설치가 완료된다.

 

.

 

# yum -y update kernel*

 

만약 yum이 작동하지 않을 경우 커널 관련 rpm 파일을 직접 다운로드하여 설치하는 방법도 고려할 수 있다.

 

yum이나 rpm으로 설치할 경우 /boot/vmlinuz System.map등 몇 가지 링크가 생성되고 /etc/grub 등에 자동으로 추가되므로 별도의 설정 없이 재부팅만 하면 된다.

 

는 장점이 있다.

 

 

rpm 파일의 경우 다음과 같이 실행해 보면 설치 전에 어떤 경로에 어떤 파일이 설치되는지 미리 알 수 있다.

 

 

# rpm -pql kernel-2.6.18-53.1.13.el5.x86_64.rpm

# rpm2cpio kernel-2.6.18-53.1.13.el5.x86_64.rpm | cpio -idmv

# less kernel-2.6.18-53.1.13.el5.x86_64.rpm

/boot/System.map-2.6.18-53.1.13.el5

/boot/config-2.6.18-53.1.13.el5

/boot/symvers-2.6.18-53.1.13.el5.gz

/boot/vmlinuz-2.6.18-53.1.13.el5

....

 

또한 설치 전 의존성 관계도 파악할 수 있다.

 

 

 

# rpm -pqR kernel-2.6.18-53.1.13.el5.x86_64.rpm

rpmlib(VersionedDependencies) <= 3.0.3-1

initscripts >= 8.11.1-1

mkinitrd >= 4.2.21-1

 

커널 패치방법

 

앞의 두 방법은 완전히 새로운 커널 소스나 rpm을 가져와 상위 버전으로 설치를 하는 것인데, 그렇지 않고 패치만 하고자 할 때가 있다.

 

, 현재 시스템이 2.6.23인데, 여기에서 2.6.25로 업그레이드하고자 할 때 2.6.25의 모든 소스를 가져와 설치하는 것이 아니라 2.6.23에서 2.6.25사이에 변경된 패치 파일만 가지고 와서 업데이트 하는 방법이다.

 

패치 파일은 rpm으로 제공되지 않고 커널 소스로만 제공되며 커널 소스와 마찬가지로

http://ftp.kernel.org/pub/linux/kernel/에 접속하여 다운로드하면 된다.

 

.

 

먼저 커널 2.6.23 소스가 있는 /usr/src/linux로 이동하여 패치 파일의 압축을 gzip -d로 해제한 후

 

[root@www /usr/src/linux]# patch -p1 < patch-2.6.24

으로 2.6.232.6.24로 패치한다. 그리고

 

[root@www /usr/src/linux]# patch -p1 < patch-2.6.25

2.6.242.6.25로 추가 패치한다. , 2.6.23에서 2.6.25로 패치를 하려면 2.6.23에서 바로 2.6.25로 패치 할 수 없고, 2.6.23->2.6.24->2.6.25 순으로 순서대로 패치 하여야 한다는 것이다.

 

이후 make menuconfig를 실행하면 커널 버전이 2.6.25로 보이는 것을 알 수 있을 것이다.

 

 

현재 운영 중인 커널이 직접 소스 컴파일한 버전인지 아니면 rpm 커널인지 확인하려면 uname -a 또는 다음과 같이 실행하면 알 수 있다.

 

 

# cat /proc/version

Linux version 2.6.18-53.1.13.el5 (mockbuild@builder6.centos.org)

# rpm -q kernel

kernel-2.6.18-53.1.13.el5

 

위와 같이 커널버전과 kernel명이 일치하고 cnetos에서 빌더한 것이므로 위의 커널은 rpm커널인 것을 알 수 있다.

 

또한 rpm커널과 관련해서 잘못 알고 있는 것이 하나 있다.

 

이를테면 20082월초에 2.6.24 이하 버전에 vmsplice 커널 취약성이 발견되어 2.6.24 이상 버전으로 업그레이드를 하여야 하는 경우 현재의 2.6.18 rpm 커널은 업그레이드를 하여야 할까? 이는 해당 rpmchangelog를 확인해 보면 이미 해당 취약점이 패치된 버전임을 알 수 있다.

 

, rpm 커널의 경우 major 버전을 수시로 업그레이드 하지 않고 패치건이 있을 경우 minor 버전만을 업그레이드 하는데, 아래의 경우 2.6.18을 기반으로 수차례 패치하여

2.6.18-53.1.13과 같은 버전이 된 것이다.

 

# rpm -q --changelog kernel-2.6.18-53.1.13.el5

* 213 2008 Karanbir Singh <kbsingh@centos.org>

- Rebuild for CentOS, change key to CentOS

 

* 212 2008 Don Howard <dhoward@redhat.com> [2.6.18-53.1.13]

- revert to 2.6.18-53.1.6.el5

- [x86_64] kernel vmsplice_to_pipe flaw (Alexander Viro ) {CVE-2008-0600}

 

 

이외 기존의 리눅스 커널 자체에 커널 패치를 통해 보안 기능을 추가하여 더욱 다양한 기능을 활용하고자 할 때에는 아래의 URL을 참고하기 바란다.

 

- openwall project : http://www.openwall.com/linux/

- lids : http://www.lids.org/

- grsecurity : http://www.grsecurity.net/

 

특히 grsecurity에서는 활발하게 다양한 보안 기능이 추가되고 있다.

 

[그림] grsecurity 홈페이지

보안의 핵심 프로세스는 지속적인 관리

 

지금까지 리눅스 서버의 보안을 강화하기 위한 몇 가지 방법과 절차에 대해 간단히 알아보았지만 보안의 가장 중요한 부분은 역시 지속적인 관심과 관리라는 것을 느꼈을 것이다.

 

당장 전문적인 관리자가 아니더라도 자신의 시스템에 관심을 갖고 시스템에서 발생하는 현상에 관심을 기울인다면 조금씩 자신의 시스템에 익숙해지는 자신을 발견할 수 있을 것이다.

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,043 명
  • 현재 강좌수 :  35,853 개
  • 현재 접속자 :  110 명