如何在华为云欧拉系统 ECS 实例新建私有 REPO 源并制作安全 RPM 包

写在前面


对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ------赫尔曼·黑塞《德米安》


在某些情况下,我们可能需要在华为云欧拉系统ECS实例上新建私有REPO源:

通过创建私有REPO源,您可以在本地维护和管理自己的软件包,而无需依赖公共的软件源。这对于需要在内部网络环境中部署应用程序或提供特定软件包的组织非常有用。私有REPO源还可以提供更好的访问速度和安全性。

同时可以控制软件包的分发方式。您可以选择将软件包限制为特定的用户或组织,并根据需要进行访问控制。这样可以确保只有授权的人员可以访问和使用您的软件包。

通过在华为云欧拉系统ECS实例上新建私有REPO源并制作安全的RPM包,您可以更好地管理和控制软件包的分发过程,并确保软件包的安全性和完整性。

今天和小伙伴们分享如何在华为云欧拉系统ECS 新建私有 REPO 源 并制作安全 RPM 包

安装 rpm-build

rpm-build 是一个用于构建 RPM 软件包的工具集合。RPM(Red Hat Package Manager)是一种在 Linux 发行版中使用的软件包管理系统,如Red Hat Enterprise Linux(RHEL),CentOS和Fedora。它允许您创建、安装、升级和管理系统上的软件包。

rpm-build 软件包提供了从源代码构建RPM软件包所需的工具和实用程序,其中包括规范文件(spec file)。规范文件包含有关软件包的信息以及构建和安装软件包的指令。

以下是rpm-build软件包提供的一些关键组件和实用程序:

rpmbuild:这是主要的命令行工具,用于构建RPM软件包。它接受一个规范文件作为输入,并执行构建软件包的必要步骤,包括编译源代码、创建软件包结构和生成RPM软件包文件。

rpmspec:此实用程序用于验证和解析规范文件。可以使用它在构建软件包之前检查规范文件的语法和正确性。

rpmdevtools:这是一组工具,简化了构建RPM软件包的过程。它提供了诸如

  • rpmdev-setuptree(设置构建软件包的目录结构)
  • rpmdev-newspec(生成规范文件模板)
  • rpmdev-bumpspec(更新规范文件的版本信息)等实用程序。

rpm-build-libs:此软件包包含构建RPM软件包所需的库和头文件。它为具有对 RPM 库的依赖关系的软件包提供必要的开发文件。

bash 复制代码
[root@ecs-hce ~]# yum -y  install rpm-build >> /dev/null 
retrieving repo key for base unencrypted from http://repo.huaweicloud.com/hce/2.0/os/RPM-GPG-KEY-HCE-2
Importing GPG key 0xA8DEF926:
 Userid     : "HCE <support@huaweicloud.com>"
 Fingerprint: C1BA 9CD4 9D03 A206 E241 F176 28DA 5B77 A8DE F926
 From       : http://repo.huaweicloud.com/hce/2.0/os/RPM-GPG-KEY-HCE-2
[root@ecs-hce ~]# yum -y  install rpm-devel rpmdevtools  >> /dev/null 

生成 rpm 开发目录

rpmdev-setuptreerpmdevtools 软件包中的一个实用程序,用于设置 RPM 软件包构建的目录结构。它创建了一个标准的 RPM 构建环境,包括各种必要的目录和文件。

bash 复制代码
[root@ecs-hce ~]# rpmdev-setuptree 
[root@ecs-hce ~]# ls
rpmbuild

使用 rpmdev-setuptree 命令可以在当前用户的主目录下创建以下目录:

  • ~/rpmbuild/SOURCES:用于存放源代码文件、补丁文件和其他构建所需的资源文件。
  • ~/rpmbuild/SPECS:用于存放RPM软件包的规范文件(spec file)。
  • ~/rpmbuild/BUILD:用于构建RPM软件包时的临时构建目录。
  • ~/rpmbuild/RPMS:用于存放构建完成的RPM软件包文件。
  • ~/rpmbuild/SRPMS:用于存放构建完成的源码RPM软件包文件。

创建源码路径,创建源码文件并修改权限,源码文件中写入代码

bash 复制代码
[root@ecs-hce ~]# cd /root/rpmbuild/SOURCES/
[root@ecs-hce SOURCES]# mkdir hce2-helloworld-1.0.0
[root@ecs-hce SOURCES]# touch hce2-helloworld-1.0.0/hce2-helloworld
[root@ecs-hce SOURCES]# chmod 755 hce2-helloworld-1.0.0/hce2-helloworld
[root@ecs-hce SOURCES]# vim hce2-helloworld-1.0.0/hce2-helloworld
[root@ecs-hce SOURCES]# cat hce2-helloworld-1.0.0/hce2-helloworld
!/bin/sh 
echo Hello World!

