neuralmind.uk / NIST SP 800-53 hardening guide Edit this page on GitHub ↗

NIST SP 800-53 hardening guide

Date: 2026-10-20 Version: 1.0 Check it: neuralmind hardening [project_path] [--json] (v4.19.0+)


1. What this is

SP800-53.md says which SP 800-53 Rev. 5 controls NeuralMind touches and what stays yours. This page is the configuration that goes with it: 17 rules, each tied to the controls it supports, that together put NeuralMind in its hardened state on one host. It is your CM-6 baseline for NeuralMind; adopt it as is, or record each deviation in your System Security Plan.

Every rule is checked automatically. neuralmind hardening reads the settings as NeuralMind enforces them (the machine policy included), the volume and the OS FIPS mode, the audit log and its checkpoints, forwarding, and the running daemon, and reports each rule:

$ neuralmind hardening /srv/app
NeuralMind SP 800-53 hardening baseline — /srv/app
============================================================
  [pass] NMH-01 The hardened profile is on (CM-6, CM-7, SC-8)
         security.profile: cui
  ...
  [FAIL] NMH-09 Checkpoint signing runs in a FIPS-mode OpenSSL (SC-13, AU-9(3))
         checkpoint signing runs in OpenSSL 3.5.4 without FIPS mode; ...
         -> pip install --force-reinstall --no-cache-dir --no-binary cryptography cryptography, ...
============================================================
16 of 17 rule(s) pass; 1 fail.

neuralmind doctor already reports most of these, as warnings sized for a developer. hardening is the stricter baseline for an authorized system: every rule here must pass.

2. The baseline

Rule Title Controls How to meet it
NMH-01 The hardened profile is on CM-6, CM-7, SC-8 security.profile: cui. It forces identity: os and encrypted storage, refuses listeners beyond loopback or without their token, and refuses LLM documentation seeding. The name comes from CMMC; it is the hardened posture for any authorized system, CUI or not
NMH-02 The machine policy sets it CM-5, CM-6 The profile in /etc/neuralmind/policy.yaml (C:\ProgramData\NeuralMind\policy.yaml), owned by root and writable only by root. Otherwise whoever owns the project directory can delete the project file and switch it off
NMH-03 Identity comes from the OS account IA-2, AC-3 security.identity: os (the profile sets it), and a valid security.roles and rate_limit if you set them
NMH-04 No role beyond reader by default AC-6 Leave security.default_role unset, or set it to reader; name each account that needs more in security.users
NMH-05 The project’s settings file is writable by its owner only AC-3, CM-5 chmod go-w neuralmind-backend.yaml, since it holds security.users. n/a on Windows: restrict it with an ACL
NMH-06 The state directory is writable by its owner only AU-9 chmod go-w .neuralmind: it holds the audit log. n/a on Windows: restrict it with an ACL
NMH-07 Encrypted storage is verified and required SC-28 FileVault, BitLocker or LUKS on every volume holding the project’s state (the project, .neuralmind/ through a symlink, and a configured db_path), verified by NeuralMind as at run time, and security.require_encrypted_storage: true (the profile sets it)
NMH-08 The OS FIPS mode is on SC-13 fips-mode-setup --enable (RHEL), the FIPS policy on Windows. n/a on macOS, which has no FIPS mode switch to read
NMH-09 Checkpoint signing runs in a FIPS-mode OpenSSL SC-13, AU-9(3) Rebuild cryptography against the system OpenSSL: pip install --force-reinstall --no-cache-dir --no-binary cryptography cryptography. The prebuilt wheel bundles its own OpenSSL, which isn’t FIPS-validated
NMH-10 No daemon serves beyond loopback or without its token CM-7, SC-8 neuralmind daemon restart on 127.0.0.1 with its token; reach it from elsewhere through an SSH tunnel. A daemon discovery file that can’t be read fails, since it may describe a running daemon
NMH-11 The audit log’s hash chain verifies AU-9 Nothing to set: a failure means the log was changed. Investigate with neuralmind audit verify
NMH-12 No audit write failure is unrecorded AU-5 Fix the cause, then neuralmind audit record-gap
NMH-13 Checkpoints are signed and verify AU-9, AU-9(3) neuralmind audit keygen in an administrator account, and its public key in security.audit_checkpoint_key
NMH-14 Checkpoints are anchored outside the project AU-9(2) security.audit_anchor_dir: an existing directory outside the project, not writable by group or others (on POSIX), that only the administrator can write, ideally on another system
NMH-15 The newest checkpoint is under a week old AU-9 neuralmind audit checkpoint daily, from the key owner’s account (cron, a systemd timer, Task Scheduler)
NMH-16 Audit records are forwarded to a local syslog AU-4(1), AU-6(3), SC-8 security.audit_syslog: /dev/log (or a loopback address), with the host’s syslog daemon forwarding to the SIEM over TLS
NMH-17 No audit record is waiting to be forwarded AU-4(1), AU-5 A reachable syslog daemon; neuralmind audit forward sends a backlog

3. Setting it up

On a Linux host, as root, then as the administrator who holds the checkpoint key. The CUI enclave walkthrough has the same steps with more on each, and Windows equivalents.

# NMH-01, NMH-02: the profile, machine-wide
sudo mkdir -p /etc/neuralmind
printf 'security:\n  profile: cui\n' | sudo tee /etc/neuralmind/policy.yaml
sudo chmod 755 /etc/neuralmind && sudo chmod 644 /etc/neuralmind/policy.yaml

# NMH-08: the OS FIPS mode (RHEL 9; reboot after)
sudo fips-mode-setup --enable

# NMH-09: checkpoint signing in the system OpenSSL
pip install --force-reinstall --no-cache-dir --no-binary cryptography cryptography

# NMH-13, NMH-14: the checkpoint key and the anchor directory (administrator)
neuralmind audit keygen /home/admin/.neuralmind/audit-key.pem   # prints the public key
sudo install -d -o admin -m 755 /var/lib/neuralmind-anchor

The project file, writable by its owner only (NMH-05):

# neuralmind-backend.yaml
security:
  profile: cui
  users:
    alice: builder
    bob: reader
  audit_checkpoint_key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...   # from audit keygen
  audit_anchor_dir: /var/lib/neuralmind-anchor
  audit_syslog: /dev/log

Then point the host’s syslog daemon at the SIEM over TLS (the rsyslog example is in the security guide), schedule neuralmind audit checkpoint /srv/app --key /home/admin/.neuralmind/audit-key.pem daily from the administrator’s account, and run neuralmind hardening /srv/app.

4. Checked by you

These are part of the hardened state, and NeuralMind can’t see them, so hardening doesn’t check them:

Control What to check
AU-8 The host clock is synchronized to an authoritative time source; audit timestamps come from it
AU-5, AU-6(3) Your syslog daemon routes the alert severity to a person, and the SIEM receives NeuralMind’s records
SC-8 The syslog daemon’s connection to the SIEM uses TLS, in the host’s validated module
AU-9(3) The checkpoint’s private key is readable only by the administrator’s account, not a developer’s
SI-7, SR-4 The release you installed was verified: its signature and build-provenance attestations (SSDF.md §2)
SC-13 On macOS, that the FileVault and corecrypto version in use is covered by Apple’s CMVP certificates (NMH-08 reports n/a there)
AC-3, AU-9 On Windows, the ACLs on the machine policy, neuralmind-backend.yaml and .neuralmind/ (NMH-05 and NMH-06 report n/a there)
AU-11 audit export copies are kept for your retention period: they are what you would restore the log from