CentOS 7 的生命周期已在 2024 年 6 月 30 日正式结束,而 CentOS Stream 作为滚动发行版,其安全更新模式与传统的 RHEL 克隆版截然不同。这意味着,如果你手里还运行着大量的 CentOS 系统,它们正暴露在一个没有常规漏洞修复补丁的真空期。单纯依靠关闭端口、配置防火墙已经远远不够,你需要确切地知道系统当前的真实配置与安全基线之间到底存在多少差距。这就是 OpenSCAP 要解决的问题——它不是帮你拦截攻击,而是像一台精密的 CT 机,把系统内部的配置缺陷、漏洞风险、合规性偏差全部扫描出来,生成一份可审计、可量化、可复用的报告。

OpenSCAP 到底是什么,能解决哪些具体问题

OpenSCAP 是一个开源的合规性扫描工具,它实现了安全内容自动化协议(SCAP)标准。这套标准由美国国家标准与技术研究院(NIST)维护,核心思想是把安全配置检查从“人工对照检查表”变成“机器可读的自动化扫描”。在实际运维中,它能解决三个非常具体的问题:第一,系统装完后,有没有按照等保或企业基线完成最小化安装?第二,现有的系统是否存在已知的 CVE 漏洞?第三,系统配置是否满足 PCI-DSS、STIG 等合规性要求?

OpenSCAP 本身是一个命令行工具集,核心组件包括 oscap 命令行工具、SCAP Security Guide(SSG)内容包以及 SCAP Workbench(可选图形界面)。在服务器场景下,我们主要使用 oscap 配合 SSG 提供的预置基线文件进行扫描。SSG 包含了针对 RHEL/CentOS 的多种策略文件,例如 PCI-DSS、ANSSI、CIS、STIG 等。这些策略文件本质上是一个 XML 文档,里面定义了数百甚至上千条检查规则,每条规则对应一个具体的配置项。

安装 OpenSCAP 与安全内容包

在 CentOS 7 上,OpenSCAP 及其依赖包在 EPEL 仓库中,需要先启用 EPEL 源。对于 CentOS Stream 8/9,基础仓库中已经包含了较新版本的 OpenSCAP。以下是针对 CentOS 7 的安装步骤,这是目前存量最大的场景:

# 安装 EPEL 仓库
yum install -y epel-release

# 安装 OpenSCAP 核心工具和 SCAP Security Guide
yum install -y openscap-scanner scap-security-guide

安装完成后,SCAP Security Guide 的内容文件会放置在 /usr/share/xml/scap/ssg/content/ 目录下。你可以用 ls 命令查看可用的基线文件:

ls -lh /usr/share/xml/scap/ssg/content/ | grep centos

输出结果中会看到类似 ssg-centos7-ds.xml、ssg-centos7-xccdf.xml 这样的文件。其中 ds.xml 结尾的文件是数据流文件,它把 XCCDF 检查清单、OVAL 漏洞定义、CVE 引用等全部打包在一起,是目前推荐使用的格式。xccdf.xml 文件则只包含检查规则描述,实际扫描时需要单独指定 OVAL 定义文件。日常使用中,直接使用 ds.xml 数据流文件最方便,不容易出错。

理解扫描配置文件的选择逻辑

很多人在这一步会随便选一个文件就开始扫描,这是不合适的。不同的策略文件对应完全不同的严格程度和适用场景。以 CentOS 7 为例,常见的策略包括:

PCI-DSS 基线:针对支付卡行业数据安全标准,规则集中在数据加密、访问控制、审计日志等方面,规则数量约 200 多条,适合处理支付业务的系统。

CIS 基线:互联网安全中心制定的最佳实践,覆盖面广,规则数量多,分为 Level 1 和 Level 2 两个等级。Level 1 是基本安全配置,一般不会影响业务功能;Level 2 是深度防御,可能会禁用某些服务或功能,需要评估对业务的影响。

STIG 基线:美国国防部信息系统局发布的安全技术实施指南,规则极其严格,数量多达 300 条以上,包含大量密码复杂度、会话超时、SELinux 策略等要求。除非有明确的合规需求,否则不建议直接在生产环境套用。

ANSSI 基线:法国国家信息系统安全局推荐的基线,在 CentOS 上也有对应的策略文件,适合有欧洲业务合规需求的场景。

对于国内大多数企业来说,如果没有特定的行业合规要求,建议从 CIS Level 1 开始扫描。它能在安全性和兼容性之间取得较好的平衡,扫描结果中的高风险项基本都应该修复。

