ClickCease 개발자 튜토리얼: Kpatch로 Oracle 엔터프라이즈 Linux 7 라이브 패치 적용 - TuxCare

인기 뉴스레터 구독하기

4,500명 이상의 Linux 및 오픈소스 전문가와 함께하세요!

한 달에 두 번. 스팸이 없습니다.

개발자 튜토리얼: Kpatch로 Oracle 엔터프라이즈 Linux 7 라이브 패치 적용하기

7월 30일 - 2020 TuxCare 홍보팀

개발자 튜토리얼-min

라이브 패치를 사용하면 시스템을 재부팅하지 않고도 Linux Kernel을 업데이트할 수 있습니다. 이 접근 방식은 중단이 전체 비즈니스에 치명적인 영향을 미칠 수 있는 중단에 민감한 서비스를 제공하는 대기업에 완벽한 솔루션입니다. 그러나 Kernel 업데이트는 취약성, 보안 문제 및 격차로 가득 찬 오늘날의 세계에서 필수입니다. 미리 Kernel을 업데이트해야만 문제 없이 원활한 비즈니스 운영을 보장할 수 있습니다.

이미 라이브 Kernel 패치 튜토리얼을 읽으셨을 수도 있습니다: Kpatch로 Debian 10 Linux Kernel 라이브 패치 하기 및 Kpatch로 Ubuntu 20.04 LTS Focal Fossa Linux Kernel 라이브 패치하기. 이 튜토리얼이 도움이 되었다면 동료 및 친구들과 공유할 수 있는 유용한 자료로 활용하세요.

이 자습서에서는 재부팅하지 않고 Kpatch를 사용하여 Oracle Enterprise Linux 7 - UEK4 Linux Kernel을 패치하는 방법을 보여드리겠습니다.

Kpatch는 Red Hat 프로젝트이며 RHEL 및 그 파생 제품에서 작동합니다. Red Hat은 각기 다른 배포판에 중점을 둔 다음 회사들과 마찬가지로 RHEL 고객을 위한 상용 라이브 패치 서비스를 제공합니다:

이 튜토리얼에서는 소스 코드가 무료로 제공되고 정기적으로 업데이트되는 Kpatch를 선택했습니다.

전제 조건

이 튜토리얼을 따르기 위한 시스템 사전 요구 사항은 다음과 같습니다.

  • x86_64/amd64 아키텍처에서 Oracle7 UEK4를 실행하는 테스트(비프로덕션) 시스템입니다.
  • 20Gb의 디스크 여유 공간. (Linux Kernel 소스 코드는 디스크에서 약 909Mb를 차지하며 컴파일 시 17Gb로 증가합니다.)
  • Kernel이 커스터마이징되지 않았으며, Debian에서 제공하는 표준 Kernel을 사용하고 있습니다.
  • Kernel에는 라이브 패치가 내장되어 있습니다. 이 명령을 사용하면 두 개의 값이 다음과 같이 설정됩니다. y 에 대한 CONFIG_HAVE_LIVEPATCH 그리고 CONFIG_LIVEPATCH:
grep LIVEPATCH /boot/config-$(uname -r)
  • 설치된 gcc 버전이 원래 Kernel을 빌드하는 데 사용된 버전과 일치합니다. (이 경우 kpatch-build 명령은 버전이 일치하지 않으면 실패합니다. 이 문제는 옵션을 사용하여 재정의할 수 있습니다. --skip-gcc-check사용은 권장하지 않습니다.)
    • 설치된 gcc 버전을 확인합니다: gcc --version (if gcc not installed run ”sudo apt install gcc”)
    • 현재 Kernel을 컴파일하는 데 사용된 gcc의 버전을 확인합니다: cat /proc/version

