Skip to content

CIS Hardening

CIS Hardening evaluates your managed devices against Center for Internet Security (CIS) benchmarks and produces compliance scores, per-check findings, and remediation recommendations. You define baselines that specify a CIS benchmark version, security level, and optional exclusions. Breeze then scans devices against those baselines, producing a compliance score and a detailed list of passed and failed checks. When checks fail, you can request remediation actions that go through an approval workflow before being dispatched to the agent for execution.

The system supports Windows, macOS, and Linux benchmarks at both Level 1 (essential security) and Level 2 (defense in depth) profiles, plus custom baselines with specific check exclusions. Scans can be triggered on demand or scheduled to run automatically at configurable intervals.


OS TypeDescription
windowsWindows Server and Windows Desktop benchmarks
macosmacOS benchmarks
linuxLinux distribution benchmarks (Ubuntu, RHEL, CentOS, etc.)
LevelDescription
l1Level 1 — essential security settings that can be applied broadly with minimal impact on functionality. Recommended as a baseline for all systems
l2Level 2 — defense-in-depth settings that may restrict some functionality. Recommended for high-security environments
customCustom — based on L1 or L2 with specific checks excluded via customExclusions

Each individual CIS check produces one of these results:

StatusDescription
passThe device meets the benchmark requirement
failThe device does not meet the benchmark requirement — remediation recommended
not_applicableThe check does not apply to this device (e.g., a domain-specific check on a standalone workstation)
errorThe check could not be evaluated (e.g., insufficient permissions, missing utility)
SeverityDescription
lowInformational or hardening recommendation with minimal security impact
mediumModerate security setting — should be addressed in a reasonable timeframe
highImportant security control — failure represents a significant gap
criticalEssential security control — failure represents an immediate risk
StatusDescription
pending_approvalRemediation requested but awaiting administrator approval
queuedApproved and queued for dispatch to the agent
in_progressAgent is executing the remediation
completedRemediation completed successfully
failedRemediation failed during execution
cancelledRemediation was rejected or cancelled
StatusDescription
pendingAwaiting approval decision
approvedApproved by an administrator — remediation will proceed
rejectedRejected by an administrator — remediation will not proceed

A baseline defines the CIS benchmark, security level, and optional exclusions for a set of devices. Each baseline is scoped to an organization and targets a specific operating system.

Terminal window
POST /cis/baselines
Content-Type: application/json
Authorization: Bearer <token>
{
"orgId": "uuid",
"name": "Windows Server L1 Baseline",
"osType": "windows",
"benchmarkVersion": "3.0.0",
"level": "l1",
"customExclusions": [],
"scanSchedule": {
"enabled": true,
"intervalHours": 24,
"nextScanAt": null
},
"isActive": true
}
FieldTypeRequiredDescription
orgIdUUIDYesOrganization ID (auto-resolved for org-scoped tokens)
namestringYesBaseline name (max 200 chars)
osTypestringYesTarget OS: windows, macos, linux
benchmarkVersionstringYesCIS benchmark version (e.g., 3.0.0, 2.1.0)
levelstringYesSecurity level: l1, l2, custom
customExclusionsstring[]NoCheck IDs to exclude from evaluation (max 200)
scanScheduleobjectNoScan schedule configuration
isActivebooleanNoWhether the baseline is active (default true)
FieldTypeDescription
enabledbooleanWhether scheduled scanning is enabled
intervalHoursintegerScan interval in hours (1 to 168 / one week)
nextScanAtISO 8601Next scheduled scan time (null to let the system calculate)

To update an existing baseline, include the baseline id in the request body:

Terminal window
POST /cis/baselines
Content-Type: application/json
{
"id": "existing-baseline-uuid",
"orgId": "uuid",
"name": "Windows Server L1 Baseline (Updated)",
"osType": "windows",
"benchmarkVersion": "3.0.0",
"level": "l1",
"customExclusions": ["1.1.1", "1.1.2"],
"isActive": true
}
Terminal window
GET /cis/baselines?osType=windows&active=true&limit=50
ParameterTypeDescription
orgIdUUIDFilter by organization
osTypestringFilter by OS type: windows, macos, linux
activebooleanFilter by active status
limitintegerResults per page (1-200, default 100)
offsetintegerPagination offset