执行第一次合规性扫描

使用 oscap 命令进行扫描的基本语法如下。这里以 CIS CentOS 7 Level 1 基线为例:

oscap xccdf eval \
  --profile xccdf_org.ssgproject.content_profile_cis \
  --results /tmp/scan-results.xml \
  --report /tmp/scan-report.html \
  /usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml

参数解释:--profile 指定要使用的检查策略,这里的 profile ID 可以从数据流文件中查询;--results 指定扫描结果的 XML 文件,这个文件可以后续用于修复、对比或审计;--report 指定生成的可读 HTML 报告,直接在浏览器中打开就能看到扫描结果;最后是数据流文件的路径。

如果你不确定数据流文件中包含哪些可用的 profile,可以用以下命令列出所有 profile:

oscap info /usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml

输出中会列出所有 profile 的 ID、标题和描述。找到你需要的 profile ID,复制到 --profile 参数后面即可。扫描过程会持续几分钟,期间会逐条检查系统配置。扫描完成后,用浏览器打开 /tmp/scan-report.html,你会看到一份详细的合规性报告,规则按严重程度分类,每条规则都有通过、失败或其他状态。

解读扫描报告并确定修复优先级

打开 HTML 报告后,页面顶部会显示总体评分,例如“45.2% 合规”。下方会按高、中、低严重程度列出所有规则。高严重性的失败项通常是必须立即处理的问题,例如:

空密码账户存在:系统存在没有设置密码的用户,这是极其危险的情况。

SELinux 处于禁用状态:SELinux 是 CentOS 核心的强制访问控制机制,禁用后系统失去了重要的防护层。

关键服务使用不安全的协议:例如 SSH 允许 root 直接登录、使用旧版 SSH 协议等。

报告中的每条规则都可以展开,查看详细描述、检查逻辑和修复建议。例如,如果“Ensure SELinux State is Enforcing”这条规则失败,报告中会明确指出当前 SELinux 的状态,并给出修复命令:

# 将 SELinux 设置为 enforcing 模式
setenforce 1

# 修改配置文件确保重启后仍然生效
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config

需要注意的是,不要盲目地全部修复。有些规则可能与企业内部的运维规范冲突,例如某些基线要求审计日志必须记录所有命令,但这在磁盘空间有限的服务器上可能不现实。正确的做法是:先筛选出高严重性且不会影响业务的规则进行修复,然后逐步处理中低风险项,对于确实无法修复的规则,在报告中做好备注,形成风险接受记录。

使用 Bash 脚本自动修复

OpenSCAP 支持基于扫描结果生成修复脚本,这是提升效率的关键功能。你可以让 OpenSCAP 生成一个包含所有修复命令的 Bash 脚本,然后根据需要进行选择性执行或全量执行:

# 基于扫描结果生成修复脚本
oscap xccdf generate fix \
  --result-id xccdf_org.open-scap_testresult_xccdf_org.ssgproject.content_profile_cis \
  /tmp/scan-results.xml > /tmp/remediation.sh

# 查看修复脚本内容,确认无误后再执行
less /tmp/remediation.sh

# 执行修复
chmod +x /tmp/remediation.sh
./tmp/remediation.sh

这里的 --result-id 参数需要从扫描结果 XML 文件中获取,通常可以直接用上面的固定值。生成的修复脚本会包含所有失败规则的修复命令,例如修改配置文件、启用或禁用服务、安装缺失的软件包等。强烈建议在执行前先通读脚本内容,因为自动生成的脚本可能会重启某些服务,在生产环境中需要评估影响。

将 OpenSCAP 扫描集成到日常运维流程

一次性扫描只能反映扫描时刻的系统状态,而安全是一个持续的过程。比较务实的做法是,将 OpenSCAP 扫描集成到以下几个环节:

系统上线前:所有新部署的 CentOS 系统,在交付给业务方之前,必须通过 CIS Level 1 扫描,高严重性规则必须全部通过。这可以作为一个强制性的上线检查项。

定期巡检:通过 cron 定时任务,每月或每季度对存量系统执行一次扫描,将报告统一归档到中央存储。如果发现新的失败项,及时排查是配置被人修改还是基线文件更新导致的。

漏洞应急响应:当有重大 CVE 漏洞爆发时,OpenSCAP 的 OVAL 定义会随之更新。你可以立即对受影响系统执行扫描,快速定位存在漏洞的主机,而不需要逐台手动检查软件包版本。