压缩源码

bash 复制代码
[root@ecs-hce SOURCES]# tar zcvf hce2-helloworld-1.0.0.tar.gz hce2-helloworld-1.0.0/
hce2-helloworld-1.0.0/
hce2-helloworld-1.0.0/hce2-helloworld

生成规范文件位置

进入/root/rpmbuild/SPECS 路径生成.spec文件,需要输入y 确认

rpmdev-newspec 是 rpmdevtools 软件包中的一个实用程序,用于生成一个新的RPM 软件包规范文件(spec file)的模板。规范文件是描述 RPM 软件包的元数据和构建指令的文本文件。

bash 复制代码
[root@ecs-hce SOURCES]# cd /root/rpmbuild/SPECS/
[root@ecs-hce SPECS]# yum install -y git >> /dev/nul
[root@ecs-hce SPECS]# rpmdev-newspec hce2-helloworld.spec
hce2-helloworld.spec created; type minimal, rpm version >= 4.17.
[root@ecs-hce SPECS]# ls
hce2-helloworld.spec

使用 rpmdev-newspec 命令可以方便地生成一个空白的规范文件模板,可以在此基础上填充具体的软件包信息和构建指令。

root@ecs-hce SPECS\]# vim hce2-helloworld.spec \[root@ecs-hce SPECS\]# cp hce2-helloworld.spec hce2-helloworld.spec.back \[root@ecs-hce SPECS\]# !vi vim hce2-helloworld.spec 编写软件包信息和构建指令 ```bash Name: hce2-helloworld Version: 1.0.0 Release: 1%{?dist} Summary: hce2-helloworld Group: Development/Tools License: GPL #URL: Source0: %{name}-%{version}.tar.gz #BuildRequires: #Requires: %description %prep %setup -q %build %install mkdir -p $RPM_BUILD_ROOT/usr/bin cp $RPM_BUILD_DIR/%{name}-%{version}/hce2-helloworld $RPM_BUILD_ROOT/usr/bin/ %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc /usr/bin/hce2-helloworld %changelog 执行编译命令,生成 `rpm` 包 rpmbuild 是一个用于构建 RPM 软件包的命令行工具。它接受一个 RPM 软件包规范文件(spec file)作为输入,并根据规范文件中定义的指令执行构建过程,生成最终的 RPM 软件包文件。 ```bash [root@ecs-hce SPECS]# rpmbuild --nodebuginfo -ba hce2-helloworld.spec Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.fTh7oO + umask 022 + cd /root/rpmbuild/BUILD + cd /root/rpmbuild/BUILD + rm -rf hce2-helloworld-1.0.0 + /usr/bin/gzip -dc /root/rpmbuild/SOURCES/hce2-helloworld-1.0.0.tar.gz + /usr/bin/tar -xof - + STATUS=0 + '[' 0 -ne 0 ']' + cd hce2-helloworld-1.0.0 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.G258Wy + umask 022 + cd /root/rpmbuild/BUILD + cd hce2-helloworld-1.0.0 + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.dvzv3Y + umask 022 + cd /root/rpmbuild/BUILD + '[' /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64 '!=' / ']' + rm -rf /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64 ++ dirname /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64 + mkdir -p /root/rpmbuild/BUILDROOT + mkdir /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64 + cd hce2-helloworld-1.0.0 + mkdir -p /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64/usr/bin + cp /root/rpmbuild/BUILD/hce2-helloworld-1.0.0/hce2-helloworld /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64/usr/bin/ + '[' '%{buildarch}' = noarch ']' + QA_CHECK_RPATHS=1 + case "${QA_CHECK_RPATHS:-}" in + /usr/lib/rpm/check-rpaths + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/brp-ldconfig + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip /usr/bin/strip + /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump + /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip + /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1 1 + /usr/lib/rpm/brp-python-hardlink Processing files: hce2-helloworld-1.0.0-1.x86_64 __brp_dim_baseline not set, ignore dim baseline generating Provides: hce2-helloworld = 1.0.0-1 hce2-helloworld(x86-64) = 1.0.0-1 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64 Wrote: /root/rpmbuild/SRPMS/hce2-helloworld-1.0.0-1.src.rpm Wrote: /root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.0.0-1.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.QbHsJi + umask 022 + cd /root/rpmbuild/BUILD + cd hce2-helloworld-1.0.0 + rm -rf /root/rpmbuild/BUILDROOT/hce2-helloworld-1.0.0-1.x86_64 + RPM_EC=0 ++ jobs -p + exit 0 [root@ecs-hce SPECS]# ``` 查看生成路径 ```bash [root@ecs-hce SPECS]# ls /root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.0.0-1.x86_64.rpm /root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.0.0-1.x86_64.rpm ``` #### 创建私有的 repo 源 选择一个本地私有REPO源的文件目录 选择用/home/private/目录(手动创建一个目录) 将步骤10中的rpm包,拷贝到该目录下 ```bash [root@ecs-hce SPECS]# mkdir /home/private [root@ecs-hce SPECS]# cp /root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.0.0-1.x86_64.rpm /home/private/ ``` 安装createrepo工具,使用 createrepo 命令来创建 RPM 软件包仓库。使用方法如下: ```bash [root@ecs-hce SPECS]# yum install -y createrepo >> /dev/null [root@ecs-hce SPECS]# cd /home/private [root@ecs-hce private]# createrepo . Directory walk started Directory walk done - 1 packages Temporary output repo path: ./.repodata/ Preparing sqlite DBs Pool started (with 5 workers) Pool finished ``` 编辑 repo 配置文件, repo 配置文件中增加 repo 源 ```bash [root@ecs-hce private]# vi /etc/yum.repos.d/hce.repo [root@ecs-hce private]# cat /etc/yum.repos.d/hce.repo ....... ....... [hce2-test] name=hce2-test baseurl=file:///home/private/ enabled=1 gpgcheck=0 ``` #### 生效repo源 `yum makecache` 是一个 yum 命令的选项,用于创建或更新 yum 软件包管理器的本地软件包缓存。 当执行 yum makecache 命令时,yum 会检查配置文件中定义的软件包仓库,并下载或更新仓库中的元数据信息。这些元数据包括软件包列表、版本信息、依赖关系等,用于加快后续的软件包搜索和安装过程。 ```bash [root@ecs-hce private]# yum makecache HCE 2.0 base 70 kB/s | 3.0 kB 00:00 HCE 2.0 updates 151 kB/s | 3.5 kB 00:00 hce2-test 2.9 MB/s | 3.0 kB 00:00 Metadata cache created. ``` 安装 hce2-helloworld-1.0.0.rpm ```bash [root@ecs-hce private]# yum install hce2-helloworld Last metadata expiration check: 0:00:11 ago on Fri 08 Dec 2023 10:21:38 PM CST. Dependencies resolved. ======================================================================================================================================================================== Package Architecture Version Repository Size ======================================================================================================================================================================== Installing: hce2-helloworld x86_64 1.0.0-1 hce2-test 6.4 k Transaction Summary ======================================================================================================================================================================== Install 1 Package Total size: 6.4 k Installed size: 28 Is this ok [y/N]: y Downloading Packages: Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : hce2-helloworld-1.0.0-1.x86_64 1/1 Verifying : hce2-helloworld-1.0.0-1.x86_64 1/1 Installed: hce2-helloworld-1.0.0-1.x86_64 Complete! ``` 制作安全补丁 `rpm` ,拷贝生成新的源码包,升级版本 ```bash [root@ecs-hce private]# cd /root/rpmbuild/SOURCES/ [root@ecs-hce SOURCES]# cp -r hce2-helloworld-1.0.0 hce2-helloworld-1.1.0 [root@ecs-hce SOURCES]# tar zcvf hce2-helloworld-1.1.0.tar.gz hce2-helloworld-1.1.0/ hce2-helloworld-1.1.0/ hce2-helloworld-1.1.0/hce2-helloworld [root@ecs-hce SOURCES]# cd ../SPECS/ ``` 修改hce2-helloworld.spec版本号,将Version:1.0.0修改为1.1.0。其他内容保持不变。 ```bash [root@ecs-hce SPECS]# vim hce2-helloworld.spec ``` 编译生成新的RPM包,并拷贝到/home/private/目录下 ```bash [root@ecs-hce SPECS]# rpmbuild --nodebuginfo -ba hce2-helloworld.spec Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.37tfGQ + umask 022 + cd /root/rpmbuild/BUILD + cd /root/rpmbuild/BUILD + rm -rf hce2-helloworld-1.1.0 + /usr/bin/gzip -dc /root/rpmbuild/SOURCES/hce2-helloworld-1.1.0.tar.gz + /usr/bin/tar -xof - + STATUS=0 + '[' 0 -ne 0 ']' + cd hce2-helloworld-1.1.0 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.hmcjbb + umask 022 + cd /root/rpmbuild/BUILD + cd hce2-helloworld-1.1.0 + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.CvqayW + umask 022 + cd /root/rpmbuild/BUILD + '[' /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64 '!=' / ']' + rm -rf /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64 ++ dirname /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64 + mkdir -p /root/rpmbuild/BUILDROOT + mkdir /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64 + cd hce2-helloworld-1.1.0 + mkdir -p /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64/usr/bin + cp /root/rpmbuild/BUILD/hce2-helloworld-1.1.0/hce2-helloworld /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64/usr/bin/ + '[' '%{buildarch}' = noarch ']' + QA_CHECK_RPATHS=1 + case "${QA_CHECK_RPATHS:-}" in + /usr/lib/rpm/check-rpaths + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/brp-ldconfig + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip /usr/bin/strip + /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump + /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip + /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1 1 + /usr/lib/rpm/brp-python-hardlink Processing files: hce2-helloworld-1.1.0-1.x86_64 __brp_dim_baseline not set, ignore dim baseline generating Provides: hce2-helloworld = 1.1.0-1 hce2-helloworld(x86-64) = 1.1.0-1 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64 Wrote: /root/rpmbuild/SRPMS/hce2-helloworld-1.1.0-1.src.rpm Wrote: /root/rpmbuild/RPMS/x86_64/hce2-helloworld-1.1.0-1.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.eFBaP4 + umask 022 + cd /root/rpmbuild/BUILD + cd hce2-helloworld-1.1.0 + rm -rf /root/rpmbuild/BUILDROOT/hce2-helloworld-1.1.0-1.x86_64 + RPM_EC=0 ++ jobs -p + exit 0 [root@ecs-hce SPECS]# cd /home/private ``` 创建了一个名为 updateinfo.xml 的文件 该文件包含一个 XML 结构,描述了一个安全更新的详细信息。它提供了有关更新的作者、来源、状态、版本、严重程度、摘要、描述、引用和软件包列表的信息。 ```bash [root@ecs-hce private]# touch updateinfo.xml [root@ecs-hce private]# vim updateinfo.xml [root@ecs-hce private]# cat updateinfo.xml HCE2-SA-2022:0001 HCE2-SA-2022:0001: hce2-helloworld security update (Important) Copyright (C) 2020-2021 Huawei Cloud EulerOS Huawei Cloud EulerOS 2 Important