1. 종속성 패키지 설치

  1. 설치 및 구성 sudo.

    As root:

    apt-get install sudo
    adduser <user> sudo

    어디 <user> 는 일반 사용자의 사용자 이름입니다. (이후의 모든 명령은 이 사용자로 수행해야 합니다.)

  2. 패키지를 설치합니다.
    sudo yum install elfutils elfutils-devel
    sudo yum install pesign yum-utils zlib-디벨 binutils-디벨 newt-디벨 파이썬-디벨 
    perl-ExtUtils-임베드 감사-라이브 numactl-디벨 pciutils-디벨 들소 패치-라이브 bc rpm-build glib2-디벨
  3. libdtrace를 다운로드하여 설치합니다:
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/libdtrace-ctf-0.8.0-1.el7.x86_64.rpm
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/libdtrace-ctf-devel-0.8.0-1.el7.x86_64.rpm
    rpm -ivh libdtrace-ctf-0.8.0-1.el7.x86_64.rpm libdtrace-ctf-devel-0.8.0-1.el7.x86_64.rpm
  4. Kernel 소스 및 Kernel 개발 패키지를 다운로드하여 설치하세요:
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackageSource/kernel-uek-4.1.12-124.40.6.3.el7uek.src.rpm
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/kernel-uek-devel-4.1.12-124.40.6.3.el7uek.x86_64.rpm
    rpm -ivh Kernel-UEK-4.1.12-124.40.6.3.el7uek.x86_64.rpm --nodeps
    rpm -ivh --nodeps Kernel-UEK-devel-4.1.12-124.40.6.3.el7uek.x86_64.rpm
  5. 디버그 인포 패키지를 다운로드하여 설치합니다:
wget https://oss.oracle.com/ol7/debuginfo/kernel-uek-debuginfo-4.1.12-124.40.6.3.el7uek.x86_64.rpm
wget https://oss.oracle.com/ol7/debuginfo/kernel-uek-debuginfo-common-4.1.12-124.40.6.3.el7uek.x86_64.rpm
rpm -ivh kernel-uek-debuginfo-4.1.12-124.40.6.3.el7uek.x86_64.rpm kernel-uek-debuginfo-common-4.1.12-124.40.6.3.el7uek.x86_64.rpm

2. Kpatch 설치

git clone https://github.com/dynup/kpatch.git
cd kpatch && make && sudo make install
cd kmod && make
mkdir /lib/modules/`uname -r`/extra/kpatch
cp core/kpatch.ko /lib/modules/`uname -r`/extra/kpatch
cp core/Module.symvers /lib/modules/`uname -r`/extra/kpatch

3. Linux Kernel 소스 코드 사본 받기

Kernel 소스의 압축을 풉니다:

cd /root/rpmbuild/SOURCES
tar xfj Linux-4.1.12.tar.bz2

4. Linux Kernel 구성 파일 생성

Linux Kernel은 배포판과 함께 제공된 구성 파일의 설정을 사용하여 컴파일됩니다. 복사본을 가져와서 일부 설정을 변경하여 kpatch-build가 실행 중인 Kernel과 동일한 설정으로 Linux Kernel을 컴파일할 수 있도록 하세요.

cd linux-source-5.4.0/
cp /boot/config-$(uname -r) .config

Kpatch를 사용하기 위해 필요한 Kernel 설정이 활성화되어 있는지 확인합니다. 모두 'Y'를 반환해야 합니다.

scripts/config -s DYNAMIC_FTRACE_WITH_REGS
scripts/config -s FUNCTION_TRACER
scripts/config -s HAVE_DYNAMIC_FTRACE_WITH_REGS
scripts/config -s HAVE_FENTRY
scripts/config -s HAVE_LIVEPATCH
scripts/config -s KALLSYMS_ALL
scripts/config -s KALLSYMS
scripts/config -s LIVEPATCH
scripts/config -s MODULES
scripts/config -s MODULE_SIG
scripts/config -s SYSFS
scripts/config -s SYSTEM_TRUSTED_KEYRING

Kernel 구성 항목의 값을 변경합니다.

scripts/config --set-str SYSTEM_TRUSTED_KEYS ""

소스 디렉터리를 그대로 둡니다.

