减少存在是第一原则
加固的第一原则是减少存在:最小化安装、按需装包、定期清点。多装一个组件就多一份漏洞面、多一份补丁负担,也多一份合规解释成本。生产机上不应出现编译器(gcc、make)与遗留服务——离线攻击者拿不到编译器,就很难在本机现场编译提权程序。
基本信息
| 适用平台 | RHEL / CentOS 系与 Debian / Ubuntu 系 |
|---|---|
| 检查点 | 已装软件清单可解释,生产机无编译器与遗留服务 |
| 风险等级 | 中 |
| 采集命令 | rpm -qa 与 dpkg --get-selections |
| 延伸场景 | 容器环境要在镜像构建阶段控制内容 |
典型使用场景
- 新系统交付前的软件面评审
- 生产机上意外出现 gcc、make 等开发工具的排查
- 卸载遗留服务前评估依赖影响,先做 dry-run
- 收敛补丁与漏洞影响面,少装就少补
- 容器镜像选择最小基础镜像
导出清单评审
导出清单评审
rpm -qa --qf '%{NAME}\t%{VERSION}\n' | sort > /tmp/pkgs.txt # RHEL 系软件清单
dpkg --get-selections | awk '$2=="install"{print $1}' | sort > /tmp/pkgs.txt # Debian 系软件清单
rpm -q gcc make 2>/dev/null || true # 生产机一般不应带编译工具链
systemctl list-units --type=service --state=running --no-pager | head -20 # 盘点在运行的服务卸载前先评估
卸载前先评估
dnf remove --assumeno <包名> # RHEL 系先看会连带卸载哪些组件,不实际执行
apt-get remove --dry-run <包名> # Debian 系同理,先看影响范围盘点对象与判断
| 盘点对象 | 判断 | 处置 |
|---|---|---|
| 编译器工具链 | 生产机是否装了 gcc、make | 无本地编译需求就卸载 |
| 遗留服务 | 在运行但无人认领的服务 | 确认后停用并卸载 |
| 非必要运行时 | 用不到的语言运行时与中间件 | 评估依赖后移除 |
| 容器镜像内容 | 镜像内的包与工具 | 从构建阶段控制,不在运行中删包 |
| 清单基线 | 已装包清单的差异 | 新增包需有变更记录 |
批量删包必须先 dry-run:包管理器的 remove 会连带卸载依赖它的组件,生产环境上误删的代价极高。
容器时代的最小化要在镜像构建阶段控制,而不是上线后进容器删包——运行中删包破坏不可变原则,重建容器就前功尽弃。