Skip to content

TroutSoftware/Open-CMMC

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

7 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Open-CMMC

License Security Policy Go FIPS 140-3 CMMC Level 2 Compatible with Access Gate

Open-CMMC file browser β€” CUI-marked folders with BASIC / SP-ITAR classifications visible in the listing

On-prem storage for Controlled Unclassified Information (CUI) at CMMC Level 2 / NIST SP 800-171 Rev 2. A hardened fork of filebrowser/filebrowser (Apache-2.0) that runs as a single Go binary on RHEL 9 or AlmaLinux 9 with FIPS mode enabled.

Authentication is externalized to OIDC (Keycloak, Entra GCC High, Okta Gov, Ping). Files are encrypted at rest (AES-256-GCM envelope), scanned on upload (ClamAV fail-closed), and every action emits a tamper-evident audit event.

Why now: CMMC Program Final Rule is in effect (32 CFR 170); Phase 2 begins 2026-11-10 and requires a C3PAO assessment for Level 2 contracts. FIPS posture inherits OpenSSL CMVP #4774 via RHEL / Alma go-toolset β€” appliances ship audit-ready.


Table of contents


Architecture

Full architecture: docs/architecture.md β€” topology, components, data + audit flows, firewall rules, key management, TLS profile.

Turnkey shape: one VM, one command, the whole CUI enclave β€” cmmc-filebrowser plus a bundled Keycloak-FIPS OIDC IdP. Monitoring (Wazuh) and external auth / SIEM integrations are optional add-ons layered on top.

β”Œβ”€β”€β”€ CUI enclave Β· single VM Β· RHEL 9 / Alma 9 FIPS ───────────────────┐
β”‚                                                                      β”‚
β”‚   cmmc-filebrowser  ◄── OIDC + MFA ──►  cmmc-keycloak                β”‚
β”‚     Go Β· TLS 1.3 FIPS                    (bundled OIDC IdP)          β”‚
β”‚         β”‚                                                            β”‚
β”‚         β”‚ JSON audit                                                 β”‚
β”‚         β–Ό                                                            β”‚
β”‚     journald  ──►  rsyslog (mTLS)                                    β”‚
β”‚                                                                      β”‚
β”‚   Files:  AES-256-GCM envelope per object Β· KEK in TPM / HSM         β”‚
β”‚   BoltDB: envelope-encrypted rows Β· HMAC audit chain                 β”‚
β”‚                                                                      β”‚
β”‚   β”Œ (optional) Wazuh agent + manager + indexer + dashboard ┐         β”‚
β”‚   β”‚   enable with:  install.sh deploy --with-wazuh         β”‚         β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

   Auth   (optional federation) ─►  Entra GCC-H Β· Okta Gov Β· Ping
   SIEM   (optional forward)    ─►  Splunk Β· Sentinel Β· Elastic

Deploy shapes:

  • Turnkey all-in-one (default) β€” bundled Keycloak + Wazuh, install.sh deploy --with-wazuh on a fresh RHEL/Alma 9 VM
  • Federated IdP + bundled SIEM β€” customer's Entra GCC-H / Okta Gov / Ping for auth, bundled Wazuh for monitoring
  • Bundled IdP + federated SIEM β€” bundled Keycloak, forward audit to customer Splunk / Sentinel / Elastic
  • Fully federated β€” customer's IdP + SIEM; appliance runs only the filebrowser core
  • Behind Trout Access Gate β€” Gate fronts TLS + x509/PIV + egress allow-list, stacks on any of the above

NIST control mapping

Why do all control IDs start with 3.? NIST SP 800-171 Rev 2 is organized as Section 1 (purpose), Section 2 (scope), and Section 3: The Requirements. All 110 controls live in Section 3, so they're numbered 3.X.Y where X is the family (1–14) and Y is the control within that family. The leading 3. isn't meaningful β€” it's just the chapter number in the document.

Full per-control coverage: docs/compliance-posture.md (positive posture, installed) or docs/gap-analysis.md (pre-fork baseline). Family-level summary below.

Classify folder dialog β€” dropdown with CUI//BASIC, CUI//SPECIFIED, CUI//SP-PROPIN, CUI//SP-PRVCY, CUI//SP-ITAR marks, annotated as admin-gated with fresh MFA required

CUI marking UI (NIST 3.8.4) β€” admin + fresh MFA required; every change emits an audit event.

