tenant-sec
Open Source · Cloud Security

Security capability assessment
for cloud providers — done right.

Binary compliance checklists turn nuanced security posture into pass/fail. tenant-sec replaces that with maturity levels, per-service breakdowns, and scoring profiles that match your actual threat model.

Controls Explorer
71 controls · 9 domains · 4 provisional provider assessments
Open the live data explorer →

71 controls. 9 domains. Four provisional provider assessments at a glance. Open the Controls Explorer →

The Problem

Binary outcomes erode security signal

Standard compliance frameworks reduce security capabilities to yes/no. When the bar is "does this capability exist?", every provider passes — and the assessment stops being useful for differentiating real posture.

⚙️

Broad definitions flatten nuance

A control you build and maintain with custom automation scores the same as a fully managed, policy-driven platform capability. The distinction matters operationally — but binary frameworks can't express it.

🗂️

Per-service gaps stay hidden

CMK encryption on S3 but not on the managed database. WAF on EC2 but not for the AI platform. A binary "yes" on the control hides that half the service portfolio doesn't support it.

🎛️

Signal collapses to noise

When every provider can check the same boxes, the assessment carries no differentiating information. Security teams end up doing ad-hoc deep dives to find what the framework was supposed to surface.

The Model

A 4-level maturity scale that preserves signal

Each control for each provider gets one of four leaf scores, or a mixed composite when capability varies across service types.

L0
Impossible from tenant space

The platform does not expose this capability. No amount of tenant-side effort can achieve it. Accept the risk, implement an external compensating control, or change providers.

L1
Requires own processing loop

Achievable — but you must build and maintain custom automation. Scripts, Lambda functions, CI/CD guardrails, external tooling. The provider offers no managed path. Engineering cost is yours.

L2
Available managed, limited

A managed capability exists but with constrained scope or configurability. You can enable it but cannot customize policy logic, algorithm, scope, or enforcement granularity. Take it or leave it.

L3
Available managed, customizable

Full managed capability with tenant-configurable parameters. Define policies, set thresholds, choose algorithms, scope to specific resources or OUs, integrate with external systems. The target state for enterprise-grade controls.

MIX
Mixed composite — not a level

Capability varies across the provider's service portfolio. Contains per-service scores at L0–L3. In scoring, you choose the aggregation function: min, mean, p20, threshold:L2:0.8 — matching your risk tolerance.

Provisional RC output

EU Regulated Fintech profile — hyperscaler cohort

Current 1.0-RC1.1 results. The heuristic index is not a certification or security verdict, and the underlying recommendations are awaiting human review.

Measure Google Cloud Amazon Web Services Microsoft Azure
Catalog completeness90%84%84%
Technical must-havesPASSPASSPASS
Heuristic index81.6 / 10080.7 / 10075.5 / 100
Human reviewPENDINGPENDINGPENDING

Run your own weights and must-haves → open the in-browser evaluator

Coverage

71 controls across 9 domains

62 tenant-operable controls have assessor-actionable L0–L3 criteria. service_scoped: true signals that per-service mixed composites are expected.

IAM
13 controls
External IdP federation · Privileged access · ABAC · MFA enforcement · Identity lifecycle · Operator access control · Root account recovery
Governance & Policy
6 controls
Preventive policy engine · Detective compliance · Tagging governance · Hierarchy & delegation · Account lifecycle · Quotas & service control
Encryption & Key Mgmt
9 controls
Encryption at rest default · CMK · BYOK · External KMS (HYOK) · Key lifecycle · HSM backing · Encryption in transit · Confidential computing · Private CA lifecycle
Network Security
10 controls
Isolation model · Cross-env connectivity · Firewall/SGs · Private service endpoints · DNS security · DDoS protection · WAF · Egress control · Flow logging · Threat prevention
Logging & Audit
6 controls
Control plane audit · Data plane logging · Log immutability · SIEM export · Threat detection · Resource inventory
Data Security & Residency
8 controls
Residency guarantees · Sovereignty controls · Data classification · DLP · Backup governance · Deletion guarantees · Object retention · Portability/export
Compute & Workloads
7 controls
Image management · Runtime security · Container orchestration · Serverless security · Patch management · Secrets management · Secure remote access
Incident Response
5 controls
Forensic data access · Notification SLA · Automated response · Availability zones · Resilience testing
Supply Chain
7 controls
Infrastructure encryption · Physical security · Hardware supply chain · Personnel security · Compliance certifications · Transparency reports · Dependency disclosure
CLI

Five commands, full pipeline

