[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 파일을 설치할 수 있습니다. 그러나 의존성 문제 해결, 설치 자동화, 관리 효율성을 고려할 때 리포지토리를 구성하는 방법이 장기적으로 더 유리할 수 있습니다. 상황에 맞게 두 방법을 적절히 활용하시는 것을 권장드립니다.

댓글

이 블로그의 인기 게시물

[Linux] RHEL Local YUM Repository 구성

[Linux Command] sudo command 설명

[Ansible Modules] Fetch module 설명 및 활용