在运维工作中,安全合规检查往往被看作是繁琐的填表任务,但面对等保测评或企业内审时,手动逐项核对内核参数、文件权限和密码策略,不仅效率极低,还极易因人为疏忽导致漏报。OpenSCAP 的价值就在于将安全基线的检查过程自动化、标准化,它能够直接读取 SCAP 格式的合规策略文件,对 CentOS 系统进行深度扫描,并生成直观的 HTML 报告或 XML 结果集。你不需要逐条背诵那些晦涩的合规条款,只需配置好扫描策略,一条命令就能把系统中不符合安全基线的配置项全部揪出来。

理解 OpenSCAP 与 SCAP 安全指南的关系

在动手配置之前,有必要厘清工具和策略的关系。OpenSCAP 是一个开源框架,集成了 SCAP 协议栈,负责执行扫描和评估;而真正定义“怎样才算合规”的,是 SCAP 内容文件,通常指 SCAP Security Guide 提供的 DataStream 文件。在 CentOS 上,这个文件一般以 scap-security-guide 软件包的形式存在,安装后会生成包含 XCCDF 清单、OVAL 定义以及 CPE 字典的复合 XML 文档。你可以把它理解为一份可被机器读取的安全检查清单,里面详细描述了诸如“SSH 不允许 root 登录”、“密码最短长度必须大于等于 8 位”等具体规则。OpenSCAP 读取这份清单,逐条验证系统状态,最后给出通过或失败的结果。

安装 OpenSCAP 及必备工具包

CentOS 7 和 CentOS 8 的官方仓库默认收录了 OpenSCAP 及其配套工具,安装过程非常直接。执行以下命令即可完成核心组件的部署:

yum install openscap-scanner scap-security-guide -y

如果是 CentOS 8 及以上版本,命令需替换为 dnf。安装完成后,系统会多出 oscap 命令行工具,同时 /usr/share/xml/scap/ssg/content/ 目录下会出现针对不同系统的 DataStream 文件。以 CentOS 7 为例,常见的文件名为 ssg-centos7-ds.xml。这个文件集成了多个合规配置文件,例如 PCI-DSS、CIS、标准系统安全基线等。你可以通过 oscap info 命令查看该 DataStream 中包含的具体 profile:

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

输出结果会列出所有可用的 profile 及其 ID,例如 xccdf_org.ssgproject.content_profile_pci-dss 对应 PCI-DSS 合规基线,xccdf_org.ssgproject.content_profile_cis 对应 CIS 基准。选择正确的 profile 是整个扫描流程的关键,如果选错了基线,即使系统配置得再安全,也可能因为规则集不匹配而出现大量误报或漏报。

执行一次完整的合规扫描并生成报告

最常用的扫描方式是直接调用 oscap xccdf eval 命令,同时指定 DataStream 文件、profile ID 以及结果输出格式。建议同时生成 XML 中间结果和 HTML 可读报告,前者用于后续的修复脚本生成,后者方便人工审阅。以下命令以 CIS 基线为例,对 CentOS 7 进行完整扫描:

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

命令执行时间取决于系统规模和规则数量,通常在几分钟内完成。扫描结束后,用浏览器打开 /tmp/report.html,你会看到一份色彩分明的合规报告。绿色行代表通过,红色行代表失败,灰色行表示不适用。点击任意失败条目,报告会展开详细的技术说明,包括该规则对应的 CCE 编号、严重等级以及具体的整改建议。这份报告可以直接作为等保测评的辅助材料提交,因为它已经将系统状态与标准基线进行了逐条对照。

针对特定规则进行精细化扫描

全量扫描虽然全面,但有时你只关心某一类安全配置,比如 SSH 加密算法或密码策略。OpenSCAP 支持通过 --rule 参数指定单条规则进行扫描,这在调试整改措施时非常实用。首先需要从 DataStream 中提取出规则的 ID,可以使用 oscap xccdf generate guide 命令生成一份包含所有规则说明的指南文档:

oscap xccdf generate guide --profile xccdf_org.ssgproject.content_profile_cis \
/usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml > /tmp/guide.html

在 guide.html 中找到你关心的规则 ID,例如确保 SSH 协议版本为 2 的规则 ID 是 xccdf_org.ssgproject.content_rule_sshd_allow_only_protocol2。随后单独扫描该规则:

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

这种方式能快速验证某条配置是否已修复到位,而不必每次都跑完整扫描。对于拥有数百台服务器的环境,先通过全量扫描发现问题,再针对高频失败规则编写自动化修复脚本,最后用单规则扫描验证,是效率最高的闭环流程。

利用 Bash 修复脚本实现自动化整改

OpenSCAP 的强大之处不仅在于发现问题,还在于能够直接生成针对失败规则的修复脚本。扫描完成后,基于 ARF 结果文件,使用 oscap xccdf generate fix 命令可以输出 Bash 脚本,该脚本包含所有失败规则对应的修复命令。执行方式如下:

oscap xccdf generate fix --result-id xccdf_org.open-scap_testresult_xccdf_org.ssgproject.content_profile_cis \
/tmp/arf.xml > /tmp/fix.sh

生成的 fix.sh 脚本会包含类似以下内容的命令:修改 /etc/ssh/sshd_config 中的 PermitRootLogin 为 no、使用 authconfig 设置密码复杂度、调整内核参数 net.ipv4.tcp_syncookies 等。在直接执行修复脚本之前,务必仔细审查脚本内容,因为某些修复操作可能影响业务连续性,例如直接禁用正在使用的网络服务或修改挂载选项。建议先在测试环境中执行,确认无误后再通过 Ansible 等自动化工具批量推送到生产环境。如果希望生成 Ansible Playbook 而非 Bash 脚本,只需将 generate fix 的 --output 格式指定为 ansible 即可,命令会自动输出 YAML 格式的修复任务。

定制化裁剪合规基线

预置的 profile 虽然覆盖面广,但未必完全契合企业实际需求。例如 CIS 基线要求 /tmp 分区必须挂载 noexec 选项,但某些旧应用可能依赖在 /tmp 下执行临时文件,直接套用会导致业务异常。OpenSCAP 允许通过定制文件对现有 profile 进行裁剪,去掉不适用或暂不执行的规则。定制文件是一个简单的 XML 文档,结构如下:



  Customized CIS Profile
  基于 CIS 基线,移除 tmp_noexec 规则