[Redhat] 다운 받은 패키지 YUM REPOSITORY 구성
CVE 보안 패치용 RPM 패키지를 이용해 로컬 YUM 리포지토리를 구성하고, 여러 시스템에 손쉽게 업데이트하는 방법을 단계별로 설명합니다.
로컬 YUM 리포지토리를 구성하는 이유
보안 패치나 특정 패키지를 설치할 때 RPM 파일을 수동으로 다운로드한 후 yum localinstall
명령어로 설치할 수도 있지만, 의존성 문제를 해결하거나 여러 서버에 반복 배포할 경우 비효율적일 수 있습니다. YUM 리포지토리를 구성하면 패키지 관리가 자동화되어 설치와 업데이트가 훨씬 안정적으로 수행됩니다.
이번 글에서는 보안 취약점(CVE-2024-1086) 대응을 위해 준비된 18개의 패키지를 기반으로 로컬 YUM 리포지토리를 구성하고, 이를 통해 시스템에 커널 패치를 적용하는 과정을 설명합니다. CD 이미지를 이용한 방식이 아닌, 개별 패키지 기반 리포지토리 구성법입니다.
만약 CD 이미지를 local repo로 구성하는 방법을 원하시면 LOCAL REPO를 참조하실 수 있습니다.
패키지 준비 및 메타데이터 생성
먼저 설치 대상인 RPM 파일들을 한 디렉터리에 모읍니다. 예제에서는 /root/cve-2024-1086
디렉터리에 커널 및 관련 패키지 18개를 준비했습니다. 이들은 모두 동일한 보안 패치 버전(4.18.0-513.24.1.el8_9
)을 기반으로 합니다.
[root@rhel8 cve-2024-1086]# pwd /root/cve-2024-1086 [root@rhel8 cve-2024-1086]# ls bpftool-4.18.0-513.24.1.el8_9.x86_64.rpm bpftool-debuginfo-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-abi-stablelists-4.18.0-513.24.1.el8_9.noarch.rpm kernel-core-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-cross-headers-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-devel-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-doc-4.18.0-513.24.1.el8_9.noarch.rpm kernel-headers-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-modules-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-modules-extra-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-tools-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-tools-debuginfo-4.18.0-513.24.1.el8_9.x86_64.rpm kernel-tools-libs-4.18.0-513.24.1.el8_9.x86_64.rpm perf-4.18.0-513.24.1.el8_9.x86_64.rpm perf-debuginfo-4.18.0-513.24.1.el8_9.x86_64.rpm python3-perf-4.18.0-513.24.1.el8_9.x86_64.rpm python3-perf-debuginfo-4.18.0-513.24.1.el8_9.x86_64.rpm
이후 createrepo
패키지를 설치하고, 준비한 디렉터리에서 메타데이터를 생성합니다. 이는 YUM이 패키지 목록과 의존성을 인식할 수 있도록 해주는 핵심 단계입니다.
로컬 레포지토리를 생성하려면 createrepo 패키지가 필요합니다. 아래 명령어를 사용하여 설치합니다.
[root@rhel8 cve-2024-1086]# yum install createrepo -y ... Installed: createrepo_c-0.17.7-6.el8.x86_64 createrepo_c-libs-0.17.7-6.el8.x86_64 drpm-0.4.1-3.el8.x86_64 Complete!
패키지가 준비된 디렉터리에서 createrepo
명령어를 사용하여 메타데이터를 생성합니다.
[root@rhel8 cve-2024-1086]# createrepo /root/cve-2024-1086 Directory walk started Directory walk done - 18 packages Temporary output repo path: /root/cve-2024-1086/.repodata/ Preparing sqlite DBs Pool started (with 5 workers) Pool finished
메타데이터 생성 결과 확인
createrepo
명령 실행 후 디렉터리 내부를 확인해 보면 repodata
라는 하위 디렉터리가 생성된 것을 볼 수 있습니다. 이 디렉터리에는 패키지 정보를 담은 .xml.gz
및 .sqlite.bz2
파일들이 포함되어 있으며, YUM 클라이언트는 이 정보를 참조하여 패키지를 인식하고 의존성을 해결합니다.
[root@rhel8 cve-2024-1086]# tree . ├── bpftool-4.18.0-513.24.1.el8_9.x86_64.rpm ├── bpftool-debuginfo-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-abi-stablelists-4.18.0-513.24.1.el8_9.noarch.rpm ├── kernel-core-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-cross-headers-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-devel-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-doc-4.18.0-513.24.1.el8_9.noarch.rpm ├── kernel-headers-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-modules-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-modules-extra-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-tools-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-tools-debuginfo-4.18.0-513.24.1.el8_9.x86_64.rpm ├── kernel-tools-libs-4.18.0-513.24.1.el8_9.x86_64.rpm ├── perf-4.18.0-513.24.1.el8_9.x86_64.rpm ├── perf-debuginfo-4.18.0-513.24.1.el8_9.x86_64.rpm ├── python3-perf-4.18.0-513.24.1.el8_9.x86_64.rpm ├── python3-perf-debuginfo-4.18.0-513.24.1.el8_9.x86_64.rpm └── repodata ├── 788d5db18f3d135b023071e10e5f3e6fa7a60ecbc284c4de54b0764f1b6fa878-primary.sqlite.bz2 ├── a84c3d792399056c5530f29240ce29e813a0aa990351865397e4428ac59503cf-other.xml.gz ├── ae68e553964a2a388daf483f582a265dc78469698d7ac70184c1aa3cb3dc7bc0-filelists.xml.gz ├── ce8c41910479d5326bd38c50c6d684131199ff463901ec09396ab244406bf370-primary.xml.gz ├── d00a4bcc53f246cddc73d31b44d8d1ceb91534c398666789e98f19dff7eaf22b-filelists.sqlite.bz2 ├── f07daedaf8a444b2d245c3fcbe263b497777731c62e50ed924b14f3281e7a1d7-other.sqlite.bz2 └── repomd.xml 1 directory, 25 files
메타데이터가 정상적으로 생성되었다면 다음 단계로 이 디렉터리를 YUM 리포지토리로 등록할 수 있습니다.
YUM 리포지토리 등록
리포지토리를 등록하기 전 현재 등록된 저장소 목록을 확인해 봅니다. 기본적으로는 AppStream, BaseOS 같은 기본 저장소만 보일 것입니다.
[root@rhel8 yum.repos.d]# yum repolist ... repo id repo name AppStream AppStream BaseOS BaseOS [root@rhel8 yum.repos.d]#
이제 /etc/yum.repos.d/
디렉터리에 .repo
파일을 생성하여 로컬 리포지토리를 등록합니다.
[root@rhel8 cve-2024-1086]# vim /etc/yum.repos.d/cve-2014-1086.repo [cve-2024-1086] name=cve-2024-1086 repo baseurl=file:///root/cve-2024-1086 enabled=1 gpgcheck=0
등록 후 yum repolist
명령어를 다시 실행하면 새로운 리포지토리가 추가된 것을 확인할 수 있습니다.
리포지토리 등록 결과 확인
.repo
파일을 등록한 뒤 yum repolist
를 실행하면, cve-2024-1086
이라는 ID의 저장소가 목록에 표시됩니다. 이 저장소는 /root/cve-2024-1086
경로를 기준으로 패키지를 제공합니다.
[root@rhel8 cve-2024-1086]# yum repolist Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. repo id repo name AppStream AppStream BaseOS BaseOS cve-2024-1086 cve-2024-1086 repo
-v 옵션을 이용해 보면 총 18개의 패키지가 cve-2024-1086 레포에서 제공되는 걸 확인할 수 있는데 이는 /root/cve-2024-1086 디렉터리에서 제공하는 패키지 개수와 정확히 일치합니다.
[root@rhel8 cve-2024-1086]# yum repolist -v cve-2024-1086 Loaded plugins: builddep, changelog, config-manager, copr, debug, debuginfo-install, download, generate_completion_cache, groups-manager, kpatch, needs-restarting, playground, product-id, repoclosure, repodiff, repograph, repomanage, reposync, subscription-manager, system-upgrade, uploadprofile Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. YUM version: 4.7.0 cachedir: /var/cache/dnf Last metadata expiration check: 0:00:11 ago on Mon 17 Jun 2024 11:08:07 AM KST. Repo-id : cve-2024-1086 Repo-name : cve-2024-1086 repo Repo-status : enabled Repo-revision : 1718589140 Repo-updated : Mon 17 Jun 2024 10:52:20 AM KST Repo-pkgs : 18 Repo-available-pkgs: 18 Repo-size : 291 M Repo-baseurl : file:///root/cve-2024-1086 Repo-expire : 172,800 second(s) (last: Mon 17 Jun 2024 11:08:07 AM KST) Repo-filename : /etc/yum.repos.d/cve-2014-1086.repo Total packages: 18
YUM을 이용한 패키지 업데이트
이제 등록한 리포지토리를 통해 커널 패키지를 업데이트합니다. "kernel-*"
와일드카드를 사용하여 커널 관련 패키지를 한 번에 업데이트할 수 있습니다.
[root@rhel8 ~]# yum update "kernel-*" -y Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. Last metadata expiration check: 0:02:21 ago on Mon 17 Jun 2024 11:16:25 AM KST. Dependencies resolved. ================================================================================================================= Package Architecture Version Repository Size ================================================================================================================= Upgrading: kernel-headers x86_64 4.18.0-513.24.1.el8_9 cve-2024-1086 11 M kernel-tools x86_64 4.18.0-513.24.1.el8_9 cve-2024-1086 10 M kernel-tools-libs x86_64 4.18.0-513.24.1.el8_9 cve-2024-1086 10 M Installing dependencies: kernel-core x86_64 4.18.0-513.24.1.el8_9 cve-2024-1086 43 M kernel-modules x86_64 4.18.0-513.24.1.el8_9 cve-2024-1086 36 M Installing weak dependencies: kernel-devel x86_64 4.18.0-513.24.1.el8_9 cve-2024-1086 24 M Transaction Summary ================================================================================================================= ... Complete!
이 명령은 kernel-headers
, kernel-tools
, kernel-core
, kernel-modules
, kernel-devel
등 관련된 패키지를 자동으로 식별하고 설치합니다. 이때 필요한 의존성도 함께 처리되어 편리하게 패치가 적용됩니다.
업데이트 완료 후 부팅 이미지 확인
업데이트가 완료되면 새 커널 버전에 맞는 initramfs
이미지와 vmlinuz
커널 파일이 /boot
디렉터리에 생성됩니다. 이를 통해 새로운 커널이 실제로 설치되었는지를 확인할 수 있습니다.
[root@rhel8 ~]# ls /boot/ | grep 513 initramfs-4.18.0-513.24.1.el8_9.x86_64.img vmlinuz-4.18.0-513.24.1.el8_9.x86_64 ...
해당 버전이 존재하면, 이제 시스템을 재부팅하여 새 커널을 적용해야 합니다.
[root@rhel8 ~]# reboot
재부팅 후 커널 버전 확인
시스템이 재시작되면 현재 적용된 커널 버전을 확인하여 업데이트가 성공적으로 적용되었는지 검증합니다.
[root@rhel8 ~]# uname -r 4.18.0-513.24.1.el8_9.x86_64 [root@rhel8 ~]# rpm -qa | grep kernel | grep 513 kernel-tools-libs-4.18.0-513.24.1.el8_9.x86_64 kernel-tools-4.18.0-513.24.1.el8_9.x86_64 kernel-modules-4.18.0-513.24.1.el8_9.x86_64 kernel-devel-4.18.0-513.24.1.el8_9.x86_64 kernel-headers-4.18.0-513.24.1.el8_9.x86_64 kernel-core-4.18.0-513.24.1.el8_9.x86_64
마치며
로컬 YUM 리포지토리를 구성하면, 단순히 개별 패키지를 설치하는 것을 넘어 시스템 전반에 걸쳐 안정적이고 반복 가능한 배포 환경을 마련할 수 있습니다. 특히 보안 취약점(CVE) 대응과 같이 일관된 버전의 패키지를 여러 서버에 적용해야 할 경우, 이 방식은 매우 유용합니다.
물론 로컬 리포지토리를 구성하지 않고도 yum localinstall
명령어로 개별 RPM 파일을 설치할 수 있습니다. 그러나 의존성 문제 해결, 설치 자동화, 관리 효율성을 고려할 때 리포지토리를 구성하는 방법이 장기적으로 더 유리할 수 있습니다. 상황에 맞게 두 방법을 적절히 활용하시는 것을 권장드립니다.
댓글
댓글 쓰기