개발자 튜토리얼: K패치로 데비안 10 Linux Kernel 라이브 패치하기
라이브 패치는 Kernel을 재시작하지 않고, 따라서 시스템을 재부팅할 필요 없이 Linux Kernel을 업데이트하는 방법입니다. 라이브 패치는 다음과 같은 이유로 심각한 Linux Kernel 취약성을 지체 없이 패치하는 데 자주 사용됩니다. 라이브 패치는 운영 중단을 일으키지 않으며 유지 보수 기간이 필요하지 않습니다..
몇 가지 라이브 패치 도구가 있으며, Debian 운영 체제 사용자는 라이브 패치를 구현하거나 Kernel을 조정하기 위해 kpatch를 사용하기도 합니다.
이 튜토리얼은 kpatch의 실제 데모입니다. 실행 중인 데비안 10 Kernel을 중지하지 않고 실행 중인 데비안 10 Kernel의 동작을 변경하기 위해 kpatch를 사용하여 다음과 같은 내용을 변경하는 방법을 보여드리겠습니다. /proc/uptime (그리고 uptime 명령)의 내용을 변경하여 시스템의 보고된 가동 시간이 10년 더 길어지도록 하는 방법을 보여드리겠습니다.
kpatch는 Red Hat에서 만들었으며 Red Hat Enterprise Linux(RHEL) 및 그 파생 제품에서 작동합니다. Red Hat은 RHEL 고객을 위해 이 상용 라이브 패치 서비스를 제공합니다. TuxCare에서는 RHEL을 라이브 패치할 수 있는 KernelCare Enterprise - 를 제공하며, 이 서비스는 RHEL뿐만 아니라 다른 모든 인기 있는 엔터프라이즈 Linux 배포판에 라이브 패치를 적용할 수 있습니다.
이 튜토리얼에서 kpatch를 선택한 이유는 다음과 같습니다. 소스 코드 가 무료로 제공되고 정기적으로 업데이트되기 때문입니다.
전제 조건
이 튜토리얼을 따르기 위한 시스템 사전 요구 사항은 다음과 같습니다:
- x86_64/amd64 아키텍처에서 Debian Bullseye(이 데모에는 11.6이 사용됨)를 실행하는 테스트(비프로덕션) 시스템
- 20Gb의 디스크 여유 공간(Linux Kernel 소스 코드는 디스크에서 약 909MB를 차지하며 컴파일 시 17GB로 증가)
- Kernel을 커스터마이징하지 않았으며, 데비안에서 제공하는 표준 Kernel을 사용하고 있습니다.
- Kernel에는 라이브 패치가 내장되어 있습니다. 이 명령을 사용하면 두 개의 값이 다음과 같이 설정됩니다. y 로 설정된 config_have_livepatch 와 config_livepatch:
grep LIVEPATCH /boot/config-$(uname -r)
- 설치된 gcc 버전이 원래 Kernel을 빌드하는 데 사용된 것과 일치합니다 ( kpatch-build 명령은 버전이 일치하지 않으면 실패합니다. 이 문제는 옵션을 사용하여 재정의할 수 있습니다. -skip-gcc-check사용은 권장하지 않습니다.)
- 설치된 gcc 버전을 확인합니다: gcc -version
- 현재 Kernel을 컴파일하는 데 사용된 gcc의 버전을 확인합니다: cat /proc/version
-
종속성 패키지 설치
- 설치 및 구성 sudo
As root:
apt-get install sudo (sudo should already be installed, but this makes sure of it) adduser <user> sudo
where <user> is the username for a normal user (all subsequent commands should be done as this user)
2. 패키지 설치
3.sudo apt-get -y 업데이트
4.sudo apt-get -y 업그레이드
5.sudo apt-get -y install build-essential devscripts ccache gawk libelf-dev libssl-dev Linux 소스 Linux-이미지-$(uname -r)-dbg
-
kpatch 설치
데비안의 패키지에서 흔히 볼 수 있듯이, 현재 버전과 정기적인 apt를 통해 업데이트로 제공되는 버전 사이에는 지연이 있습니다. 가장 최신의 kpatch 코드를 가져와 소스에서 빌드해 보겠습니다.
git clone https://github.com/dynup/kpatch.git CD K패치 && 메이크 && sudo 메이크 설치
-
Linux Kernel 소스 코드 사본 받기
- (선택 사항) 작업 디렉터리를 만들어 이동합니다.
mkdir Kernel && cd $_
- Linux Kernel 소스 코드 추출
tar xaf /usr/src/linux-source-5.10.tar.xz
참고: 5.10은 이 글을 작성할 당시 Debian 11.6의 Linux Kernel 버전입니다. 다음 위치에 있는 최신 버전을 확인하여 대체해야 합니다. /usr/src
-
Linux Kernel 구성 파일 생성
- Linux Kernel은 배포와 함께 제공된 구성 파일의 설정을 사용하여 컴파일됩니다. 복사본을 가져와서 일부 설정을 변경하여 kpatch-build 가 실행 중인 Kernel과 동일한 설정으로 Linux Kernel을 컴파일할 수 있도록 설정을 변경하세요.
- CD Linux 소스-5.10
cp /boot/config-$(uname -r) .config
- kpatch를 사용하기 위해 필요한 Kernel 설정이 활성화되어 있는지 확인합니다. 모두 'Y'를 반환해야 합니다.
-
scripts/config -s DYNAMIC_FTRACE_WITH_REGS
-
스크립트/설정 -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_ALL
-
스크립트/설정 -s 라이브패치
-
스크립트/컨피그 -s 모듈
-
스크립트/설정 -s MODULE_SIG
-
스크립트/컨피그 -s SYSFS
스크립트/컨피그 -s SYSTEM_TRUSTED_KEYRING
- Kernel 구성 항목의 값을 변경합니다.
scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
- 소스 디렉터리를 그대로 둡니다.
cd .
-
패치 만들기
패치 소스 파일은 diff 명령이 원본 및 변경된 소스 코드 파일에서 실행된 결과입니다.
'빠른 시작' 섹션에 표시된 패치 예제는 kpatch 깃허브 페이지 의 출력을 변경합니다. /proc/meminfo. 다른 많은 kpatch 문서에서 이 예제를 재현하고 있기 때문에 저는 조금 더 흥미롭고 안전하면서도 다른 것을 원했습니다.
이 예제는 uptime 명령의 출력을 변경하여 서버의 가동 시간이 10년 증가한 것처럼 보이도록 합니다.
- 작업 디렉터리에 있는 파일을 복사합니다.
cp linux-source-4.19/fs/proc/uptime.c .
- 수정합니다. 33줄에서 변경합니다:
(부호 없는 긴) uptime.tv_sec,
에
(부호 없는 긴) uptime.tv_sec + 315576000,
파일 저장
- 패치 파일 만들기
diff -u linux-source-5.10/fs/proc/uptime.c ./uptime.c > uptime.patch
- 패치 모듈을 생성합니다. (처음 이 작업을 수행할 때는 Kernel 소스 코드를 컴파일해야 하므로 시간이 다소 걸립니다. 이후 빌드는 몇 분 단위로 훨씬 더 빠릅니다. 이 작업은 문제에 더 많은 (가상) CPU를 투입하면 프로세스 속도를 높이는 데 도움이 되는 작업 중 하나입니다. 이 작업은 CPU에 바인딩된 작업입니다).
kpatch-build -s linux-source-5.10 -v /usr/lib/debug/lib/modules/$(uname -r)/vmlinux uptime.patch
- 완료되면 Linux 로드 가능한 Kernel 모듈 파일(.ko) 패치를 위한
ls -l *.ko
-
패치 테스트
- 패치 모듈을 로드하기 전에 현재 가동 시간을 확인하세요.
cat /proc/uptime && uptime -p
- 패치 모듈 로드
sudo kpatch load livepatch-uptime.ko
- 가동 시간 다시 확인
cat /proc/uptime && uptime -p
가동 시간이 10년 이상 개선된 것을 확인할 수 있을 것입니다(내부 값은 변경되지 않았으며 인쇄된 값만 변경됨).
- 패치 모듈 언로드
sudo kpatch 언로드 라이브패치업타임.ko
- 가동 시간이 이전 값으로 돌아갔는지 확인합니다.
cat /proc/uptime && uptime -p
결론
kpatch로 Linux Kernel을 실시간으로 패치하는 것은 어렵지 않습니다. 어려운 점은 시스템을 중단시키지 않고 나중에 제공되는 다른 패치와 함께 작동할 수 있는 패치를 작성하는 것입니다. 대부분의 패치는 단순한 파일 변경이 아닌 diff 를 통해 만들어지며 다양한 배포판에서 실행되는 여러 Kernel 버전에 대한 철저한 테스트가 필요합니다.
패치 작성자는 숙련된 C 프로그래머이자 숙련된 Linux Kernel 개발자여야 합니다. Kernel을 컴파일하고 모든 Kernel 버전에 대한 패치를 테스트하려면 하드웨어와 자동화 도구에 많은 투자가 필요합니다.
기술의 희귀성과 인프라 비용으로 인해 공급업체는 고가의 유지 보수 프로그램을 통해 제공되는 실시간 패치 서비스에 대한 비용을 청구해야 합니다.
이러한 요금은 큰 금액이 될 수 있지만, Linux의 경우 서버당 연간 $49.50부터 시작하는 TuxCare의 라이브 패치 서비스는 그렇지 않습니다. 자세히 알아보려면 여기를 클릭하세요. 에서 Linux 커널, 데이터베이스, 공유 라이브러리, IoT 디바이스 및 가상화 시스템을 위한 TuxCare의 다양한 라이브 패치 서비스에 대해 자세히 알아보세요.
그리고 Linux Kernel 보안 패치 적용 방법에 대한 명시적인 가이드도 읽어보세요: 3가지 방법. 이 문서에서는 재부팅하지 않고 Linux Kernel을 업데이트하는 방법을 설명하며, 가장 많이 사용되는 몇 가지 Linux Kernel에 대한 세 가지 방법을 다룹니다.