1.4.8 软件包查询、审计与回滚策略

软件包查询与信息检索#

原理草图:包元数据查询路径

文章图片
  • RPM/DNF/YUM 系列:常用查询
  • 查询已安装包:rpm -qa | grep <keyword>(从本地数据库过滤)
  • 查看包详情:rpm -qi <pkg>(版本/厂商/构建时间)
  • 查看文件列表:rpm -ql <pkg>(包内安装路径)
  • 查询文件归属:rpm -qf /path/to/file(定位由哪个包提供)
  • 查看更新历史:dnf history / yum history(事务级记录)

示例:定位某二进制来源并查看详情

# 1) 找出 nginx 来自哪个包
rpm -qf /usr/sbin/nginx

# 2) 查看包详情(版本、签名、来源)
rpm -qi nginx

# 3) 查看包安装了哪些文件
rpm -ql nginx | head -n 10

# 预期:输出 nginx 版本、架构、安装路径等信息
  • DEB/APT 系列:常用查询
  • 查询已安装包:dpkg -l | grep <keyword>(本地安装清单)
  • 包详情与文件列表:dpkg -s <pkg>dpkg -L <pkg>
  • 查询文件归属:dpkg -S /path/to/file
  • 查看更新历史:/var/log/apt/history.log

示例:查询 OpenSSH 版本与文件列表

# 1) 查看 openssh-server 详细信息
dpkg -s openssh-server

# 2) 查看该包安装的文件列表
dpkg -L openssh-server | head -n 10

# 3) 查询二进制文件归属
dpkg -S /usr/sbin/sshd

软件包审计与合规核查#

原理草图:审计视角

文章图片
  • 版本与来源审计
  • 记录仓库来源:dnf repolist -v / apt-cache policy <pkg>
  • 建议建立“白名单清单”,对关键组件(内核、openssh、glibc、openssl)定期比对版本。

示例:输出关键包版本清单

# 生成关键包版本清单(RPM 系)
rpm -q kernel openssh glibc openssl > /var/tmp/keypkg_version.txt

# 校验仓库来源
dnf repolist -v | grep -E "Repo-id|Repo-name|Repo-baseurl" -n
  • 完整性与安全审计
  • RPM 文件完整性校验:rpm -V <pkg>(校验配置文件与二进制)
  • DEB 校验:结合 debsums 对已安装包做校验

示例:安装并使用 debsums(DEB)

# 安装 debsums
apt-get update && apt-get install -y debsums

# 校验 openssl 包文件完整性
debsums -s openssl

# 预期:无输出表示校验通过,有输出表示文件被修改
  • 变更记录与审计
  • DNF/YUM:dnf history info <ID> 查看具体变更
  • APT:审计 /var/log/apt/history.log/var/log/dpkg.log

示例:查找最近一次升级事务详情

# 1) 查看历史事务列表
dnf history | head -n 5

# 2) 查看指定事务详情
dnf history info 12

回滚与降级策略#

原理草图:回滚路径

文章图片
  • DNF/YUM 回滚
  • 回滚到历史事务:dnf history rollback <ID> / yum history rollback <ID>
  • 卸载并降级:dnf downgrade <pkg> / yum downgrade <pkg>

示例:回滚指定事务并验证

# 1) 查询历史事务
dnf history | head -n 5

# 2) 回滚到指定事务
dnf history rollback 12 -y

# 3) 验证版本
rpm -q nginx
  • APT 回滚
  • 查找可用版本:apt-cache madison <pkg>
  • 降级安装:apt-get install <pkg>=<version>
  • 重要:在降级后执行 apt-mark hold <pkg> 防止自动升级

示例:降级并锁定版本

# 1) 查看可用版本
apt-cache madison nginx

# 2) 降级到指定版本
apt-get install -y nginx=1.18.0-6ubuntu14.4

# 3) 锁定版本
apt-mark hold nginx

# 预期:后续 apt upgrade 不会自动升级 nginx
  • 配置回滚
  • 建议将 /etc 纳入版本控制或定期备份(如 etckeeper),与包回滚配合使用。

示例:安装 etckeeper 并提交一次基线

# 安装 etckeeper
apt-get install -y etckeeper

# 初始化并提交 /etc 基线
cd /etc
etckeeper init
etckeeper commit "baseline /etc snapshot"

回滚前的评估与策略建议#

  • 依赖风险评估
  • 回滚前使用 dnf repoquery --requires <pkg>apt-cache rdepends <pkg> 评估影响面。

示例:查看依赖影响

# RPM:查看 nginx 依赖
dnf repoquery --requires nginx

# DEB:查看依赖反向关系
apt-cache rdepends nginx
  • 关键服务策略
  • 对数据库、消息队列等中间件,采用“灰度回滚”或“旁路部署”,确保业务连续性。
  • 快照与备份
  • 建议在变更前创建快照(LVM/Btrfs/VM)或系统镜像,以支持快速恢复。

示例:LVM 快照(变更前)

# 创建 LVM 快照(示例:/dev/vg0/root)
lvcreate -L 5G -s -n root_snap /dev/vg0/root

# 预期:出现 /dev/vg0/root_snap,可用于快速回滚

典型流程模板#

  1. 查询目标包版本与来源
  2. 记录当前系统状态与依赖
  3. 执行回滚/降级
  4. 校验服务可用性与配置一致性
  5. 固定版本或更新策略,避免重复回归问题

端到端示例(RPM 系)

# 1) 查询版本与来源
rpm -qi nginx

# 2) 查看依赖影响
dnf repoquery --requires nginx

# 3) 回滚指定事务
dnf history rollback 12 -y

# 4) 验证服务
systemctl status nginx --no-pager
nginx -t

# 5) 版本锁定
dnf install -y dnf-plugins-core
dnf versionlock add nginx

最佳实践要点#

  • 关键环境启用版本锁定:dnf versionlock / apt-mark hold
  • 统一变更窗口与变更记录,确保可追溯
  • 配合配置管理工具(Ansible/SaltStack)实现批量回滚与一致性恢复

安装与排错#

常用安装命令

# RPM 系
dnf install -y nginx

# DEB 系
apt-get update && apt-get install -y nginx

常见排错清单
- 无法找到包
- 检查仓库:dnf repolist / apt-cache policy
- 刷新缓存:dnf makecache / apt-get update
- 依赖冲突
- 查询冲突包:dnf repoquery --unsatisfied / apt-get -f install
- 签名校验失败
- 导入 GPG:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-*
- APT:apt-key list(旧版)或检查 /etc/apt/trusted.gpg.d/


练习#

  1. 查询 bash 包安装的所有文件,并找出其主配置文件路径。
  2. 在测试机上升级 curl,再通过事务回滚恢复到升级前版本。
  3. 使用 debsumsrpm -V 校验一个核心包,并解释输出含义。
  4. 生成关键包版本清单,并对比两台服务器是否一致。