跳转到内容

OpenSCAP 合规扫描

适用于 CentOS Stream 9 & 10 / AlmaLinux 9.x & 10.x / Rocky Linux 9.x & 10.x

合规检查常常意味着拿着一份几百条的清单逐条核对系统配置。OpenSCAP 把这件事自动化了:它读取标准化的安全基线,扫描你的系统,告诉你哪些项通过、哪些项失败,甚至能直接帮你修复。

  • SCAP 标准及其组件(XCCDF、OVAL、datastream)是什么
  • 安装 OpenSCAP 并找到各发行版对应的安全基线内容
  • 用 CIS、DISA STIG 等 profile 扫描系统并生成可读的 HTML 报告
  • 解读扫描结果并安全地执行自动修复
  • 在安装时套用基线、扫描容器镜像、设置定期合规检查
  • 一台运行 EL 9.x 或 EL 10.x 的系统
  • sudo 权限
  • 能访问 DNF 软件源(基线内容包从默认仓库安装)
  • 强烈建议先在测试机或虚拟机快照上操作,再应用到生产环境

SCAP(Security Content Automation Protocol,安全内容自动化协议)是一套由 NIST 维护的标准,用机器可读的格式描述「安全合规检查」,这样不同工具就能交换和执行同一份基线。它由几个组件组成:

组件作用
XCCDF检查清单格式,描述一条条规则、profile 以及如何判定通过/失败
OVAL检测逻辑,定义「如何实际检查系统状态」(比如某个文件权限是否为 600)
datastream打包格式(*-ds.xml),把 XCCDF、OVAL 等内容打包成一个文件

OpenSCAPoscap)是 SCAP 在 EL 上的开源实现——它是执行扫描和修复的命令行工具。而具体的基线内容由 SCAP Security Guide(SSG)项目提供,它针对每个发行版打包了 CIS、DISA STIG 等基线。

安装扫描器和基线内容
$ sudo dnf install openscap-scanner scap-security-guide
  • openscap-scanner 提供 oscap 命令。
  • scap-security-guide 提供各发行版的 datastream 内容。

如果还要扫描容器镜像,再装上 openscap-utils(提供 oscap-podman)。

SSG 把内容安装在固定目录下:

列出可用的 datastream 文件
$ ls /usr/share/xml/scap/ssg/content/

每个发行版有各自的 datastream 文件。选错文件会导致规则不匹配,所以先对号入座:

发行版datastream 文件
RHEL 9ssg-rhel9-ds.xml
CentOS Stream 9ssg-cs9-ds.xml
AlmaLinux 9ssg-almalinux9-ds.xml
Rocky Linux 9ssg-rl9-ds.xml
RHEL 10ssg-rhel10-ds.xml

一个 datastream 里包含多个 profile(基线档案),每个 profile 对应一套合规标准。先看看有哪些:

查看 datastream 信息和 profile 列表
$ oscap info /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

输出的 Profiles: 段落会列出每个 profile 的标题和 ID,类似:

Profiles:
Title: CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Server
Id: xccdf_org.ssgproject.content_profile_cis
Title: DISA STIG for Red Hat Enterprise Linux 9
Id: xccdf_org.ssgproject.content_profile_stig
Title: PCI-DSS v4 Control Baseline for Red Hat Enterprise Linux 9
Id: xccdf_org.ssgproject.content_profile_pci-dss

那个 xccdf_org.ssgproject.content_profile_... 就是后面命令要用的 profile ID

常见 profile:

标准说明
CISCIS Benchmark,分 Level 1/Level 2、Server/Workstation 多个变体
DISA STIG美国国防部安全技术实施指南,要求最严格
PCI-DSS支付卡行业数据安全标准
HIPAA美国医疗健康信息保护
ANSSI-BP-028法国国家网络安全局基线,分 minimal/intermediary/enhanced/high
CUSPEL 10 新增的通用安全基线(Custom Profile),定位为温和、通用的起点

确定了 datastream 和 profile ID 之后,执行一次评估扫描:

扫描系统并生成报告
$ sudo oscap xccdf eval \
--profile xccdf_org.ssgproject.content_profile_cis \
--results scan-results.xml \
--report report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