Install with pip, point at your scoring profile, and get ranked output in seconds.

Install
validate
score
detail
compare
export
# Install
pip install tenant-sec

# Or clone and install in editable mode
git clone https://github.com/ypapazov/tenant-sec
pip install -e ".[dev]"
# Validate any YAML file against its schema
tenant-sec validate providers/scaleway.yaml
✓ providers/scaleway.yaml is valid

tenant-sec validate controls/iam/abac.yaml --type control
✓ controls/iam/abac.yaml is valid

# Also cross-validates: unknown control IDs, unresolved service catalog aliases
# Score and rank providers against your scoring profile
tenant-sec score \
  --profile profiles/eu-regulated-fintech.yaml \
  --providers aws,gcp,scaleway

Rank  Provider              Overall  IAM   Enc   Net   ...  Must-Haves
   1  Google Cloud           98.9   100   98.3  100   ...  PASS
   2  Amazon Web Services    98.1   100   95.8  100   ...  PASS
   3  Scaleway               34.2    41.7  24.2  40.8  ...  FAIL (4)

# JSON and CSV output also available
tenant-sec score --profile profiles/eu-regulated-fintech.yaml --format json
# Per-control breakdown for a single provider
tenant-sec detail --provider aws --domain encryption

── ENCRYPTION ──────────────────────────────────
  enc.encryption-at-rest-default    MIXED  Encryption at rest — Default
    s3            L3   S3 encrypts all objects ...
    ebs           L3   EBS default encryption ...
    rds           L2   Must be enabled at creation ...
  enc.cmk                           MIXED  Customer-Managed Keys
  enc.byok                          L3     Bring Your Own Key
  enc.external-key-management       L3     External KMS (XKS)
# Side-by-side comparison
tenant-sec compare \
  --providers aws,gcp,scaleway \
  --domain iam

── IAM ───────────────────────────────────────────
Control                       AWS      GCP      Scaleway
iam.external-idp-federation   L3       L3       L2
iam.privileged-access         L3       L3       L0
iam.abac                      L3       L3       L1
iam.permission-boundaries     L3       L3       L0
...
# Export a provider profile as HTML, JSON, or CSV
tenant-sec export \
  --provider aws \
  --format html \
  -o aws-report.html

tenant-sec export \
  --provider scaleway \
  --format csv \
  -o scaleway-controls.csv
Scoring Profiles

Your threat model, expressed as data

Scoring profiles are YAML files you create. They define which controls are mandatory, how domains are weighted, and how mixed composites are aggregated. No code changes required.

# profiles/eu-regulated-fintech.yaml
name: "eu-regulated-fintech"
description: >
  European fintech under DORA & GDPR.

# Hard requirements — fail = flagged provider
must_have:
  - control: "gov.preventive-policy"
    min_level: 2
  - control: "enc.cmk"
    min_level: 2
  - control: "log.immutability"
    min_level: 2
  - control: "data.residency-guarantees"
    min_level: 2

# Domain weights (must sum to 1.0)
weights:
  iam:        0.20
  governance: 0.15
  encryption: 0.20
  network:    0.10
  logging:    0.15
  data:       0.10
  compute:    0.05
  incident:   0.03
  supply-chain: 0.02

# How to aggregate mixed composites
# p20 = conservative but not worst-case
mixed_aggregation: "p20"

Aggregation options for mixed composites

min

Worst-case. A single L0 service drags the control to L0. Appropriate for hard security requirements.

mean   median

Central tendency. Outliers averaged out. Good for general enterprise baselines.

p10   p20

Conservative percentiles. The 20th percentile score must meet your bar — 80% of services above doesn't matter.

threshold:L2:0.8

Policy threshold: returns L2 if ≥80% of services are at L2 or above, otherwise L1. Expresses a quorum requirement.

Use Cases

Who is this for?

🏗️

Cloud migration decisions

You're evaluating providers for a multi-cloud or migration project. Drop your security requirements into a scoring profile and get a ranked comparison grounded in per-control evidence — not marketing material.

🔍

Security due diligence

Clients adopting a new cloud provider. Auditors reviewing control coverage. The structured evidence text makes it defensible — every score cites exactly what was tested and why.

🇪🇺

EU regulatory compliance

DORA, GDPR, NIS2 all demand evidence of supply chain security. The data.residency-guarantees and data.sovereignty-controls controls give you a structured basis for provider-selection justification.

📊

Provider roadmap benchmarking

Cloud providers can use this as a structured external view of their tenant-space capability gaps — grounded in what customers need, not internal engineering self-assessment.