一个典型的 cron 配置示例,每月 1 日凌晨 3 点执行扫描,报告保存到带日期的目录:

0 3 1 * * /usr/bin/oscap xccdf eval \
  --profile xccdf_org.ssgproject.content_profile_cis \
  --results /var/log/oscap/$(date +\%Y\%m\%d)-results.xml \
  --report /var/log/oscap/$(date +\%Y\%m\%d)-report.html \
  /usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml
自定义基线文件以满足特殊需求

预置的基线文件虽然全面,但有时并不完全适合企业的实际情况。OpenSCAP 允许你对现有的 XCCDF 文件进行定制,去掉不需要的规则,或者调整规则的参数值。这个过程称为“tailoring”。

最简单的定制方式是使用 SCAP Workbench 图形工具,它提供了可视化的规则选择和参数调整界面。但在服务器环境下,更多时候需要命令行操作。你可以创建一个 tailoring 文件,指定哪些规则需要禁用、哪些参数需要修改:

# 生成一个 tailoring 模板文件
oscap xccdf generate tailoring \
  --profile xccdf_org.ssgproject.content_profile_cis \
  /usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml > /root/custom-tailoring.xml

# 编辑这个 XML 文件,将不需要的规则设置为 selected="false"
# 然后使用定制后的文件进行扫描
oscap xccdf eval \
  --tailoring-file /root/custom-tailoring.xml \
  --profile xccdf_org.ssgproject.content_profile_cis \
  --results /tmp/scan-results.xml \
  --report /tmp/scan-report.html \
  /usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml

在 tailoring 文件中,你可以把那些与业务冲突的规则标记为不选中,这样扫描时就会跳过它们。这种方式比直接修改原始数据流文件更规范,也便于后续升级 SSG 内容包时保留你的定制配置。

处理 CentOS 停止维护后的特殊扫描策略

CentOS 7 停止维护后,官方软件源不再提供安全更新。这意味着 OVAL 定义中关于 CVE 漏洞的部分将不再更新,因为不再有新的勘误公告发布。但合规性检查部分(XCCDF)仍然有效,因为配置基线不依赖于软件源的状态。

针对这种情况,建议采取以下策略:将扫描重点从漏洞扫描转向配置合规性扫描,确保系统配置本身是加固的;对于必须留在 CentOS 7 上的系统,考虑使用第三方扩展支持服务获取安全更新,或者将系统迁移到 RHEL 兼容发行版如 AlmaLinux、Rocky Linux,这些系统同样支持 OpenSCAP 扫描,且 SSG 内容包会持续更新;在扫描报告中,对因系统 EOL 导致的无法修复的漏洞项做好标记,作为风险接受的一部分记录在案。

对于已经迁移到 CentOS Stream 的系统,OpenSCAP 的安装和使用方式基本相同,但 SSG 内容包中的策略文件会有差异,需要根据 Stream 版本的实际情况选择对应的数据流文件。CentOS Stream 8 使用 ssg-centos8-ds.xml,CentOS Stream 9 使用 ssg-cs9-ds.xml。

扫描结果的数据分析与长期跟踪

单份报告的价值有限,真正有价值的是对扫描结果的长期跟踪和趋势分析。你可以将每次扫描的结果 XML 文件集中存储,然后使用 oscap 的对比功能查看两次扫描之间的差异:

# 对比两次扫描结果,查看新增的失败项
oscap xccdf diff \
  /var/log/oscap/20250101-results.xml \
  /var/log/oscap/20250201-results.xml

这个功能对于发现配置漂移非常有用。例如,某个系统在上个月扫描时所有规则都通过,这个月突然出现了“SELinux is disabled”的失败项,说明有人在过去一个月内修改了 SELinux 配置。通过定期对比,你可以及时发现未授权的配置变更。

此外,XML 格式的结果文件可以用脚本解析,将关键指标提取到数据库或监控系统中。例如,你可以编写一个简单的 Python 脚本,解析每次扫描的总体评分、高/中/低风险失败项数量,然后存入 InfluxDB,在 Grafana 中展示合规性趋势图。这样管理层就能直观地看到整个服务器集群的安全合规状态是在改善还是在恶化。

OpenSCAP 的安装和使用本身并不复杂,真正需要投入精力的是理解每条规则的含义、制定适合自己业务的修复策略,以及将扫描工作制度化、流程化。在 CentOS 生态发生重大变化的当下,这套工具提供的自动化合规检查能力,是维持存量系统安全水位的重要支撑。