CMMC Level 2 / NIST 800-171 baseline diagnostic and fleet orchestration tool.
Program still needs to be tested on Windows*
cd program
python3 -m venv .venv
# macOS/Linux
source .venv/bin/activate
# Windows
.venv\Scripts\activate
pip install -e .| Platform | File |
|---|---|
| macOS | double-click launcher/MSTechAlpine-Fleet-Commander.command |
| Windows | double-click launcher/MSTechAlpine-Fleet-Commander-Windows.cmd |
The local diagnostic path runs on Python 3.10+ stdlib only. Optional discovery and cloud checks require external tools such as nmap, az CLI, and gcloud CLI.
Runs all security checks on the current machine and saves a JSON evidence artifact.
fleet-commander --json-output evidence/diagnostic.jsonRuns everything: local checks, network discovery, SBOM, vulnerability scan, HTML report, cloud portal checks, and SRM spreadsheet. This is the command for pre-assessment prep.
sudo .venv/bin/fleet-commander \
--discover-network auto \
--auto-tag \
--asset-tags evidence/asset-tags.json \
--discovery-output evidence/fleet-discovery.json \
--diagram-output evidence/network-architecture.svg \
--sbom-output evidence/sbom.json \
--srm evidence/srm.xlsx \
--vuln-scan \
--vuln-output evidence/vulns.json \
--html-output evidence/report.html \
--cloud-api \
--sanitize \
--json-output evidence/diagnostic-c3pao.jsonPlain sudo fleet-commander may resolve outside the virtualenv and miss the editable install you just created.
After the run, the tool prints a file:// URI — click it to open report.html directly in your browser.
Use when auto-detect picks the wrong interface (e.g. VPN is active).
sudo .venv/bin/fleet-commander \
--discover-network 10.0.0.0/24 \
--auto-tag \
--asset-tags evidence/asset-tags.json \
--discovery-output evidence/fleet-discovery.json \
--diagram-output evidence/network-architecture.svg \
--json-output evidence/diagnostic.jsonSlower (~2 min/host) but finds obscure services. Use for deep audits, not daily runs.
sudo .venv/bin/fleet-commander \
--discover-network auto \
--discovery-full-scan \
--auto-tag \
--asset-tags evidence/asset-tags.json \
--discovery-output evidence/fleet-discovery.json \
--diagram-output evidence/network-architecture.svg \
--json-output evidence/diagnostic.jsonRuns the diagnostic on every in-scope host over SSH, pulls back per-host JSON artifacts, and SHA-256 hashes everything into the evidence ledger.
fleet-commander \
--fleet-run \
--fleet-inventory evidence/fleet-discovery.json \
--fleet-user admin \
--fleet-ssh-key ~/.ssh/id_ed25519 \
--fleet-output-dir evidence/fleet-results \
--hash-ledger evidence/hash-ledger.jsonl- Default interactive behavior: the run returns success if it completed and wrote its artifacts, even when red findings are present.
- Strict automation behavior: add
--strict-exit-codesto return a non-zero exit code when red findings are detected.
Use strict mode for CI pipelines or scripted gating. For normal human use, read the findings, review the generated artifacts, and remediate the red items before affirming readiness.
| Flag | Default | Description |
|---|---|---|
--json-output PATH |
(none) | Write diagnostic results to this JSON file |
--html-output PATH |
(none) | Write an HTML report (RED/YELLOW/GREEN findings, CMMC domain map, remediation steps) |
--sbom-output PATH |
(none) | Write a CycloneDX 1.6 Software Bill of Materials (JSON) |
--srm PATH |
(none) | Write a Security Requirements Matrix spreadsheet (110 NIST 800-171 Rev 2 controls) |
--hash-ledger PATH |
evidence/hash-ledger.jsonl |
Append-only SHA-256 hash-chained ledger for all artifacts |
| Flag | Default | Description |
|---|---|---|
--discover-network [CIDR] |
(none) | Run nmap discovery. Omit the value to auto-detect your local subnet. Pass a CIDR (e.g. 10.0.0.0/24) to override. |
--discovery-full-scan |
off | Scan all 65535 ports instead of top 200 (slow, thorough) |
--auto-tag |
off | Write discovered IPs + auto-categories back to --asset-tags file |
--asset-tags PATH |
(none) | JSON file mapping IP/hostname → 32 CFR 170.19 category (manual overrides) |
--discovery-output PATH |
evidence/fleet-discovery.json |
Where to write the discovery JSON |
--diagram-output PATH |
evidence/network-architecture.svg |
Where to write the SVG network diagram |
| Flag | Default | Description |
|---|---|---|
--fleet-run |
off | Push and run diagnostic on remote hosts via SSH |
--fleet-inventory PATH |
(none) | Use a saved discovery JSON instead of running --discover-network |
--fleet-user NAME |
(required) | SSH username for all remote hosts |
--fleet-ssh-key PATH |
(none) | Path to SSH private key |
--fleet-ssh-port PORT |
22 |
SSH port |
--fleet-output-dir PATH |
evidence/fleet-results |
Per-host artifact output directory |
--fleet-categories LIST |
CUI Asset,Security Protection Asset,Contractor Risk Managed Asset |
Comma-separated category filter — only run on matching hosts |
--fleet-max-hosts N |
0 (all) |
Cap the number of hosts processed |
| Flag | Default | Description |
|---|---|---|
--vuln-scan |
off | Cross-reference installed packages against OSV.dev CVE database (Homebrew, PyPI, npm, dpkg, Chocolatey, winget) |
--vuln-output PATH |
(none) | Write CVE findings to this JSON file |
| Flag | Default | Description |
|---|---|---|
--cloud-api |
off | Run live checks against FedRAMP, Azure CA, Intune, and BeyondCorp endpoints |
| Flag | Default | Description |
|---|---|---|
--sanitize |
off | Replace real usernames with user_01, user_02, … in all output. Detection logic still runs on real names before anonymization. Use when sharing artifacts in environments where usernames are PII or CUI metadata. |
| Check | Control | What it does |
|---|---|---|
is_admin_context |
IA.L2-3.5.1 | Detects if running as root/admin (signals access privilege context) |
check_encryption |
SC.L2-3.13.8 | FileVault / BitLocker / LUKS enabled |
check_mfa_signal |
IA.L2-3.5.3 | Hardware FIDO2 AAGUID detection — distinguishes hardware-bound keys (YubiKey, Feitian) from software authenticators. Windows: reads FIDO enrollment registry keys. Linux/macOS: reads fido2-token -I AAGUID and matches to known vendor list. |
check_remote_access_shadow_tools |
AC.L2-3.1.3 | Detects shadow RMM tools (TeamViewer, AnyDesk, etc.) |
check_time_sync_signal |
AU.L2-3.3.7 | NTP/chrony/timesyncd drift detection |
check_patch_signal |
SI.L2-3.14.1 | OS patch currency signals |
check_account_signal |
IA.L2-3.5.1 | Shared/generic account name detection. Supports --sanitize. |
check_audit_log_signal |
AU.L2-3.3.1 | Rev 3 IR window — Verifies audit log continuity: macOS Unified Log (24 h event count), Linux journald + audit.log, Windows Security log. RED if zero events in 24 h. |
check_boundary_violations |
AC.L2-3.1.20 | VLAN/segment boundary enforcement — On discovery, flags CUI assets co-mingled with Out-of-Scope hosts in the same /24, and OOS hosts with CUI-tier ports open (22, 443, 3389, 8443). |
Note on FIDO2 AAGUID checking: The tool ships with a curated list of known hardware-key AAGUIDs (YubiKey 5 Series, Feitian ePass/BioPass, Windows Hello Hardware). Add your organization's issued key AAGUIDs to
_HARDWARE_KEY_AAGUIDSincli.pyfor a stronger enforcement signal.
Edit evidence/asset-tags.json to manually pin IPs to categories.
Use --auto-tag to let the tool fill this in from nmap signals.
| Category | Meaning |
|---|---|
CUI Asset |
Stores, processes, or transmits CUI — highest scrutiny |
Security Protection Asset |
Protects CUI (firewall, IdP, SIEM) — must be secured |
Contractor Risk Managed Asset |
On-network but not touching CUI — risk-managed |
Out-of-Scope |
Outside the assessment boundary |
| File | Contents |
|---|---|
evidence/diagnostic-c3pao.json |
Full diagnostic results — machine readable, SHA-256 hash-chained |
evidence/report.html |
Human-readable report — RED/YELLOW/GREEN findings, CMMC domain map, remediation steps |
evidence/sbom.json |
CycloneDX 1.6 Software Bill of Materials |
evidence/srm.xlsx |
Security Requirements Matrix — 110 NIST 800-171 Rev 2 controls |
evidence/fleet-discovery.json |
Discovered network assets with OS, open ports, auto-category |
evidence/network-architecture.svg |
Color-coded network topology diagram (open in any browser) |
evidence/asset-tags.json |
IP → 32 CFR 170.19 category map (auto-generated or manual) |
evidence/vulns.json |
CVE cross-reference against installed packages via OSV.dev |
evidence/hash-ledger.jsonl |
Append-only SHA-256 hash chain — tamper-evident audit trail |
evidence/fleet-results/<ip>/diagnostic.json |
Per-host diagnostic from fleet SSH run |
All files in
evidence/are gitignored. Keep them private — they contain hostnames, usernames, and network topology. All files are written with0o600permissions (owner read/write only).
This section is non-negotiable. Read it before you affirm anything in SPRS.
The U.S. Department of Justice's Civil Cyber Fraud Initiative has been aggressive since 2025. A green diagnostic result is not proof of compliance.
What the tool proves:
- Certain technical signals are present, such as encryption tooling, MFA capability, audit logging continuity, and patch posture.
What the tool does not prove:
- Controls are enforced and operating effectively
- Your written policies and SSP match the real environment
- Evidence artifacts meet assessor expectations on their own
- You are legally compliant with NIST 800-171 or CMMC
The risk:
If you affirm a readiness score in SPRS without evidence to back it up, you are making a material misrepresentation to the federal government. That creates False Claims Act exposure, including civil liability, treble damages, and personal risk for signatories.
The safe path:
- Run the tool and get a technical baseline.
- Build the evidence package: SSP, policy enforcement logs, audit trails, and control testing records.
- Before affirming anything in SPRS, have legal counsel and/or a C3PAO review the evidence package.
- Submit a readiness score only after that review.
Bottom line:
Green tool output plus weak evidence is fraud risk. Green tool output plus strong evidence and professional review is a defensible position.
If the script is all green but you do not have the paperwork, you are not ready to affirm.
What to do next after a run:
- Open the JSON and HTML artifacts and identify every red finding first.
- Separate setup gaps from security gaps. Missing files such as an empty SRM are documentation gaps; missing alerting, logging, or enforcement are control gaps.
- Remediate the red findings and rerun the tool to confirm they clear.
- Once red findings are addressed, review the remaining yellow findings as manual verification items.
- Pair the final artifact set with your SSP, POA&M, and supporting logs before any SPRS affirmation or C3PAO review.
Ready for expert review? Book a Tier 2 Validation. We will audit what you built and prioritize your next steps.