🧑‍🔬

Security research

Structured, versioned, open data set covering capability maturity across major providers. Researchers can track changes over time via git history and build their own analyses on top of the data.

🌐

In-browser evaluation (no install)

The scoring engine runs entirely client-side as a static page. Paste your scoring profile, choose providers, and get ranked results — no data leaves your browser.

→ Open evaluator
Architecture

Data-first, schema-validated, open

Controls, provider assessments, and framework mappings are YAML data validated by JSON Schemas. The scoring engine and CLI are the tooling layer around the data. The data is the primary artifact.

tenant-sec/
├── schema/            # JSON Schemas (draft 2020-12)
│   ├── control.schema.json
│   ├── provider.schema.json
│   ├── scoring-profile.schema.json
│   └── service-catalog.yaml   # 24 canonical categories
│
├── controls/          # 71 control definitions
│   ├── _index.yaml            # master index
│   ├── iam/                   # 13 controls
│   ├── governance/            # 6 controls
│   ├── encryption/            # 9 controls
│   ├── network/               # 10 controls
│   ├── logging/               # 6 controls
│   ├── data/                  # 8 controls
│   ├── compute/               # 7 controls
│   ├── incident/              # 5 controls
│   └── supply-chain/          # 7 controls
│
├── providers/         # Assessments
│   ├── aws.yaml               # 62 tenant controls
│   ├── azure.yaml             # 62 tenant controls
│   ├── gcp.yaml               # 62 tenant controls
│   └── scaleway.yaml          # 62 tenant controls
│
├── mappings/
│   ├── ccm-v4.1.yaml
│   └── nist-800-53-r5.yaml
│
├── profiles/          # Example scoring profiles
│   ├── eu-regulated-fintech.yaml
│   ├── general-enterprise.yaml
│   └── data-sovereignty.yaml
│
└── src/tenant_sec/    # Python CLI (Apache 2.0)
    ├── cli/                   # validate / score / detail / compare / export
    ├── core/                  # loader, registry, staleness
    └── scoring/               # engine, aggregation, ranking
  • Schemas JSON Schema draft 2020-12 validates every YAML file. Controls, provider profiles, and scoring profiles each have their own schema. tenant-sec validate runs schema + cross-reference checks.
  • Control taxonomy 71 controls across 9 domains, including 62 tenant controls. Each tenant control has L0–L3 criteria written to be assessor-actionable, plus CCM and NIST 800-53 mappings. Adding a control is a data change — not a code change.
  • Provider profiles One YAML file per provider. Every score has evidence text. Mixed composites include a full per-service breakdown. Assessor tier (self / community / accredited) is declared and drives staleness thresholds.
  • Scoring engine Weighted domain scores, configurable mixed aggregation, must-have filters, weight redistribution for unassessed domains. Pluggable: CLI, Python library, or browser JS port.
  • Dual license Data (controls, providers, mappings) → CC BY 4.0. Code (CLI, engine) → Apache 2.0.
Framework Mappings

Bridging existing frameworks

tenant-sec is not a replacement for CCM, CIS, or NIST 800-53 — it augments them. Every control carries framework mappings in both directions: forward (control → framework IDs) and reverse (framework ID → controls).

CSA CCM v4.1

Full mapping included. GRM, EKM, IAM, LOG, IVS, DSP families covered.

NIST SP 800-53 Rev 5

AC, AU, CA, CM, CP, IA, IR, SA, SC, SI families mapped.

CIS Benchmarks

Post-v1. AWS v5, Azure v5, GCP v4 planned.

MITRE ATT&CK Cloud

Post-v1. Technique-level mappings planned.

Get Started

Start evaluating — right now

No account. No install required for the browser evaluator. The data is CC BY 4.0 — take it, fork it, build on it.

Capability levels

How to read the capability map

Colors show how much tenant engineering is required to achieve a capability. They are maturity signals—not pass/fail grades, certifications, or security verdicts.

L0
Unavailable from tenant space

Red · The provider does not expose the capability.

L1
Build and operate it yourself

Amber · Possible through custom automation or external tooling.

L2
Managed, with limitations

Blue · Provider-managed, but constrained in scope or configurability.

L3
Managed and customizable

Green · Provider-managed with tenant-configurable policy or scope.

MIX
Varies by service

Purple · The control contains different L0–L3 results across services.

—
Unknown or unscored

Grey · Evidence is insufficient, not applicable, or not yet assessed.

Important: higher levels mean less tenant-owned implementation work. The right target still depends on your threat model, service scope, and required controls.