Daily-updated · Zero install · Cloud-agnostic
What is OCBC? · How It Works · Distribution · Quick Start · Features · Development
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.
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)
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.
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.jsonTo 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- 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) andnon_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.
# 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| Flag | Default | Description |
|---|---|---|
--out |
ocbc_full_catalog_enriched.json |
Output file path |
| 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 |
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 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.
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}
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
Two workflows handle publishing:
main-release.yml — runs daily at 06:00 UTC (and on push to main, or manually):
- Runs the test suite across Python 3.11, 3.12, and 3.13
- Generates
baseline/ocbc_full_catalog_enriched.jsonand commits it to this repo - Pushes
latest.jsonand a dated historical copy toopenastra.org/ocbc/catalog/v0.1/ - Creates a GitHub Release (tag + changelog — the catalog URL is the artifact)
schema-release.yml — triggers only when spec/** changes:
- Reads
spec/VERSION(semver), validates it, checks the tag doesn't already exist - Pushes
ocbc.jsonandocbc.yamltoopenastra.org/ocbc/schema/v0.1/ - Creates a GitHub Release tagged
spec-v{VERSION}with schema files attached
pypi-publish.yml — triggers when a v*.*.* tag is pushed:
- Builds the
ocbcPython package - 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/.
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 coverageAll 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.
MIT — for this repository's code. NIST content is public domain (U.S. Government work).