cd ..

5. 패치 만들기

패치 소스 파일은 diff 명령을 원본 및 변경된 소스 코드 파일에서 실행합니다.

'빠른 시작' 섹션에 표시된 패치 예제는 kpatch 깃허브 페이지 의 출력을 변경합니다. /proc/meminfo. 다른 많은 Kpatch 문서에서 이 예제를 재현하고 있기 때문에 저는 조금 더 흥미롭고 안전하면서도 다른 것을 원했습니다.

이 예제는 uptime 명령을 사용하여 서버 가동 시간이 10년 늘어난 것처럼 보이게 할 수 있습니다.

1. 작업 디렉터리에서 파일을 복사합니다.

cd /root/rpmbuild/SOURCES
cp linux-4.1.12/fs/proc/uptime.c .

2. 2. 편집합니다. 26줄에서 변경합니다:

(unsigned long) uptime.tv_sec,

(unsigned long) uptime.tv_sec + 315576000,

파일을 저장합니다.

3. 3. 패치 파일을 생성합니다.

diff -u linux-source-5.4.0/fs/proc/uptime.c ./uptime.c > uptime.patch

4. 패치 모듈을 생성합니다. (처음 이 작업을 수행하면 Kernel 소스 코드를 컴파일해야 하므로 몇 시간이 걸립니다. 이후 빌드는 몇 분 단위로 훨씬 더 빠릅니다.)

kpatch-build -t vmlinux -v /usr/lib/debug/boot/vmlinux-5.4.0-37-generic uptime.patch

 

5. 완료되면 패치를 위한 Linux 로드 가능 Kernel 모듈 파일 kpatch-uptime.ko가 생성됩니다.

 

6. 패치 테스트

  1. 패치 모듈을 로드하기 전에 현재 가동 시간을 확인하세요.
    cat /proc/uptime && uptime -p
  2. 패치 모듈을 로드합니다.
    # kpatch 로드 kpatch-uptime.ko
    패치 모듈 로드: kpatch-uptime.ko
  3. 가동 시간을 다시 확인하세요.
    cat /proc/uptime && uptime -p
  4. 패치 모듈을 언로드합니다.
    # kpatch 언로드 kpatch-uptime.ko
    패치 모듈 비활성화: kpatch_uptime
    패치 모듈 언로드: kpatch_uptime
  5. 가동 시간이 이전 값으로 돌아갔는지 확인합니다.
    # cat /proc/업타임 && 업타임 -p
    7215.13 27930.41
    2시간 증가

결론

Kpatch를 사용하여 Oracle 엔터프라이즈 Linux 7 - UEK4 Linux Kernel 라이브 패치 프로세스를 진행했습니다. 프로세스 자체는 매우 간단하지만 쉽지 않다는 것을 알 수 있습니다. 그리고 패치 개발이 가장 큰 어려움입니다. 패치는 시스템을 중단시키지 않아야하며 이전 및 다음 패키지와 호환되어야합니다. 여기에 다양한 Kernel 배포 및 버전, 테스트 및 지원을 추가하면 라이브 패치 도구에 대한 주목할만한 가격으로 끝날 수 있습니다.

7일 지원되는 KernelCare 무료 체험판 받기 

 

명시적인 가이드에서 Linux Kernel 보안 패치를 적용하는 세 가지 방법을 살펴볼 수 있습니다. 이 문서에서는 재부팅하지 않고 Linux Kernel을 업데이트하는 방법에 대해 설명하며, 가장 많이 사용되는 몇 가지 Linux Kernel에 대해 세 가지 방법을 다룹니다.

Kernel 재부팅, 시스템 다운타임 또는 예정된 유지 보수 기간 없이 취약성 패치를 자동화하고 싶으신가요?

TuxCare로 라이브 패치에 대해 알아보기

TuxCare 게스트 작가 되기

시작하기

메일

가입

4,500

Linux & 오픈 소스
전문가!


뉴스레터 구독하기