Terminal window
POST /cis/scan
Content-Type: application/json
Authorization: Bearer <token>
{
"orgId": "uuid",
"baselineId": "baseline-uuid",
"deviceIds": ["device-uuid-1", "device-uuid-2"]
}
FieldTypeRequiredDescription
orgIdUUIDNoOrganization ID (resolved from baseline if not provided)
baselineIdUUIDYesBaseline to evaluate against
deviceIdsUUID[]NoSpecific devices to scan (max 500). If omitted, scans all matching devices in the organization

The response includes the BullMQ job ID for tracking:

{
"message": "CIS scan queued",
"jobId": "bullmq-job-id",
"baselineId": "baseline-uuid"
}

Get a consolidated view of CIS compliance across all devices, including average scores, passing/failing device counts, and individual device results:

Terminal window
GET /cis/compliance?orgId=uuid&baselineId=uuid&minScore=0&maxScore=100&limit=100
ParameterTypeDescription
orgIdUUIDFilter by organization
baselineIdUUIDFilter by baseline
osTypestringFilter by OS type: windows, macos, linux
minScoreintegerMinimum compliance score (0-100)
maxScoreintegerMaximum compliance score (0-100)
limitintegerResults per page (1-500, default 200)
offsetintegerPagination offset

The response includes a summary and per-device results. Only the most recent scan result per device/baseline combination is included:

{
"data": [
{
"result": {
"id": "result-uuid",
"orgId": "uuid",
"deviceId": "device-uuid",
"baselineId": "baseline-uuid",
"checkedAt": "2026-02-15T10:00:00Z",
"totalChecks": 150,
"passedChecks": 138,
"failedChecks": 12,
"score": 92,
"findings": [],
"summary": {}
},
"baseline": {
"id": "baseline-uuid",
"name": "Windows Server L1 Baseline",
"osType": "windows",
"benchmarkVersion": "3.0.0",
"level": "l1",
"isActive": true
},
"device": {
"id": "device-uuid",
"hostname": "SERVER-01",
"osType": "windows",
"status": "online"
}
}
],
"summary": {
"devicesAudited": 45,
"averageScore": 87,
"failingDevices": 12,
"compliantDevices": 33
},
"pagination": {
"limit": 200,
"offset": 0,
"total": 45
}
}

Get the CIS scan history for a specific device with full findings detail:

Terminal window
GET /cis/devices/:deviceId/report?baselineId=uuid&limit=10
ParameterTypeDescription
baselineIdUUIDFilter results to a specific baseline
limitintegerNumber of recent results to return (1-200, default 50)

The response includes the device information and a list of scan results paired with their baseline definitions. Each result contains the full findings array with individual check details.

Each finding in a scan result contains:

FieldTypeDescription
checkIdstringCIS check identifier (e.g., 1.1.1, 2.3.17.1)
titlestringHuman-readable check title
severitystringlow, medium, high, critical
statusstringpass, fail, not_applicable, error
evidenceobjectPlatform-specific evidence of the check result
remediationobjectRecommended remediation (action, command type, payload, rollback hint)
messagestringAdditional context or error message

When CIS checks fail, you can request remediation actions that are dispatched to the agent after approval. This two-step workflow (request then approve) prevents accidental system changes from being applied without review.

Terminal window
POST /cis/remediate
Content-Type: application/json
Authorization: Bearer <token>
{
"orgId": "uuid",
"deviceId": "device-uuid",
"baselineId": "baseline-uuid",
"baselineResultId": "result-uuid",
"checkIds": ["2.3.17.1", "2.3.17.2", "18.9.4.1"],
"action": "apply",
"reason": "Quarterly hardening pass for production servers"
}
FieldTypeRequiredDescription
orgIdUUIDNoOrganization ID (resolved from device if not provided)
deviceIdUUIDYesTarget device
baselineIdUUIDNoBaseline to reference (resolved from latest result if not provided)
baselineResultIdUUIDNoSpecific scan result to remediate against (uses latest if not provided)
checkIdsstring[]YesCIS check IDs to remediate (1-100). Must be currently failing checks
actionstringNoapply (default) or rollback
reasonstringNoReason for the remediation request (max 1,000 chars)

The response creates one remediation action per check ID, all in pending_approval status:

{
"message": "Created 3 CIS remediation action(s) pending approval",
"deviceId": "device-uuid",
"baselineId": "baseline-uuid",
"baselineResultId": "result-uuid",
"actionIds": ["action-uuid-1", "action-uuid-2", "action-uuid-3"],
"approvalStatus": "pending"
}
Terminal window
POST /cis/remediate/approve
Content-Type: application/json
Authorization: Bearer <token>
{
"actionIds": ["action-uuid-1", "action-uuid-2"],
"approved": true,
"note": "Approved for production hardening window"
}
FieldTypeRequiredDescription
actionIdsUUID[]YesRemediation action IDs to approve or reject (1-500)
approvedbooleanYestrue to approve (queue for execution), false to reject (cancel)
notestringNoApproval or rejection note (max 1,000 chars)

When approved:

  • Status changes from pending_approval to queued
  • Approval status changes from pending to approved
  • Actions are dispatched to the agent through BullMQ
  • If any individual action fails to queue, it is rolled back to pending_approval

When rejected:

  • Status changes from pending_approval to cancelled
  • Approval status changes from pending to rejected
  • No commands are sent to the agent
Terminal window
GET /cis/remediations?status=pending_approval&deviceId=uuid&limit=50
ParameterTypeDescription
orgIdUUIDFilter by organization
statusstringFilter by status: pending_approval, queued, in_progress, completed, failed, cancelled
approvalStatusstringFilter by approval status: pending, approved, rejected
deviceIdUUIDFilter by device
baselineIdUUIDFilter by baseline
limitintegerResults per page (1-200, default 100)
offsetintegerPagination offset

Each remediation action in the response includes the device hostname, baseline name, check ID, status, approval details, and execution timestamps.


MethodPathDescription
GET/cis/baselinesList baselines (requires devices:read)
POST/cis/baselinesCreate or update a baseline (requires orgs:write)
MethodPathDescription
POST/cis/scanTrigger a CIS scan (requires devices:write)
MethodPathDescription
GET/cis/complianceOrganization compliance overview with device results (requires devices:read)
GET/cis/devices/:deviceId/reportDevice-level scan history with findings detail (requires devices:read)
MethodPathDescription
POST/cis/remediateRequest remediation for failing checks (requires orgs:write)
POST/cis/remediate/approveApprove or reject pending remediation actions (requires orgs:write)
GET/cis/remediationsList remediation actions with filtering (requires devices:read)

Scan queued but no results appearing. After triggering a scan, the BullMQ job dispatches the baseline configuration to the agent. If results do not appear, verify the target device is online and the agent is connected. Check that the baseline’s osType matches the device’s operating system. Review BullMQ dashboard for failed jobs in the CIS scan queue.

Compliance score is 100 but device has known security gaps. A score of 100 means all checks in the baseline passed. Verify that the baseline uses the correct benchmark version and level for your requirements. If you are using a custom level with customExclusions, the excluded checks are not counted and do not affect the score. Consider using the l2 level for more comprehensive coverage.

Remediation request rejected with “checkIds are not currently failing.” The requested check IDs must be present in the referenced baseline result’s findings array with a fail status. If the checks were passing, not applicable, or errored, they cannot be remediated. Get the device report to see the current check statuses: GET /cis/devices/:deviceId/report.

Approved remediation stuck in queued status. After approval, remediation actions are dispatched through BullMQ. If the action remains in queued status, verify that the CIS remediation worker is running and processing jobs. Check Redis connectivity and BullMQ queue health.

Remediation approval rolled back after queue failure. If the BullMQ dispatch fails for approved actions, their status is automatically rolled back to pending_approval with pending approval status. The response includes a failedActionIds array listing the affected actions. Resolve the BullMQ issue and retry the approval.

Baseline scan schedule not triggering. Verify the scanSchedule.enabled field is true and intervalHours is set to a valid value (1-168). The nextScanAt timestamp indicates when the next scan is expected. If the scan scheduler is not running, scans will not trigger automatically — check that the BullMQ scheduler worker is active.

Device report shows old results but device was recently scanned. The device report returns results ordered by checkedAt descending. If the latest scan failed or is still in progress, results from previous scans will be shown. Check GET /cis/compliance to see the latest result status for the device.