【生产实践】内网YUM源中rpm包的替换与仓库升级实战
太长不看版本
- 最近有这么一档子事,
安全经常扫到内网服务器有telnet安全漏洞,总是让重装服务器上telnet。每台单独上传rpm包装台费事,而且新服务器装的还是旧的,之后被扫到的还得重装。
- 于是乎觉得从内网yum源服务器动手:
- 将新的telnet的rpm包上传的内网yum源服务器上替换掉之前的rpm包
- 用
createrepo --update /var/www/html/repos/
重建元数据索引
这样一来无论是旧的卸载重装,还是新服务安装的问题都可以用脚本跑一边就完事了。
在企业内网环境中,基于RHEL/CentOS的服务器通常依赖内网YUM源进行软件安装与升级。然而,部分系统自带的基础软件包(如telnet)可能存在已知安全漏洞,需要通过替换YUM源中的旧包并升级仓库元数据,实现全网范围内的安全合规。本文以生产环境中telnet包的替换为例,详细介绍操作流程与注意事项。
一、背景与目标
1.1 问题场景
内网YUM源的基础软件包源自RHEL 7.6官方镜像,其中telnet
包(telnet-0.17-65.el7.x86_64.rpm
)被安全扫描工具检测出存在CVE-202x-xxxx等漏洞。安全部门要求:
- 替换内网YUM源中所有telnet相关旧包;
- 确保新服务器通过内网YUM源安装的telnet为经过安全认证的新版本;
- 不影响其他软件包的正常安装与依赖关系。
1.2 操作目标
- 替换YUM源仓库中旧的telnet包为安全版本(如
telnet-0.17-71.el7.x86_64.rpm
,已通过安全认证); - 重建YUM仓库元数据,确保客户端能获取到最新包;
- 验证替换后客户端安装的telnet版本为目标版本。
二、前期准备
2.1 环境说明
- YUM源服务器:CentOS 7.6,内网IP:192.168.1.10,仓库路径:
/var/www/html/repos/rhel7.6/x86_64/
(通过HTTP服务提供,http://192.168.1.10/repos/rhel7.6/x86_64/
); - 旧包信息:
telnet-0.17-65.el7.x86_64.rpm
(存在漏洞); - 新包信息:
telnet-0.17-71.el7.x86_64.rpm
(安全认证通过,需提前从Red Hat官方获取或内部编译); - 依赖工具:
createrepo
(用于重建仓库元数据)、httpd
(提供YUM源HTTP服务)。
2.2 风险规避
- 备份旧包与元数据:
# 备份旧的telnet包 cp /var/www/html/repos/rhel7.6/x86_64/telnet-0.17-65.el7.x86_64.rpm /tmp/ # 备份仓库元数据(repodata目录) cp -r /var/www/html/repos/rhel7.6/x86_64/repodata /tmp/repodata_bak/
- 测试环境验证:在非生产环境的测试YUM源中先执行替换流程,验证新包安装、依赖关系及功能正常后,再推广到生产环境。
三、操作步骤
3.1 定位并替换旧包
-
确认旧包位置:
内网YUM源的RPM包通常按系统版本和架构分类存放,telnet包路径为:/var/www/html/repos/rhel7.6/x86_64/telnet-0.17-65.el7.x86_64.rpm
(可通过
find /var/www/html/repos -name "telnet-*.rpm"
全局搜索确认) -
替换为新包:
将经过安全认证的新包telnet-0.17-71.el7.x86_64.rpm
上传至上述目录,并删除旧包:# 上传新包(示例:从本地通过scp上传) scp telnet-0.17-71.el7.x86_64.rpm root@192.168.1.10:/var/www/html/repos/rhel7.6/x86_64/ # 删除旧包 rm -f /var/www/html/repos/rhel7.6/x86_64/telnet-0.17-65.el7.x86_64.rpm
3.2 重建YUM仓库元数据
YUM仓库通过repodata
目录下的元数据文件(如repomd.xml
、primary.xml.gz
)记录包信息,替换包后需更新元数据,否则客户端仍会读取旧信息。
-
安装createrepo工具(若未安装):
yum install -y createrepo
-
更新仓库元数据:
使用createrepo --update
仅更新变化的元数据(效率更高):createrepo --update /var/www/html/repos/rhel7.6/x86_64/
- 若仓库首次构建或元数据变动较大,可直接重建(耗时较长):
createrepo /var/www/html/repos/rhel7.6/x86_64/
- 若仓库首次构建或元数据变动较大,可直接重建(耗时较长):
-
验证元数据更新:
检查repodata
目录下文件的修改时间,确认已更新:ls -l /var/www/html/repos/rhel7.6/x86_64/repodata/
3.3 清理YUM缓存(服务器与客户端)
-
YUM源服务器本地清理:
yum clean all yum makecache # 生成新的缓存
-
客户端清理(全网生效关键):
通知各业务服务器执行缓存清理,确保获取新包信息:yum clean all && yum makecache
(可通过批量管理工具如Ansible执行,避免逐台操作)
四、验证操作结果
4.1 验证YUM源包信息
在YUM源服务器或任意客户端执行以下命令,确认telnet最新版本已被识别:
yum info telnet
- 预期输出:
Version
字段为0.17-71.el7
,From repo
指向内网YUM源(http://192.168.1.10/repos/rhel7.6/x86_64/
)。
4.2 验证新包安装
在一台未安装telnet的测试服务器上执行安装,检查版本:
yum install -y telnet
telnet -V # 查看版本,确认显示为0.17-71.el7
4.3 安全扫描验证
通知安全部门对已安装新包的服务器进行二次扫描,确认漏洞已修复。
五、注意事项
-
包依赖兼容性:
新包需与RHEL 7.6系统兼容,避免因版本跳跃导致依赖缺失(可通过rpm -qpR telnet-0.17-71.el7.x86_64.rpm
检查依赖,确保内网源中存在对应依赖包)。 -
仓库权限与SELINUX:
- 确保新包权限为
644
(chmod 644 /var/www/html/repos/rhel7.6/x86_64/telnet-0.17-71.el7.x86_64.rpm
); - 若启用SELINUX,需确认HTTP服务对仓库目录有访问权限:
chcon -R -t httpd_sys_content_t /var/www/html/repos/
- 确保新包权限为
-
批量更新旧服务器:
对于已安装旧版telnet的服务器,需执行yum update -y telnet
升级,可通过Ansible批量操作:# Ansible playbook示例 - hosts: alltasks:- name: 升级telnet至最新版yum:name: telnetstate: latest
-
操作时间窗口:
选择业务低峰期执行,避免仓库元数据重建或客户端缓存清理影响正常软件安装。
六、总结
通过替换内网YUM源中的telnet旧包、重建仓库元数据并清理缓存,可实现全网范围内telnet版本的统一升级,满足安全合规要求。核心在于确保包替换的准确性、元数据更新的完整性,以及客户端缓存的有效清理。该方法同样适用于其他存在漏洞的基础软件包(如openssh、curl等)的批量替换,是企业内网安全治理的重要实践手段。