Legend: βœ… Open-CMMC directly Β· 🟒 Wazuh extends Β· πŸ“‹ Customer SSP Β· 🏒 Host / facility

Family Coverage Scope Where Open-CMMC addresses it
3.1 Access Control (22) βœ… 18 Β· 🟒 3 Β· πŸ“‹ 1 OIDC + per-folder ACL + session mgmt cmmc/auth/oidc/, cmmc/authz/folderacl/, http/cmmc_session_idle.go
3.2 Awareness & Training (3) πŸ“‹ 3 Policy / procedure Customer SSP β€” not product-scope
3.3 Audit & Accountability (9) βœ… 6 Β· 🟒 3 Structured events, HMAC chain, correlation IDs cmmc/audit/, config/rsyslog/, config/wazuh/
3.4 Configuration Mgmt (9) βœ… 6 Β· 🟒 3 Config-change audit, CM baselines http/cmmc_enforcement.go, SSP procedures
3.5 Identification & Auth (11) βœ… 11 MFA, replay-resistant, FIPS crypto, passkeys cmmc/auth/oidc/, cmmc/auth/session/, WebAuthn policy
3.6 Incident Response (3) βœ… 1 Β· 🟒 2 Audit forwarder + SIEM decoders config/wazuh/rules/, audit-forwarder.md
3.7 Maintenance (6) βœ… 2 Β· 🏒 4 Privileged-access audit, NOREMAUTH SSP + Access Gate step-up
3.8 Media Protection (9) βœ… 9 CUI marking, envelope encryption, move/copy rules cmmc/marking/, cmmc/crypto/envelope/, http/cmmc_enforcement.go
3.9 Personnel Security (2) πŸ“‹ 2 Policy Customer SSP
3.10 Physical Protection (6) 🏒 6 Policy / host-layer Customer facility + host SSP
3.11 Risk Assessment (3) 🟒 3 SBOM, vulnerability mgmt CI workflow, govulncheck + trivy in release pipeline
3.12 Security Assessment (4) βœ… 2 Β· πŸ“‹ 2 SSP, POA&M This repo + customer SSP
3.13 System & Comms Protection (16) βœ… 14 Β· 🏒 2 FIPS TLS, egress deny, FIPS crypto cmmc/crypto/tlsprofile/, cmmc/crypto/fips/, firewalld
3.14 System & Info Integrity (7) βœ… 3 Β· 🟒 4 Scan-on-upload, malware-sig currency cmmc/scan/clamav/, update-ca-trust
Total βœ… 72 Β· 🟒 18 Β· πŸ“‹ 8 Β· 🏒 12 (= 110)

SSP base

Open-CMMC is the product + evidence base for a System Security Plan. It doesn't replace the customer's SSP, but it supplies every artifact an assessor needs:

Artifact Path
Compliance posture (per-control coverage, installed) docs/compliance-posture.md
Gap analysis (pre-fork baseline, per-control statements) docs/gap-analysis.md
Architecture (data-flow diagrams, boundaries, inheritance) docs/architecture.md
IdP setup (Entra GCC-H / Keycloak / Okta Gov) docs/oidc-providers.md
Audit pipeline (rsyslog-ossl mTLS) docs/audit-forwarder.md
Wazuh integration docs/wazuh-integration.md
Operator 2FA + passkey walkthrough docs/operator-2fa.md
Deployment (RHEL/Alma 9, FIPS) docs/almalinux9-setup.md
Keycloak realm (policy + PKCE + amr) docs/keycloak-setup.md

Typical SSP workflow: the customer's compliance team copies per-control statements from gap-analysis.md, documents ODPs (organizationally-defined parameters), adds site-specific evidence (retention, ticketing), and produces the SSP + POA&M for C3PAO review.


Installation

Option 1 β€” from a GitHub Release tarball (recommended)

No build toolchain needed on the target. Pick the arch that matches uname -m:

# On the target RHEL 9 / AlmaLinux 9 / Rocky 9 host β€” enable FIPS first
sudo fips-mode-setup --enable && sudo reboot

# After reboot
sudo dnf install -y podman jq curl iproute firewalld openssl policycoreutils-python-utils
sudo systemctl enable --now firewalld

