Architecture Overview
The Onam platform is a multi-tenant SaaS that continuously discovers, evaluates, and monitors cloud resources across seven cloud providers — AWS, Azure, GCP, OCI, Alibaba Cloud, IBM Cloud, and Kubernetes — using read-only credentials. There are no agents to install for cloud scanning and no changes to your environment. This page explains how the platform is organized: the 29 engines, the pipeline a scan flows through, the unified data model behind every finding, and how your data is isolated from every other tenant.
By the end you will be able to trace any number in the Onam console — a posture score, a compliance percentage, an attack path — back to the exact engine, table, and scan run that produced it.
What you're looking at, top to bottom:
- Your cloud environments — AWS, Azure, GCP, OCI, Alibaba Cloud, IBM Cloud, and any Kubernetes cluster connect via a read-only IAM role, service principal, or service account.
- The scan pipeline — every connected account flows through the same ordered stages: credential validation, Discovery & Inventory (DI), rule evaluation, domain-engine fan-out, attack-path graph build, compliance mapping, and FAIR risk quantification.
- Security engines — 29 engines cover posture, identity, data, network, container, AI, vulnerability, and behavioral detection.
- The data platform — findings, inventory, relationships, and the attack-path graph are stored in tenant-isolated databases that only your authenticated users can read.
- Outputs — a posture score (0–100), compliance reports for 70+ frameworks, prioritized findings, attack paths with choke points, and step-by-step remediation guidance.
A typical scan of a 40-service AWS account completes in around 15 minutes. Findings appear in real time as each stage completes — you don't wait for the full pipeline to see results.
The 29 security engines
The platform runs 29 engines, each a dedicated microservice responsible for one area of cloud security. (Attack Path v1 remains in maintenance for legacy tenants; Attack Path v2 is the active engine.)
| Engine | Group | Purpose |
|---|---|---|
| Onboarding | Pipeline | Credential validation, cloud-account management, scan orchestration |
| Discovery & Inventory (DI) | Pipeline | Multi-phase enumeration and enrichment; writes asset_inventory and asset_relationships |
| Check | Pipeline | CSPM core — evaluates the 10,000+ rule registry, PASS/FAIL per resource |
| Check Engine API | Pipeline | Rule-execution service: YAML rules in, PASS/FAIL results out |
| Attack Path v2 | Pipeline | Neo4j security graph, entry-point-to-crown-jewel traversal, choke-point ranking |
| Compliance | Pipeline | Maps findings to 70+ framework control catalogs, per-control scoring |
| Risk Quantification | Pipeline | FAIR model — runs as Layer 4 after all engines, dollar-denominated exposure |
| IAM / CIEM | Domain | Effective permissions, unused access, privilege-escalation chains |
| Data Security (DSPM) | Domain | Discovers data stores, classifies PII / PCI / PHI |
| Database Security | Domain | RDS, Aurora, DynamoDB, Redshift configuration and access control |
| Network Security | Domain | 7-layer network posture model, exposure and reachability analysis |
| Encryption Security | Domain | KMS key rotation, TLS certificates, at-rest encryption coverage |
| Container Security | Domain | EKS / ECS / AKS / GKE posture, pod security, image scanning, K8s RBAC |
| AI Security | Domain | Bedrock, SageMaker, Azure OpenAI, Vertex configuration; prompt-injection and model-poisoning exposure; AI governance |
| API Security | Domain | API gateway and endpoint posture |
| Vulnerability | Domain | NVD CVEs, EPSS, CISA KEV, OSV; SBOM generation; DAST scanning |
| Agentless Scanner | Domain | Snapshot-based workload scanning — no agent on the host |
| CDR / Behavioral Analysis | Domain | Audit-log threat detection across all 7 providers (L1 / L2 / L3 tiers) |
| CWPP | Domain | Cloud workload protection posture |
| CNAPP | Domain | Unified CNAPP posture aggregation |
| SecOps / AppSec | Code | SAST across 7 languages, DAST, SCA / SBOM, semgrep-based scanning |
| Technology Engine | Technology | 40 self-hosted technologies in 10 categories (databases, OS, network devices, web servers, and more) |
| Remediation / Fix | Intelligence | AI-generated source-code fixes, SAST fixes, threat narratives |
| Chat | Intelligence | The AI assistant built into the Onam console |
| Rule Builder | Platform | Author, version, and test custom rules |
| Pipeline Monitor | Platform | Real-time scan pipeline status and log streaming |
| Platform Admin | Platform | Multi-tenant organization management and user administration |
| Billing | Platform | Usage metering and plan management |
Every engine writes to the unified security_findings table (see the finding contract below). The API layer reads exclusively from this table — there are no per-engine report tables in the current architecture.
The API layer — BFF gateway
All console and programmatic access goes through a single BFF (backend-for-frontend) API gateway built on FastAPI. It exposes roughly 166 endpoints across ~60 routers under the /api/v1 base path, with a per-engine prefix for each domain (/api/v1/di, /api/v1/check, /api/v1/compliance, /api/v1/iam-security, /api/v1/data-security, /api/v1/network-security, /api/v1/container-security, /api/v1/cdr, /api/v1/risk, and so on).
Representative endpoints:
GET /api/v1/dashboard
GET /api/v1/attack-paths
GET /api/v1/compliance/framework/{framework_id}/report
GET /api/v1/cdr/heatmap
GET /api/v1/vulnerability/findings/stats
GET /api/v1/risk/blast-radius
GET /api/v1/inventory/asset/{resource_uid}/blast-radius
GET /gateway/health
GET /gateway/services
GET /gateway/openapi.jsonThe gateway enforces authentication and tenant scoping before any request reaches an engine — see Platform data security and tenancy.
Core design principles
Five non-negotiable principles drive every decision in the platform. Together they make it safe to deploy in regulated environments, easy to integrate, and predictable to operate.
1. Agentless by default
You install nothing to scan your clouds. The platform never deploys agents on your VMs, never injects sidecars into your containers, and never adds a daemon to your Kubernetes nodes. Every scan is performed externally over read-only cloud APIs (AWS SDK, Azure Management API, GCP Cloud Asset API, and equivalents) using credentials you control.
The one deliberate exception is opt-in: the optional onam-agent for Linux, macOS, and Windows performs OS-level vulnerability scanning on hosts you choose and reports outbound to the central engine. The cloud connection itself always stays agentless.
Why this matters for you: zero blast radius from the platform itself. If you revoke access tomorrow, your environment keeps running unchanged. There is nothing to uninstall.
2. Multi-tenant always
Every database query is filtered by your tenant identifier taken from the authenticated request. There are no shared tables, no cross-tenant views, and no admin "see-everything" mode. Tenant isolation is enforced independently at three layers — the API gateway, the security engines, and the database — so a bug in any one layer cannot expose another tenant's data.
Why this matters for you: SOC 2 and ISO 27001 auditors look for defense-in-depth on data isolation. Three independent enforcement points satisfy that requirement.
3. Pipeline-driven with a single scan ID
Every cloud account scan is assigned a single UUID called scan_run_id. That ID flows through every stage and is stamped on every finding the scan produces. Two scans of the same account produce two completely separate finding sets, each tagged by its own scan_run_id.
Why this matters for you: when you investigate "why did the score change last Tuesday?", you can pull every finding from that exact run, compare it to the previous run, and see precisely what changed. Findings never leak between scans.
4. Standardized finding contract
Every security domain produces findings using the same standard fields — finding_id, scan_run_id, account_id, resource_uid, resource_type, severity, status, first_seen_at, last_seen_at. The contract is consistent across all clouds and all security pillars.
Why this matters for you: a single API call, a single export, a single CSV download gives you the same shape of data whether the finding came from CSPM, CIEM, DSPM, or vulnerability management. There's nothing per-domain to learn.
5. Rule-as-code in YAML
All 10,000+ security rules are defined in human-readable YAML and versioned in a catalog. The master rule registry holds 10,864 rules: AWS 2,278 (157 services), Azure 3,741 (112 services), GCP 2,676 (47 services), OCI 1,451 (42 services), and Kubernetes 718 (51 resource kinds), with rule-metadata coverage extending to Alibaba Cloud (1,541) and IBM Cloud (613). Dedicated CIEM rule packs, Technology Engine rules, and SecOps rules add further coverage. Each rule declares its cloud, service, severity, MITRE ATT&CK mapping, framework controls, and remediation guidance. The platform only loads and evaluates rules — it never hardcodes them in software.
Why this matters for you: auditors can read the YAML to verify exactly what the platform checks. You can request new rules, propose changes, and see the diff between rule versions over time.
From cloud account to posture score
A connected cloud account flows through a value pipeline that turns raw cloud configuration into prioritized, framework-mapped, dollar-quantified findings. This is the loop the platform repeats for every account on every scan.
| Stage | What happens | Time (40-service AWS account) |
|---|---|---|
| 1. Discover all resources | DI enumerates every resource across the provider's covered services and captures configuration | 3–5 min |
| 2. Evaluate security rules | Check runs every applicable rule from the 10,000+ registry; each is marked PASS or FAIL | 4–6 min |
| 3. Build the attack graph | FAIL findings and asset relationships become nodes and edges in the Neo4j attack-path graph, with MITRE ATT&CK techniques per hop | 1–2 min |
| 4. Map to frameworks | Each finding is mapped to the controls it violates across 70+ compliance frameworks | Under 1 min |
| 5. Score risk | The FAIR model computes dollar-denominated exposure and the 0–100 posture score | Under 1 min |
The output serves three audiences: a posture dashboard for security engineers, compliance reports for auditors, and actionable findings with remediation steps for the cloud account owner.
Domains by layer in the diagram:
- Web tier — the Onam console, where you investigate findings, run scans, and configure your tenant; protected by SSO, RBAC, and tenant-scoped routing.
- Core pipeline (sequential) — Onboarding (credential validation), DI (enumeration and enrichment), Check (rule evaluation), Attack Path (graph build). These run in order because each consumes the previous stage's output.
- Security domains (parallel) — IAM/CIEM, Network, Data Security, Database Security, Encryption, Container, AI Security, API Security, Vulnerability, CDR, CWPP, CNAPP. These run simultaneously after inventory completes.
- Intelligence layer — Compliance mapping, FAIR risk scoring, and AI-generated threat narratives from the Remediation/Fix engine.
You don't enable domains individually. Once a cloud account is connected, every applicable domain runs on every scan.
The ten security pillars and what each one answers:
| Pillar | Question it answers | Scale |
|---|---|---|
| CSPM | Are my cloud configurations compliant with my baselines? | 10,000+ rules across 7 providers |
| CIEM | Which identities have more access than they actually use? | Effective-permission analysis incl. SCPs and permission boundaries; per-cloud CIEM rule packs |
| DSPM | Where is my sensitive data and is it exposed? | PII · PCI · PHI classification across object stores, databases, and warehouses |
| Network Security | Which paths from the internet to my crown jewels are still reachable? | 7-layer network posture model |
| Container Security | Are my clusters and images compromised or misconfigured? | EKS · ECS · AKS · GKE · any K8s |
| Vulnerability Management | Which CVEs are exploitable in my live workloads? | NVD · EPSS · CISA KEV · OSV · SBOM · DAST |
| AI Security | Are my AI/ML services safe? | Bedrock · SageMaker · Azure OpenAI · Vertex |
| Attack Path & CDR | How would an attacker move through my environment? Are there active threats? | Neo4j graph traversal · per-hop MITRE ATT&CK · L1/L2/L3 detection |
| SecOps (SAST/DAST/SCA/IaC) | Are vulnerabilities entering my code before deploy? | SAST in 7 languages · DAST · SCA/SBOM · IaC scanning |
| Compliance | What's my pass rate against my framework obligations? | 70+ frameworks incl. CIS, NIST, PCI-DSS, HIPAA, ISO 27001, SOC 2, GDPR, FedRAMP |
The unified posture score is a weighted roll-up across all pillars, normalized to 0–100. Each pillar contributes proportionally to its severity-weighted findings — fixing a single Critical finding moves the score more than fixing ten Low findings.
For the stage-by-stage walkthrough of a scan — triggers, DI phases, engine fan-out, graph build, and monitoring — see The scan pipeline.
Multi-cloud coverage
The platform supports seven cloud providers using a read-only IAM role (AWS, OCI, Alibaba Cloud, IBM Cloud), service principal (Azure), service account (GCP), or kubeconfig (Kubernetes). The same pipeline and the same rule registry run against every provider — what differs is the per-cloud service catalog and the credential model.
| Provider | Compute | Storage & Data | Identity & Security | Network |
|---|---|---|---|---|
| AWS | EC2 · EKS · Lambda · ECS · Fargate | S3 · RDS · DynamoDB · Redshift | IAM · KMS · Secrets Manager · WAF | VPC · SG · NACL · ALB · CloudFront |
| Microsoft Azure | VMs · AKS · Functions · Container Inst | Blob · SQL · Cosmos DB · ADX | AAD · Key Vault · Defender · NSG | VNet · NSG · Front Door · App Gateway |
| Google Cloud | GCE · GKE · Cloud Run · App Engine | GCS · Cloud SQL · BigQuery | IAM · KMS · Cloud Audit · Armor | VPC · Firewall · Load Balancer |
| Oracle Cloud (OCI) | Compute · OKE · Functions | Object Storage · DB Systems · Autonomous DB | IAM · Vault · Audit Service | VCN · Security Lists · WAF |
| Alibaba Cloud | ECS · ACK · Function Compute | OSS · RDS · Table Store · MaxCompute | RAM · KMS · ActionTrail · Anti-DDoS | VPC · Security Groups · WAF |
| IBM Cloud | VSI · IKS · Code Engine | Cloud Object Storage · Db2 · Cloudant | IAM · Key Protect · Activity Tracker | VPC · Security Groups · Internet Svc |
| Kubernetes (any) | Clusters · Nodes · Pods · Deployments | Persistent Volumes · ConfigMaps | RBAC · Roles · ServiceAccounts | Network Policies · Ingress |
Rule depth per provider (master registry, plus rule-metadata coverage for Alibaba and IBM):
| Provider | Rules | Coverage |
|---|---|---|
| AWS | 2,278 | 157 services |
| Azure | 3,741 | 112 services |
| GCP | 2,676 | 47 services |
| OCI | 1,451 | 42 services |
| Kubernetes | 718 | 51 resource kinds |
| Alibaba Cloud | 1,541 | Rule-metadata catalog |
| IBM Cloud | 613 | Rule-metadata catalog |
Dedicated CIEM rule files add identity-specific coverage on top: AWS 530, Azure 202, GCP 176, Alibaba 114, IBM 110, OCI 107, and Kubernetes 103. Beyond the clouds, the Technology Engine extends the same model to 40 self-hosted technologies in 10 categories — databases, Linux/OS, network devices, web servers, virtualization, containers, DevOps, collaboration, data platforms, and middleware.
Coverage parity: the same finding contract, the same severity grading (Critical, High, Medium, Low, Info), and the same MITRE mapping apply across all seven providers. A "publicly exposed object storage" finding on AWS S3 and on Azure Blob shows up identically in your dashboard — same severity, same control mapping, same remediation pattern.
The platform never writes, deletes, or modifies anything in your cloud account. Read-only is enforced by the IAM policy you grant — you can audit it before you enable scanning. See Platform data security and tenancy.
Data flow and the finding contract
A single cloud resource — say one S3 bucket — flows through the platform from raw configuration to a posture-score contribution. Understanding this flow tells you where every piece of information in your dashboard came from and how to trace any finding back to its source data.
Following one S3 bucket through the pipeline:
- DI enumeration captures the raw bucket configuration — every property the AWS API exposes. Nothing is filtered or summarized at this stage.
- DI enrichment and normalization turns the bucket into a standard asset record in
asset_inventory— common fields likeresource_uid,region, and tags become first-class. Relationships (for example "this bucket is read by these Lambda functions") are written toasset_relationships. Drift vs the prior scan is tagged. - Check evaluates every applicable rule ("S3 public access blocked", "S3 default encryption enabled", "S3 versioning enabled") against the configuration. Each rule produces a PASS or FAIL.
- Attack Path v2 loads assets and relationships into the Neo4j graph and derives edges through ~25 catalog-driven derivers (IAM policy, network exposure, security-group rule match, KMS, CDR behavioral, is-public). If "S3 public access blocked = FAIL" and the bucket holds PII, the graph gains a candidate edge toward MITRE technique
T1530(Data from Cloud Storage Object). - Compliance maps the FAIL to framework controls. The same single FAIL on "S3 public access blocked" appears in CIS AWS 2.1.5, NIST SP 800-53 SC-7, PCI-DSS 1.3.4, HIPAA §164.312, and SOC 2 CC6.1 — one finding, five framework citations, all auto-mapped.
- Risk weights the finding by severity, blast radius (how many resources depend on this bucket, straight from the graph), and asset criticality (does this resource expose PII?). The FAIR model converts that into a dollar-exposure estimate and a posture-score contribution.
Every finding record carries a standard set of fields regardless of which engine produced it. This is what enables cross-domain queries, exports, and a unified dashboard:
| Field | What it is | Why it matters |
|---|---|---|
finding_id | Deterministic hash of rule, resource, and account | Same finding keeps the same ID across re-scans, so ack/snooze/suppress survive rescans |
scan_run_id | UUID tagging every finding from a single scan | "What changed between Tuesday's scan and today's?" is answerable with one diff |
account_id | The cloud account this finding belongs to | Filter by account in multi-cloud organizations |
resource_uid | Globally unique cloud resource identifier (ARN, resource ID) | Click-through navigation to the resource in your cloud console |
resource_type | Normalized type (e.g. aws_s3_bucket, azure_storage_account) | Filter "show me all S3 issues" cross-account |
severity | CRITICAL · HIGH · MEDIUM · LOW · INFO | Drives default sort order in dashboards |
status | PASS · FAIL · UNKNOWN | UNKNOWN flags resources where data was insufficient — never silently skipped |
first_seen_at | When this finding was first detected | Aging analysis — "this has been open 47 days" |
last_seen_at | Most recent scan that observed this state | Auto-resolution — a finding closes when no longer observed |
The security_findings table
All 29 engines write to a single security_findings table in the DI database. This is the canonical source of truth for every finding on the platform; the BFF gateway reads exclusively from it. Every engine upserts findings using a shared writer, keyed on (tenant_id, account_id, rule_id, resource_uid):
| Column | Description |
|---|---|
finding_id | Deterministic ID — stable across re-scans |
tenant_id | NOT NULL — primary multi-tenant isolation key |
account_id | Cloud account ID |
provider | aws / azure / gcp / oci / alibaba / ibm / k8s |
region | Cloud region (defaults to global for IAM and other global services) |
scan_run_id | Pipeline run ID — traceability to the exact execution |
engine | Source engine name (e.g. iam, network, container) |
rule_id | Rule catalog ID |
resource_uid | Globally unique resource identifier |
resource_type | Normalized type (e.g. aws_s3_bucket) |
severity | CRITICAL / HIGH / MEDIUM / LOW / INFO |
status | PASS / FAIL / UNKNOWN |
title and description | Human-readable finding summary and detail |
remediation | Step-by-step fix guidance |
first_seen_at / last_seen_at | Detection lifecycle timestamps |
mitre_technique | MITRE ATT&CK technique ID (e.g. T1530) |
Auto-resolution: a finding is marked PASS when the next scan of the same resource no longer triggers the rule. The last_seen_at timestamp is updated on every scan; findings not seen for 30 days are auto-closed.
Inventory and posture tables
Two more tables complete the data model. asset_inventory and asset_relationships are produced by DI — normalized asset records plus typed edges (containment, attachment, network reachability, IAM trust) that feed the attack-path graph and the blast-radius APIs. posture_snapshot stores one row per engine per scan — total findings, Critical and High counts, and a 0–100 domain score — and backs every engine's /api/v1/{engine}/status endpoint.
Platform security, reliability, and data residency
The platform protects your data with defense-in-depth across independent layers — tenant isolation, role-based access control, and read-only credential handling. Any single layer's failure cannot cause a data exposure because the others still hold.
Multi-tenant isolation
Every API request carries an AuthContext — a server-built object with the caller's tenant ID, role, and permissions. Tenant isolation is enforced at three independent points so a bug in any one cannot leak another tenant's data.
- Layer 1 — API gateway. The auth middleware validates your access token, looks up the user, and constructs the
AuthContext. The token is signed; tampering invalidates it immediately. Engines never trust client-supplied identity. - Layer 2 — security engine. Every route validates that the caller holds the right
feature:actionpermission (e.g.findings:read,scans:create). Unauthorized callers receive HTTP 403 with no data leakage in the error body. - Layer 3 — database query. Every read and write is filtered by your tenant ID. There is no global query path and no admin bypass.
There is no environment variable, debug toggle, or support-mode switch that bypasses authentication, and there are no shared tables. Onam support staff cannot read your tenant's findings without an explicit, fully audit-logged impersonation handshake that you must approve. The full storage, credential, and residency model is documented in Platform data security and tenancy.
Role-based access control
The platform ships with five seeded roles and 27 permissions in the feature:action format. Roles are hierarchical — higher levels inherit the read permissions of lower levels.
| Role | Level | Scope | Typical user |
|---|---|---|---|
platform_admin | L1 | Every tenant on the platform | Onam support team only |
org_admin | L2 | Every tenant within your organization | Your CISO or VP Security |
tenant_admin | L4 | Full read/write within one tenant | Cloud security team lead |
analyst | L4 | Read all findings, acknowledge, comment | Day-to-day security engineer |
viewer | L4 | Read-only — limited to 9 non-sensitive permissions | Auditors, board reporting |
Sensitive areas — Data Security, AI Security, Encryption, Database Security, Container Security, SecOps, and Vulnerability — require tenant_admin or higher, because they contain sensitive resource details that should not be exposed to read-only auditors. SAML 2.0 SSO and SCIM provisioning are supported on Enterprise plans; group-to-role mappings sync from your identity provider on every login.
Reliability
| Component | Target |
|---|---|
| Platform availability | 99.9% monthly uptime SLA on Pro and Enterprise (99.95% on Enterprise+) |
| Scan completion (40-service AWS account) | 15 minutes end to end (SLO) |
| API p95 latency | 500 ms or less for read endpoints |
| Findings delivery | Real-time stream as each domain completes |
A live status page and historical incident reports are available at status.onam.io. Maintenance windows are announced 7 days in advance.
Data residency and disaster recovery
Your findings, inventory, and graph data are stored in the region you select: ap-south-1 (Mumbai, all plans), eu-west-1 (Ireland, Enterprise), us-east-1 (N. Virginia, all plans), and us-gov-west-1 (Government/FedRAMP plans). Cross-region access is blocked by tenant policy and backups stay in-region. Recovery targets: RPO 15 minutes (backups every 15 minutes), RTO 2 hours, with quarterly DR tests reported publicly.
Frequently asked questions
Does the scanner modify any cloud resources? No. Every stage uses read-only IAM roles or API credentials. The platform never writes to, deletes from, or modifies your cloud environment. The IAM policy you grant explicitly excludes write actions — you can audit it before enabling.
How is my data isolated from other tenants? Three independent enforcement layers: the API gateway builds the auth context, the engine validates permissions, and every database query filters by tenant ID. There are no shared tables, no cross-tenant views, and no admin bypass.
How often does the platform scan? Default is once per day per cloud account. You can configure up to four scans per day on Pro plans, and run ad-hoc scans at any time from the console or the API.
What credentials does the platform need? A read-only IAM role (AWS, launched via CloudFormation with an ExternalId), service principal (Azure), service account (GCP), or equivalent per provider. Credential references are stored in AWS Secrets Manager, encrypted with KMS. We never store cloud account passwords.
What happens when a scan fails? The pipeline marks the failed stage and continues. Findings from successful stages are still surfaced, failures are logged with root-cause context, and you can re-trigger from the console without affecting the prior scan's data. The Pipeline Monitor engine streams live status throughout.
Can I export my data? Yes. Finding history and inventory export as JSON, CSV, or Parquet via the API; compliance reports export as PDF. You retain ownership of all data.
Is the platform SOC 2 / ISO 27001 certified? SOC 2 Type II, ISO 27001, ISO 27701, and PCI DSS v4 — all current. Pentest report and CAIQ are available under NDA.
Next steps
- The scan pipeline — end to end — triggers, DI phases, engine fan-out, graph build, and monitoring
- Platform data security and tenancy — what is stored, credential handling, and read-only enforcement
- Compliance framework coverage — 70+ frameworks, per-control scoring, audit-ready reports
- Book a demo — see the full pipeline run against a live demo account