Skip to main content

Generate a machine-readable, cloud-agnostic security baseline from NIST SP 800-53 Rev. 5 and SP 800-53B.

Project description

Open Controls Baseline Catalog (OCBC)

Machine-Readable NIST SP 800-53 Rev. 5 + FedRAMP Enriched Catalog

Daily-updated · Zero install · Cloud-agnostic

CI Python 3.11+ License: MIT Catalog Schema


What is OCBC? · How It Works · Distribution · Quick Start · Features · Development


What is OCBC?

OCBC publishes a daily, machine-readable, cloud-agnostic security baseline derived from authoritative NIST publications — fetch it directly, no install required:

https://openastra.org/ocbc/catalog/v0.1/latest.json

The catalog merges the full NIST SP 800-53 Rev. 5 control catalog with SP 800-53B baseline profiles and FedRAMP OSCAL baselines, enriching every control with baseline membership flags, a derived severity level, and a non-negotiable indicator — all in one JSON file ready for policy engines, compliance dashboards, IaC scanners, or cloud-provider mapping tools.

It is also a runnable Python generator for teams who want to self-host or customise the pipeline.


How It Works

NIST OSCAL Profiles  ──┐
SP 800-53 Catalog    ──┤
SP 800-53B Baselines ──┼──▶  ocbc.generate  ──▶  Enriched Catalog JSON  ──▶  Downstream Systems
FedRAMP Baselines    ──┘
                           (severity · non_negotiable · baseline flags)

Distribution

The catalog is published daily at a stable URL — no package to install.

Artifact URL Updated
Latest catalog https://openastra.org/ocbc/catalog/v0.1/latest.json daily
Historical catalog https://openastra.org/ocbc/catalog/v0.1/historical/YYYY-MM-DD.json daily
JSON Schema https://openastra.org/ocbc/schema/v0.1/ocbc.json on schema change
YAML Schema https://openastra.org/ocbc/schema/v0.1/ocbc.yaml on schema change

Schema version (v0.1) is bumped only when the catalog output structure changes, creating a new versioned URL path.


Quick Start

Fetch the catalog directly:

curl -s https://openastra.org/ocbc/catalog/v0.1/latest.json | jq '.count'

Or install the CLI and fetch directly:

pip install ocbc
ocbc fetch --out catalog.json

To run the generator locally (for self-hosting or development):

git clone https://github.com/sadayamuthu/ocbc.git
cd ocbc
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
ocbc generate --out baseline/ocbc_full_catalog_enriched.json

Features

  • Zero configuration — downloads source OSCAL profiles directly from NIST and the GSA FedRAMP automation repo; no local data files to maintain.
  • Enriched output — every control gets severity (LOW / MEDIUM / HIGH / CRITICAL) and non_negotiable (boolean) fields derived from configurable rules.
  • Baseline membership — flags each control's presence in the NIST (Low, Moderate, High, Privacy) and FedRAMP (LI-SaaS, Low, Moderate, High) baselines.
  • Parent-enhancement linkage — enhancement controls (e.g. AC-2(1)) are linked back to their parent (AC-2).
  • Configurable — override any source URL or rule via CLI flags.
  • CI-ready — ships with a GitHub Actions workflow that regenerates the baseline daily and commits the result.

CLI Usage

# Download the pre-built catalog (fast, no OSCAL processing)
ocbc fetch
ocbc fetch --out my-catalog.json

# Generate the catalog from scratch
ocbc generate
ocbc generate --out my-catalog.json --non_negotiable_min_baseline high

# Print version
ocbc --version

ocbc fetch options

Flag Default Description
--out ocbc_full_catalog_enriched.json Output file path

ocbc generate options

Flag Default Description
--out ocbc_full_catalog_enriched.json Output file path
--non_negotiable_min_baseline moderate Minimum baseline for non_negotiable=true (moderate or high)
--catalog_url NIST catalog URL Override the NIST SP 800-53 catalog source
--baseline_low_url NIST Low baseline URL Override the Low baseline
--baseline_moderate_url NIST Moderate baseline URL Override the Moderate baseline
--baseline_high_url NIST High baseline URL Override the High baseline
--baseline_privacy_url NIST Privacy baseline URL Override the Privacy baseline
--fedramp_lisaas_url FedRAMP LI-SaaS URL Override the FedRAMP LI-SaaS baseline
--fedramp_low_url FedRAMP Low URL Override the FedRAMP Low baseline
--fedramp_moderate_url FedRAMP Moderate URL Override the FedRAMP Moderate baseline
--fedramp_high_url FedRAMP High URL Override the FedRAMP High baseline
--version Print version and exit

Output Schema

The generated JSON has this top-level structure:

{
  "project": "Open Controls Baseline Catalog (OCBC)",
  "project_version": "0.1.0",
  "generated_at_utc": "2026-02-18T06:00:00Z",
  "framework": "NIST SP 800-53 Rev. 5",
  "reference": { "publication": "...", "downloads": "..." },
  "rules": { "severity_definition": { ... }, "non_negotiable_min_baseline": "moderate" },
  "count": 1189,
  "controls": [ ... ]
}

Each item in controls[]:

Field Type Example
control_id string AC-2 or AC-2(1)
control_name string Account Management
family string AC, AU, SC, ...
control_text string Full control statement
discussion string Supplemental guidance
related_controls string Comma-separated IDs
parent_control_id string or null AC-2 (for enhancements)
baseline_membership object { "low": true, "moderate": true, "high": true, "privacy": false }
fedramp_membership object { "li_saas": false, "low": false, "moderate": true, "high": true }
severity string LOW / MEDIUM / HIGH / CRITICAL
non_negotiable boolean true