# Download the release (pick amd64 or arm64 to match uname -m)
ARCH=amd64   # or arm64
VER=v1.0.0
TAR=cmmc-filebrowser-$VER-linux-$ARCH.tar.gz
curl -LO https://github.com/TroutSoftware/Open-CMMC/releases/download/$VER/$TAR
curl -LO https://github.com/TroutSoftware/Open-CMMC/releases/download/$VER/$TAR.sha256
sha256sum --check $TAR.sha256

# Extract + deploy
tar -xzf $TAR
sudo cmmc-filebrowser-$VER-linux-$ARCH/config/install.sh deploy --from-release "$(realpath $TAR)"

In ~3 minutes: TLS-enabled filebrowser on https://<host>:8443, Keycloak OIDC on https://<host>:8081, systemd units, firewalld rules, self-signed CA + leaf cert (replaceable with customer PKI for prod), audit stream to journald, and envelope encryption (AES-256-GCM per-file) on by default with an auto-generated KEK at /etc/cmmc-filebrowser/kek.bin.

Air-gap: same commands, just download the tarball on an internet-connected host and scp it to the target before the tar -xzf step. install.sh --from-release skips the build phases entirely β€” no Go, Node, or pnpm needed on the target.

Option 2 β€” from source

For development or when you want to patch before installing:

git clone https://github.com/TroutSoftware/Open-CMMC.git open-cmmc
cd open-cmmc
sudo config/install.sh deploy

Needs Go 1.25, Node β‰₯18.12, and pnpm on the host. Same end state as Option 1.

Common subcommands

sudo config/install.sh deploy --with-wazuh     # baseline + bundled Wazuh SIEM
sudo config/install.sh status                  # health check
sudo config/install.sh uninstall               # stop + disable (state preserved)
sudo config/install.sh uninstall --wipe-state  # full clean slate

Full deployment guide: docs/almalinux9-setup.md.


Operator guides

User profile page showing groups and roles for dana (compliance β†’ Admin ISSO, filebrowser-admins β†’ Admin ISSO), with a Recent activity table listing Read CUI mark, cui.catalog.read, Preview, Open folder, Set CUI mark, and admin.usage.read events with timestamps and resource paths

Per-user activity view (NIST 3.3.1 / 3.3.2) β€” every CUI mark change, preview, and admin action is stamped with a correlation id and emitted to the audit stream.


Wazuh β€” additional CMMC coverage

Wazuh is the default recommended SIEM + endpoint-monitoring stack for Open-CMMC (architecture decision D5). Running without Wazuh is valid β€” audit still lands in journald locally β€” but Wazuh extends coverage into families the filebrowser process alone can't satisfy.

Open-CMMC alone covers ~55 of 110 controls directly in product code (3.1, most of 3.3, 3.5, 3.8, 3.13).

Wazuh adds ~20 more, taking the deployed stack to ~75 of 110:

Family Controls How Wazuh covers it
3.3 Audit 3.3.4, 3.3.7, 3.3.8 Central log retention + tamper protection; audit-failure alerting
3.4 CM 3.4.1, 3.4.3, 3.4.7 FIM on binary, /etc/cmmc-filebrowser/, systemd units
3.6 Incident Response 3.6.1, 3.6.2, 3.6.3 Correlation rules turn audit events into SOC-actionable incidents
3.11 Risk Assessment 3.11.2, 3.11.3 Daily vulnerability scan of host packages
3.14 System & Info Integrity 3.14.1–3.14.7 Host antimalware, signature auto-update, rootcheck, anomaly detection
3.1 AC (cross-system) 3.1.1, 3.1.12, 3.1.20 Endpoint agents on operator workstations catch lateral access

The remaining ~35 controls are personnel / physical / policy β€” customer SSP domain by design.

Deployment shapes:

  • Agent-only β€” customer's own Wazuh manager; appliance runs agent + our filebrowser decoder/rules (docs/wazuh-integration.md)
  • Bundled β€” sudo config/install.sh deploy --with-wazuh brings up manager + indexer + dashboard

Other SIEMs β€” Splunk / Sentinel / Elastic connect via rsyslog-ossl (docs/audit-forwarder.md); the 3.4 / 3.14 coverage reverts to a customer-tool integration in those deployments.


Supported IdPs

IdP Use case Docs
Keycloak (bundled) Air-gap, sovereignty, single-appliance keycloak-setup.md
Entra ID (Microsoft GCC High) Customers on M365 GCC-H oidc-providers.md
Okta Gov / Okta Fed Okta-centric shops oidc-providers.md
Ping Identity PingFederate deployments oidc-providers.md

