The project mindset, and why it fails quietly

Every hardening project ends the same triumphant way: the golden image passes its benchmark scan, the report gets attached to the change ticket, and the box ships to production at a hardening score everyone is proud of. That score is already wrong by the time anyone reads it. A patch lands. A package gets installed for a one-off troubleshooting session and never removed. A well-meaning admin flips a setting to unblock a vendor tool. The system starts drifting away from the baseline before the ink on the audit finding is dry.

Most teams that get burned by hardening are not burned by a bad benchmark. They are burned by treating benchmark alignment as a one-time project rather than an operational control. That approach works fine on day one. It breaks down as the estate grows, because manual fixes do not scale and drift returns with the very next change cycle. The failure is quiet because nothing alerts you to it: the asset inventory changes, configurations drift, new vulnerabilities are disclosed, and accounts survive long after the person who owned them left. None of that shows up in last quarter's report. It shows up in an incident review, when someone asks why a setting that was supposedly hardened was not, and the honest answer is that it was, eleven months ago.

Exhibit 1

Hardening as a lifecycle, in one view

A benchmark score is a photograph. The pipeline that re-takes it every night, on every host, is the only version of hardening that still describes reality.

Hardening as a project
  • One benchmark scan, attached to the change ticket
  • The score starts decaying the moment it is taken
  • Drift is discovered in an incident review, months later
  • Exceptions are granted quietly and forgotten
Hardening as a lifecycle
  • The baseline is codified and pushed automatically
  • Scanned on a schedule, not before an audit
  • Drift is alerted on and routed like an incident
  • Exceptions are documented, justified and reviewed
Two scanners, two jobs
ToolWhat it evaluatesWhat it answers
OpenSCAPThe host against a named benchmark profile: CIS, DISA STIG or another standard"Are we aligned to the standard we are measured against?"
LynisHundreds of host-level checks not tied to any named benchmark: kernel parameters, packages, services, permissions"What has drifted or accumulated that no named control covers yet?"
The benchmark score is a photograph. A pipeline that re-takes it every night is the only version of hardening that still describes reality.Rhinexa Perspective · Ananthapurnasai Kanajam
Exhibit 1. Hardening treated as a project against hardening treated as a lifecycle, and what each scanner in the pipeline is actually for. Download it as an image for your own board pack.

What CIS Controls v8 actually asks for

It is easy to read CIS Controls v8 as an 18-item checklist and stop there. Read past the checklist and the framework is structured around lifecycle language, not one-time tasks. Control 4, Secure Configuration of Enterprise Assets and Software, does not say "harden the build". It requires establishing, implementing and maintaining hardened configurations, because default configurations are insecure by default and stay that way unless something actively keeps them from drifting back.

The same pattern runs through the controls that sit next to hardening. Account management is not "set up accounts correctly", it is the full lifecycle of credentials: provisioning with appropriate initial permissions, adjusting access as roles change, revoking it promptly when someone leaves. Vulnerability management is not a scan run before an audit, it is scan, prioritise and remediate on a regular cadence. CIS did not write a hardening checklist with a lifecycle bolted on. The lifecycle is the control. The checklist is just the part that is easy to screenshot.

That distinction matters practically because it changes what "done" means. A benchmark score with unmanaged devices, contractor endpoints or quietly granted engineering exceptions excluded from the count is not meaningful, however high the number is. The pattern CIS Controls v8 is actually describing is to define the desired state, push it automatically, verify it continuously through telemetry, and alert on drift the moment it happens, not the moment someone remembers to check.

OpenSCAP and Lynis: two different jobs

The tooling half of this only works if you are honest about what each tool is for, because OpenSCAP and Lynis answer different questions well, not the same question twice.

OpenSCAP is the compliance-mapped scanner. Run against a SCAP Security Guide content profile, it evaluates a system against a specific named standard, CIS, DISA STIG or another benchmark, and produces a result that maps cleanly back to a control ID an auditor recognises. A typical invocation looks like:

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

That output is what turns "we think we are CIS-aligned" into a result you can hand to an auditor, because it is evaluated against the same content the benchmark itself defines.

Lynis is the broader auditor, and it does not need the system pre-classified against a named benchmark to be useful. It runs hundreds of checks directly on the host, kernel parameters, installed packages, network services, file permissions, cryptography settings, logging configuration, and produces a hardening index alongside specific, actionable recommendations, not just a pass or fail. It is the tool that catches the thing nobody wrote a named benchmark control for yet: the leftover debug package, the world-writable directory nobody remembers creating, the cron job with a suspicious owner.

Run alongside each other, the two cover different failure modes: OpenSCAP proves alignment to the standard you are measured against, Lynis catches the drift and cruft that accumulates in the space the standard does not explicitly enumerate. Running both in the same pipeline is exactly that pairing, named-benchmark evidence and broader hardening signal from the same run.

Where the lifecycle lives: the loop, not the tools

Neither tool, run once, builds a lifecycle. They are the sensors, not the process. The lifecycle is the loop those sensors feed.

01

Define the baselineStart from the CIS Benchmark for the platform, review Level 1 recommendations against real operational requirements, and document any exception with a business justification, not a silent skip.

02

Test before productionApply configuration changes in a non-production environment first. A hardening setting that breaks a business-critical integration does not stay hardened long; it gets rolled back in a panic and never revisited.

03

Codify it, do not hand-apply itRemediations belong in Ansible, Terraform or the equivalent, so the baseline is enforced the same way on the hundredth server as the first.

04

Scan on a schedule, not before an auditOpenSCAP and Lynis on a recurring cadence, nightly or on every deploy, are what make manual compliance checks unnecessary in the first place.

05

Alert on drift, and route it like an incidentA system falling out of its hardened baseline is a finding, not paperwork. It needs an owner and a fix window, the same as any other detected gap.

06

Feed exceptions back into governanceSome Level 2 controls genuinely create support burden without a measurable gain in a given environment. That is a legitimate outcome, but only as a documented, reviewed exception, never a control that quietly stopped being enforced.

Level 1 versus Level 2, and the failure mode both create

That loop is also where Level 1 versus Level 2 discipline matters most. Level 1 controls are the defensive baseline every production system should carry without much functional trade-off. Level 2 is stricter, meant for environments where the trade-offs are acceptable. The common failure mode is applying Level 2 everywhere, which creates enough operational friction that teams end up disabling controls entirely rather than living with them. A lifecycle that produces that outcome is not more secure. It is a hardening programme that taught its own operators to route around it.

The benchmark score is a photograph. A pipeline that re-takes that photograph every night, on every host, and files a ticket the moment the picture changes: that is the only version of hardening that still describes reality by the time anyone reads it.

Where this changes what gets scoped

Treating hardening as a lifecycle changes what gets asked for at a project kickoff. Instead of "harden these servers before go-live", the scope becomes: define the baseline, codify the remediation, wire up recurring OpenSCAP and Lynis scans, set drift-alerting thresholds, and assign an owner for the exception log, all before the first server ships, because retrofitting the pipeline onto a fleet that has already drifted is a much bigger project than building it in from the start.

It also changes the metric leadership sees. A single hardening score at go-live is a vanity number. A trend line showing score over time, drift incidents caught and remediated, and the age of the oldest undocumented exception is the number that actually says whether the programme is working, and it is the number CIS Controls v8 was describing all along, once you stop reading it as a checklist.

Ananthapurnasai Kanajam

Security Engineer, Rhinexa

Ananthapurnasai works across network and detection engineering at Rhinexa, turning segmentation design and purple-team findings into controls that operate rather than sit in a report.