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,可用于快速回滚
典型流程模板#
- 查询目标包版本与来源
- 记录当前系统状态与依赖
- 执行回滚/降级
- 校验服务可用性与配置一致性
- 固定版本或更新策略,避免重复回归问题
端到端示例(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/
练习#
- 查询
bash包安装的所有文件,并找出其主配置文件路径。 - 在测试机上升级
curl,再通过事务回滚恢复到升级前版本。 - 使用
debsums或rpm -V校验一个核心包,并解释输出含义。 - 生成关键包版本清单,并对比两台服务器是否一致。