参数说明:

  • --profile:要套用的 profile ID。
  • --results:保存机器可读的 XML 结果(后续生成修复脚本会用到)。
  • --report:生成人类可读的 HTML 报告。

扫描完成后,用浏览器打开 report.html,能看到每条规则的通过情况、严重等级和修复建议。

报告里每条规则会有一个结果状态:

状态含义
pass通过,符合基线要求
fail失败,需要修复
notapplicable不适用(比如规则针对的软件未安装)
notchecked / error未检查或检查出错

修复时按**严重等级(severity)**排序:先处理 high,再 medium,最后 low。报告顶部的统计图能让你快速看到失败项的分布。不要追求 100% 通过——有些规则可能与你的业务需求冲突(例如禁用某个你确实要用的服务),这类项需要人工评估并记录例外。

OpenSCAP 能自动把失败项改为合规,有两种方式。

在扫描的同时直接应用修复:

扫描并立即修复(高风险)
$ sudo oscap xccdf eval \
--profile xccdf_org.ssgproject.content_profile_cis \
--remediate \
--results scan-results.xml \
--report report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

这种方式最快,但也最不可控,仅建议在一次性搭建的测试环境里使用。

修复完成后重新扫描一次,对比 fail 数量是否下降,确认改动生效。

如果你在用 Kickstart 自动化安装,可以在安装阶段就让系统达到合规状态,省去事后修复。Anaconda 提供了 org_fedora_oscap 插件:

Kickstart 中的 OSCAP addon 片段
%addon org_fedora_oscap
content-type = scap-security-guide
profile = xccdf_org.ssgproject.content_profile_cis
%end

安装程序会在装机过程中套用指定 profile,这样新机器一开机就已经加固。这是大规模部署里保持基线一致性的常用做法。

合规不止针对主机,容器镜像同样需要检查。安装 openscap-utils 后,用 oscap-podman 直接扫描镜像(无需启动容器):

扫描一个容器镜像
$ sudo oscap-podman registry.access.redhat.com/ubi9/ubi:latest \
xccdf eval \
--profile xccdf_org.ssgproject.content_profile_cis \
--report container-report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

把这一步放进 CI 流水线,就能在镜像发布前拦住不合规的构建。

合规不是一次性的——配置会随时间漂移。用 systemd timer 定时扫描并归档报告,就能持续掌握系统状态。

  1. 写一个扫描脚本,把报告按日期归档:

    /usr/local/sbin/compliance-scan.sh
    $ sudo tee /usr/local/sbin/compliance-scan.sh <<'EOF'
    #!/bin/bash
    set -euo pipefail
    DS=/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
    PROFILE=xccdf_org.ssgproject.content_profile_cis
    OUT=/var/log/compliance
    DATE=$(date +%Y%m%d)
    mkdir -p "$OUT"
    oscap xccdf eval --profile "$PROFILE" \
    --results "$OUT/results-$DATE.xml" \
    --report "$OUT/report-$DATE.html" \
    "$DS" || true
    EOF
    $ sudo chmod +x /usr/local/sbin/compliance-scan.sh

    结尾的 || true 是为了避免规则失败时的非零退出码让 timer 标记为失败。

  2. 创建 service 和 timer 单元,让它每周运行一次。具体写法参考 定时任务 (Timer)

/usr/share/xml/scap/ssg/content/ 为空或不存在,说明没装基线内容包:

Terminal window
$ sudo dnf install scap-security-guide

注意它和 openscap-scanner 是两个不同的包,扫描器装了不代表内容也装了。

profile ID 是那串 xccdf_org.ssgproject.content_profile_...,不是人类可读的标题。用 oscap info <datastream> 查看完整列表,复制其中的 Id: 值。

完整扫描遍历几百条 OVAL 检查,在慢速磁盘或资源紧张的机器上可能要几分钟,这是正常的。如果只想验证少数几条规则,可以用 --rule <rule_id> 只跑指定规则,速度会快很多。

这正是反复强调「先在快照上测试」的原因。如果生产系统已经被改坏:用虚拟机快照或备份回滚是最可靠的办法。所以执行 --remediate 之前,永远先确认有可回滚的还原点。