Severity and Non-Negotiable Rules

Severity is assigned based on the earliest (least restrictive) baseline a control appears in:

Condition Severity
In Low baseline MEDIUM
In Moderate (not Low) HIGH
In High (not Low or Moderate) CRITICAL
Privacy-only MEDIUM
Not in any baseline LOW

Non-negotiable defaults to true when a control is in the Moderate or High baseline. Pass --non_negotiable_min_baseline high to restrict it to High-only.


Code Flow Design

graph TD
    A[NIST OSCAL JSON Catalogs] -->|HTTPS GET| B(ocbc.generate)

    subparse1(NIST SP 800-53 Rev. 5 Catalog) --> parse_catalog[Parse Catalog Data]
    subparse2(Low Baseline) --> parse_profile[Parse Profile IDs]
    subparse3(Moderate Baseline) --> parse_profile
    subparse4(High Baseline) --> parse_profile
    subparse5(Privacy Baseline) --> parse_profile
    subparse6(FedRAMP Baselines) --> parse_profile

    B -.-> subparse1
    B -.-> subparse2
    B -.-> subparse3
    B -.-> subparse4
    B -.-> subparse5
    B -.-> subparse6

    parse_catalog --> Enrich(Enrich Controls)
    parse_profile --> Enrich

    Enrich --> |assign baseline flags| C1(Baseline Membership)
    Enrich --> |assign fedramp flags| C1b(FedRAMP Membership)
    Enrich --> |derive severity| C2(Severity Level)
    Enrich --> |evaluate conditions| C3(Non-negotiable Flag)

    C1 --> Out(ocbc_full_catalog_enriched.json)
    C1b --> Out
    C2 --> Out
    C3 --> Out

    Out --> D{Downstream Systems}

Project Structure

ocbc/
├── spec/
│   ├── VERSION              # schema version (semver → URL path)
│   └── schemas/
│       ├── ocbc-v0.1.json   # JSON Schema for catalog output
│       └── ocbc-v0.1.yaml   # YAML equivalent
├── src/ocbc/
│   ├── __init__.py
│   ├── __main__.py
│   ├── cli.py
│   ├── fetch.py
│   ├── generate.py
│   └── urls.py
├── tests/
│   ├── test_cli.py
│   ├── test_fetch.py
│   ├── test_generate.py
│   ├── test_oscal_id.py
│   └── test_schema_validation.py
├── baseline/
│   └── historical/
├── .github/workflows/
│   ├── develop.yml
│   ├── main-release.yml
│   ├── pypi-publish.yml
│   └── schema-release.yml
├── pyproject.toml
├── Makefile
└── LICENSE

Automation

Two workflows handle publishing:

main-release.yml — runs daily at 06:00 UTC (and on push to main, or manually):

  1. Runs the test suite across Python 3.11, 3.12, and 3.13
  2. Generates baseline/ocbc_full_catalog_enriched.json and commits it to this repo
  3. Pushes latest.json and a dated historical copy to openastra.org/ocbc/catalog/v0.1/
  4. Creates a GitHub Release (tag + changelog — the catalog URL is the artifact)

schema-release.yml — triggers only when spec/** changes:

  1. Reads spec/VERSION (semver), validates it, checks the tag doesn't already exist
  2. Pushes ocbc.json and ocbc.yaml to openastra.org/ocbc/schema/v0.1/
  3. Creates a GitHub Release tagged spec-v{VERSION} with schema files attached

pypi-publish.yml — triggers when a v*.*.* tag is pushed:

  1. Builds the ocbc Python package
  2. Publishes to PyPI via OIDC Trusted Publishing (no API token required)

To bump the schema version, update spec/VERSION and add the new schema files to spec/schemas/.


Development

make install-dev   # Install with dev dependencies
make test          # Run tests
make test-cov      # Run tests with 100% coverage enforcement
make format        # Auto-format code
make check         # Lint + tests with coverage

Data Sources

All data is fetched live from official sources:

If NIST or GSA changes file names or paths, update src/ocbc/urls.py or pass the correct URLs via CLI flags.


License

MIT — for this repository's code. NIST content is public domain (U.S. Government work).


OCBC is an open-source NIST SP 800-53 Rev. 5 + FedRAMP enriched catalog

Managed by OpenAstra.

Catalog · GitHub · Schema · OpenAstra

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ocbc-0.1.0.tar.gz (19.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ocbc-0.1.0-py3-none-any.whl (11.9 kB view details)

Uploaded Python 3

File details

Details for the file ocbc-0.1.0.tar.gz.

File metadata

  • Download URL: ocbc-0.1.0.tar.gz
  • Upload date:
  • Size: 19.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ocbc-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6f48947685b9ef7aa84d8e5c2fe809bd33a54a12aa38fa66741aac6b15d02fbe
MD5 ad547748585cc113dad27e357a837b21
BLAKE2b-256 aaa3fc74d0de4b932c497d0fb3c382c8c9e8997db538da0624f42d6c0b5fceb0

See more details on using hashes here.

Provenance

The following attestation bundles were made for ocbc-0.1.0.tar.gz:

Publisher: pypi-publish.yml on sadayamuthu/ocbc

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ocbc-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: ocbc-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ocbc-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a21099ce1c9c2d539e5d752d0ed1d73978a2f51b74d6c560b0c71b3580656d32
MD5 626e9a26eabcaf47f2f6912aae99c2a3
BLAKE2b-256 834da5234c119abb11159a419ea1aa5c28978fafaaa5f4cb85bb00c0bd4d0c4f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ocbc-0.1.0-py3-none-any.whl:

Publisher: pypi-publish.yml on sadayamuthu/ocbc

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page