hce2-helloworld security update Package updates are available for Huawei Cloud EulerOS 2 that fix the following vulnerabilities: CVE-2021-21261: Just for test Huawei Cloud EulerOS 2 hce2-helloworld-1.3.0-1.x86_64.rpm ``` 更新repo源,modifyrepo 是一个用于修改软件包仓库元数据的工具。 ```bash [root@ecs-hce private]# modifyrepo updateinfo.xml repodata/ [root@ecs-hce private]# yum makecache HCE 2.0 base 38 kB/s | 3.0 kB 00:00 HCE 2.0 updates 162 kB/s | 3.5 kB 00:00 hce2-test 3.4 MB/s | 3.4 kB 00:00 hce2-test 219 kB/s | 1.4 kB 00:00 Metadata cache created. ``` 检查更新信息可以看到有新的更新提示 ```bash [root@ecs-hce private]# yum updateinfo Last metadata expiration check: 0:00:04 ago on Fri 08 Dec 2023 10:24:14 PM CST. Updates Information Summary: available 48 Security notice(s) 7 Critical Security notice(s) 20 Important Security notice(s) 19 Moderate Security notice(s) 2 Low Security notice(s) [root@ecs-hce private]# ``` 根据输出,yum updateinfo 命令显示了可用的更新信息摘要。 根据输出,有 48 条安全通知可用,其中包括不同级别的通知:7 条关键安全通知、20 条重要安全通知、19 条中等安全通知和 2 条低级安全通知。 该命令的输出提示您有可用的安全更新,建议您及时执行更新操作,以确保系统的安全性和稳定性。您可以使用 yum update 命令来执行更新操作。 ### 博文部分内容参考 © 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 😃 *** ** * ** *** ### © 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

相关推荐
用户9623779544819 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star1 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954481 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher3 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行6 天前
网络安全总结
安全·web安全
red1giant_star6 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透6 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全