Project status

Prototype targeting C3PAO assessment readiness 2026 Q3. Phase 2 hard deadline: 2026-11-10. Work plan + decision log (D1–D13) in docs/architecture.md Β§11.

Trout Software is the primary maintainer. Community contributions welcome via PR. For commercial support / customer deployments, contact hello@trout.software.


License + upstream attribution

Apache-2.0 β€” same as upstream filebrowser.

Open-CMMC started from filebrowser/filebrowser v2.63.2 (commit dd53644, 2026-04-17). CMMC-specific hardening lives under:

  • cmmc/ β€” new Go packages (auth/oidc, auth/session, authz, audit, marking, crypto, scan, cabinet)
  • config/ β€” installer + systemd units + Keycloak bootstrap + rsyslog + Wazuh integration assets
  • docs/ β€” architecture, gap analysis, operator + deployment guides
  • scripts/build-release.sh β€” air-gap-friendly release packager

Upstream filebrowser functionality is preserved where it doesn't conflict with CMMC requirements; removed / hardened where it did (e.g., the default no-auth mode refuses to boot; public shares are rejected for CUI-marked items). Bug reports for upstream-derived code belong upstream first; Open-CMMC-specific bugs + features in this repo's issues.


Appendix A: Gap analysis (pre-fork baseline)

This appendix describes filebrowser v2.63.2 as it existed at commit dd53644 (2026-04-17) β€” BEFORE Open-CMMC forked it. The gaps below are what motivated the fork: vanilla filebrowser is a capable file-sharing server but it ships without the controls a CMMC L2 assessment needs. Open-CMMC addresses every blocker in the table; this baseline is preserved as the evidence trail an assessor walks when asking "why is this product different from the one on GitHub's homepage?"

The full per-control baseline with file:line citations is at docs/gap-analysis.md β€” 110 controls across 14 families with severity (Blocker / Major / Minor / N/A-Infra / N/A-Policy / Inherited-AG) and remediation theme (replace-auth, add-module, config, host-control, siem, doc-only, inherit-idp, inherit-ag).

Top 10 ship-blockers the baseline carried, and how Open-CMMC addresses each:

# Baseline blocker (filebrowser v2.63.2) Controls Open-CMMC status
1 No FIPS-validated cryptography 3.13.11, 3.13.8, 3.5.10, 3.13.16 βœ“ Built with GOFIPS140=v1.0.0 on RHEL go-toolset (CMVP #4774)
2 No MFA / OIDC / SAML (only JSON + hook auth) 3.5.3, 3.5.4, 3.5.1 βœ“ OIDC backend (Keycloak/Entra/Okta) + step-up MFA + passkey peer
3 No lockout / session revocation / idle lock 3.1.8, 3.5.4, 3.1.10, 3.1.11 βœ“ Failed-attempt lockout, session-idle lock, JTI tracking
4 No encryption at rest 3.13.16, 3.8.9, 3.8.1 βœ“ Per-file envelope (AES-256-GCM, HKDF subkey), LUKS host layer
5 Audit trail insufficient (stdlib log + rotation only) 3.3.1–3.3.9 βœ“ Structured JSON events, HMAC chain, rsyslog-ossl / Wazuh
6 TLS not FIPS-profiled (Go default cipher list) 3.13.8, 3.13.11, 3.13.15 βœ“ Explicit FIPS cipher list, TLS 1.3 preferred, security headers
7 No malware scan on upload 3.14.2, 3.14.5, 3.14.6 βœ“ ClamAV integration fail-closed, internal signature mirror
8 No CUI marking model (plain file paths) 3.8.4, 3.1.3, 3.1.22 βœ“ Per-folder + per-file CUI marks, UI banners, declassify audit
9 Public shares bypass auth for any file 3.1.3, 3.1.22, 3.13.5 βœ“ Public share refused for CUI-marked items (out-of-scope for MVP)
10 No SBOM / reproducible builds 3.14.1, 3.11.2, 3.14.3 ⚠ -trimpath + -ldflags in release builds; SBOM via CI (WIP)

About

Open-source reference implementations and tooling for CMMC Level 2 compliance on on-premise IT/OT environments. Covers CUI handling, USB controls, and audit logging.

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors