Pavois vs OpenSCAP, Lynis and CIS-CAT: Linux effective-configuration benchmark
Pavois is one of several Linux compliance scanners. The difference is not the catalogue, it is what each tool reads. Pavois audits the configuration a service actually runs (sshd -T, sysctl, systemctl show, auditctl -l); for many configuration controls the others probe declared files or benchmark-defined paths; Pavois prefers a resolved runtime read whenever the component exposes one.
In short: on the SSH drop-in scenario, Pavois and Lynis read the effective config and catch it; OpenSCAP/SSG's file-probed rule passes (a false negative). The edge is that Pavois turns that into a normative, multi-standard control plus a remediation proof. On inventory, filesystem, standard reporting and ecosystem maturity, OpenSCAP and CIS-CAT stay stronger. Pavois's standard mappings are cross-references, not official certification claims.
At a glance
| Pavois | OpenSCAP | Lynis | CIS-CAT | |
|---|---|---|---|---|
| Engine | CINC Auditor / InSpec (native binary) | OVAL + XCCDF | single shell script | Java |
| Reads | effective state, sshd -T, sysctl, systemctl show, auditctl -l |
files on disk for most config rules (OVAL probes; its sysctl probe does read /proc/sys) | files (sshd -T for SSH) |
files & declared policy |
Sees Includes / drop-ins |
yes, resolved | rarely (file-probed) | partial (SSH via sshd -T) |
usually missed |
| Standards | CIS · ANSSI BP-028 · NIST · PCI-DSS · STIG, one control, N tags | CIS · STIG · ANSSI · PCI · NIST (SSG) | heuristic, none | CIS only |
| Licensing | open (Apache-2.0) | open | open (GPL) | Lite free & limited; full = paid CIS SecureSuite |
| Output | A:E chaptered report · SARIF/JUnit/HTML/JSON/CSV · OSCAL | XCCDF HTML · ARF | text + hardening index | HTML + score |
| Remediation | harden-as-code (native Chef, opt-in) | bash / Ansible fixes | suggestions only | none |
None of these tools is bad, OpenSCAP/SSG in particular is a mature, standard, broadly-supported stack, and Pavois even cross-validates its mappings against SSG. The point is narrower and only about the service-resolved controls: when a drop-in overrides the main file, an OVAL probe pointed at the file misses it unless it was specifically written for the resolved path, so in practice the file-based tools usually miss that case, where an effective-config read catches it. For inventory, package or filesystem controls the gap mostly closes.
Which tool, when?
Short answer, by goal:
- Use Pavois when you need the effective configuration audited (drop-ins,
Includes, runtime overrides resolved), one neutral control mapped to several standards at once, an A:E graded report, and opt-in harden-as-code with a signed evidence bundle. - Reach for OpenSCAP / SSG when you need a mature, official SCAP pipeline with broadly-supported XCCDF/ARF and vendor-shipped datastreams, especially where file-and-OVAL coverage is enough.
- Reach for Lynis when you want a fast, zero-setup host hardening sweep and a quick heuristic index, with no standard mapping required.
- Reach for CIS-CAT when you need an official CIS attestation (CIS SecureSuite) and the certified benchmark number is what your auditor demands.
They compose: Pavois even cross-validates its mappings against SSG. Pavois's edge is narrow and specific, service-resolved controls; for inventory, package and filesystem controls the tools largely converge.
By evidence type
A tool-vs-tool table flatters whoever wrote it. The honest cut is by what kind of evidence a control needs, read down a tool's column, not across one row:
| Evidence the control needs | Pavois | OpenSCAP / SSG | Lynis | CIS-CAT |
|---|---|---|---|---|
Runtime-resolved (sshd -T, sysctl, systemctl show, auditctl -l) |
strong | rarely (file-probed) | partial | benchmark-dependent |
| Persistent config with drop-in precedence | strong | file, often single-path | partial | benchmark-dependent |
| Inventory (packages, accounts present/absent) | yes | yes | yes | yes |
| Filesystem (mode / owner / SUID) | yes | yes | yes | yes |
| Official standard authority | mapping (unofficial) | SSG datastreams | none | CIS official |
| Mature remediation | harden-as-code (young) | SSG bash / Ansible | suggestions | none |
| Reporting & ecosystem | A:E · OSCAL | XCCDF / ARF, broad | hardening index | CIS suite |
Pavois leads on the two resolved-state rows, that is the whole reason it exists, and is on par (inventory, filesystem) or genuinely behind (official-standard authority, remediation maturity, ecosystem) on the rest. Pick the tool by the evidence your control actually needs; for a regulated CIS attestation you may still want CIS-CAT, for a broad SCAP pipeline OpenSCAP. They compose.
A reproducible benchmark
We ran the canonical drop-in case on a fresh Debian 12 VM (provision → snapshot → restore, identical every run): the main sshd_config says PermitRootLogin no, a drop-in in sshd_config.d/ says yes, the value that actually applies. Tools as shipped on Debian 12:
| Scanner | Reads | Result on the drop-in |
|---|---|---|
| Pavois | sshd -T |
FAIL, caught and mapped to ssh-disable-root-login (CIS / BP-028 / STIG) |
| OpenSCAP 1.3.7 + SSG | OVAL on the file | PASS, a false negative: it reads the main file's no and misses the drop-in |
| Lynis 3.0.8 | sshd -T |
warns (SSH-7408 suggestion), caught but heuristic, not standard-mapped |
The gap is real and narrow, and we state it honestly: Lynis resolves the drop-in like Pavois (it runs sshd -T), but only as a non-normative hint; OpenSCAP/SSG's file-probed rule misses it outright; Pavois resolves it and maps it to every applicable standard it carries. Reproduce it with tools/benchmark/effective-config-bench.sh <user@host> <key> <ssg-debian12-ds.xml>, re-run from an identical snapshot each time.
Breadth matters too, so we also count the rules each tool implements by severity (this is not a winner metric: more rules is not better, and scoping differs). For Debian 12:
| Tool | Controls | critical | high | medium | low |
|---|---|---|---|---|---|
| Pavois | 607 | 11 | 21 | 510 | 65 |
| OpenSCAP / SSG datastream | 887 | none (no critical tier) | 37 | 734 | 70 + 46 unknown |
| Lynis | heuristic | no per-rule severity model, no standard mapping |
SSG carries more raw rules and is more mature; Pavois adds a critical tier SSG's model lacks, every control declares its evidence type and carries every applicable normative mapping, and Lynis has no per-rule severity at all. The drop-in case is about the kind of evidence; this table shows Pavois is comprehensive, not a single trick.
The comparison ships as a tool: tools/coverage_gap.py maps Pavois controls to SSG rules (via the ssg: tags) and triages the gap with oscap's own verdicts on a real target. The raw 315 SSG rules Pavois does not map collapse to 87 applicable and failing once N/A is removed (139 are notapplicable on Debian, e.g. SELinux; 15 are not auto-checked; 74 already pass). Symmetrically, Pavois applies to 523 of its 607 Debian 12 controls on a fresh host (84 N/A). Raw catalogue counts overstate on both sides; the honest, applicable gap is 87, and --create-issues files it as backlog (broken controls become bug issues). Full method, exact commands, tool versions and the per-rule CSV: docs/benchmark.
OpenSCAP (SCAP / OVAL)
OpenSCAP is the reference implementation of SCAP, the NIST-standardised format tying XCCDF (benchmark & rules), OVAL (the low-level checks) and CPE (platform ID). It is genuinely strong: the SCAP Security Guide ships SCAP datastreams (XCCDF/OVAL) mapping rules to CIS, ANSSI BP-028, DISA STIG, PCI-DSS and NIST 800-53, it emits bash and Ansible remediation, and its HTML report is the layout Pavois's renderer aims to equal.
The structural limit is how OVAL checks work: most inspect files on disk (textfilecontent54 greps a config file). An OVAL check pointed at sshd_config never sees a drop-in in sshd_config.d/, it reads the default and prints PASS while the drop-in re-enabled PermitRootLogin yes. Pavois keeps SCAP's chaptered, multi-norm report but swaps the file-reading engine for an effective-config one. It never runs oscap as an engine, only as a visual reference for the report layout.
Lynis
Lynis is a single shell script, no agent, no dependencies, that audits 60+ subsystems (462 tests in v3.0.8, the version Debian 12 ships; 3.1.x is current) in minutes and emits suggestions, warnings and a headline hardening index (0:100). As a fast first-pass triage and an inspiration source it is excellent: it tells you where to look.
But it is heuristic, not normative. Its checks encode good-practice opinions; they are not mapped to a published standard, and the hardening index is a Lynis-specific number, not a compliance verdict an auditor accepts. For SSH it actually runs sshd -T (like Pavois), so it resolves drop-ins there; it only greps the raw file for a few checks (e.g. AllowUsers) and for other subsystems. Its decisive limit is being heuristic, not a drop-in blind spot: use Lynis to spot the obvious and motivate quick wins, use Pavois for the rigorous, standards-mapped, auditable pass. Fabricating a lynis_X reference in place of a real CIS or BP-028 control would be a mistake, Pavois never does that.
CIS-CAT
CIS-CAT is the official CIS Configuration Assessment Tool, a Java scanner that grades a host against a CIS Benchmark. The catch is the membership model: CIS-CAT Lite is free but covers only a handful of benchmarks (Windows 10, Chrome, Ubuntu); the full CIS-CAT Pro Assessor requires paid CIS SecureSuite membership. So the one official tool for self-assessing against a publicly published standard sits behind a paywall: it is not an open rule engine, and the full assessor requires CIS SecureSuite membership.
Pavois is not CIS-CAT and ships no CIS content, it carries its own open rule base where CIS recommendation numbers are tags on neutral, stable IDs (473 controls carry an explicit cis: mapping). Select CIS in the report, pick Level 1 or 2, and Pavois recomposes a CIS-shaped view, openly, against the effective state, with no membership tier.
Remediation tools
Scanning finds the gap; remediation closes it. Here the landscape differs again, and Pavois's angle is that the same corpus that audits also fixes, in one loop.
| Pavois harden | ansible-lockdown | OpenSCAP remediation | manual | |
|---|---|---|---|---|
| Mechanism | native Chef convergence (InSpec's sibling) | Ansible roles (MindPoint Group) | bash / Ansible emitted from the benchmark | shell by hand |
| Tied to the audit | yes, scan → plan → apply → re-verify | separate playbook | separate from the scan | none |
| State-aware | reads current state, applies only the secure value, re-emits compliant drop-ins | declarative apply | applies the benchmark's fix | none |
| Opt-in granularity | per rule, with a dry-run | per role/tag | per rule | n/a |
| Risky fixes | delivered, not auto-run (kernel rebuild, judgement calls) | applied | applied | by hand |
| Reboot handling | detected and classed; --reboot re-scans after boot |
not modelled | not modelled | manual |
| Rollback | harden rollback restores files, packages and services from a pre-apply restore point (96% of controls, gaps named) |
re-run the playbook | re-run | manual |
| Proven after reboot | yes, with a reboot campaign (boot_id before/after) | no | no | no |
ansible-lockdown (the MindPoint Group CIS/STIG roles, distinct from the dev-sec.io hardening collections) is mature and widely used, Pavois even cross-validates its mappings against it. But it applies files and runs as a playbook decoupled from the audit, so nothing proves the running daemon ended up compliant. OpenSCAP emits bash/Ansible straight from the XCCDF benchmark, file-oriented, and you trust the benchmark's fix.
Pavois closes the loop instead: pavois harden plan reads the live state, you flip apply per rule, a native Chef run converges, and pavois diff re-scans the effective config to prove every gap is closed and nothing regressed. A fix you can't verify isn't evidence.
Where Pavois is not the right tool
Pavois is strong on resolved-state controls and remediation-as-code, but it is not the answer for everything, and saying so is the point:
- Official CIS self-assessment for a certification: CIS-CAT stays the authority; Pavois's
cis:tags are cross-references, not certified claims. - SCAP-native pipelines (XCCDF/OVAL/ARF, broad enterprise tooling): OpenSCAP/SSG is more mature.
- Lightweight first-pass triage: Lynis is faster and simpler.
- Mature remediation catalogues: SSG and ansible-lockdown are older and broader.
- And harden can be more dangerous: it applies real changes, some risky (a
kernel.modules_disabled=1once bricked an EFI boot), so risky fixes are delivered opt-in, not auto-run, and a reboot campaign proves the result.
Pick the tool by the evidence a control needs and the job at hand; they compose.
The engine: CINC Auditor / InSpec
Pavois is 100% CINC Auditor, the free, trademark-free build of Chef InSpec. A control describes the expected state of a resource in readable language; CINC runs it against the effective configuration. It runs as a native binary so a host scan (local://) and an SSH scan (ssh://) use your own ~/.ssh/config, routing and user, the container is only a zero-install fallback. Effective-config commands need privilege, so Pavois passes --sudo to CINC, over stdin, never the command line.