Skip to content

Running an Inspection

An inspection run scans one or more cloud accounts and/or code repositories, maps findings to compliance frameworks, scores each Well-Architected pillar, and generates reports - all automatically.


Before you start

Make sure you have the credentials ready for each target you want to scan:


Start a new run

Click Runs in the sidebar, then New Inspection (or navigate to /runs/new). Work through the three wizard steps:


Step 1 - Targets

Tick the cloud accounts, repositories, clusters, images and web applications you want to scan.

Every target is a saved connection, listed as a row with a checkbox, the way it is listed under Settings > Connections. Ticking a cloud account also ticks everything saved under it, so the clusters and registries a discovery found are not added one at a time. Options on a row sets fields for this scan only. Add in a section opens the same form as Settings > Connections, with the same Check and Save, and what it saves is ticked and can be reused in every scan. A row that cannot be scanned is listed greyed out with the reason.

A cloud account, cluster or image carried in from an earlier run or schedule that was entered by hand is marked From an earlier run · read-only. Keep it or remove it; it is sent unchanged.

Cloud Accounts

The tabs list the fields of the connection form for each provider.

Field Where to find it
Account ID 12-digit number in the AWS console top-right
Role ARN Created by you in the AWS setup guide - e.g. arn:aws:iam::123456789012:role/VirtualSutraInspection
Regions e.g. us-east-1, eu-west-1
Access Key / Secret Optional - leave blank to use the ambient instance role
Add as many AWS accounts as you need. Each account × region combination is scanned independently.
Field Where to find it
Subscription ID az account show --query id -o tsv
Tenant ID az account show --query tenantId -o tsv
Client ID appId from the service principal - see Azure setup guide
Client Secret password from the service principal
Regions Azure region names, e.g. eastus, westeurope
Field Where to find it
Service account key (JSON) The JSON key file - see GCP setup guide. Choose the file; it is not pasted
Organisation ID (optional) The numeric organisation ID, gcloud organizations list

Check signs in with the key and lists the projects, GKE clusters and Artifact Registry repositories it can read, without saving anything. You choose what to keep - every project including ones created later, or only the projects you pick - and then save. See GCP: one key, then discovery. Where discovery is not available, type the project IDs under More options.

A GCP account that follows later projects shows how many projects were discovered and added to this scan, and how old that list is. The list is fixed when the account is added: a schedule or a repeated run keeps it.

Repositories

Add source code repositories to scan for secrets, vulnerabilities, and code-level misconfigurations.

Field Description
Platform GitHub or GitLab
Owner Organisation or username (e.g. my-org)
Repository Repository name (e.g. my-app)
Token Read-only access token - see Repository setup guide

Leave the Repositories section empty if you are only scanning cloud infrastructure.

Kubernetes Clusters

Add Kubernetes clusters to scan for in-cluster security misconfigurations. Tick a saved cluster connection, or add one with Add. A cluster can sign in with a saved cloud account or with its own kubeconfig. A GKE cluster saved from a GCP discovery needs no kubeconfig: it is reached with its cloud account's key. One with a private endpoint is listed as Unavailable: it cannot be scanned yet and cannot be added.

Field Description
Cluster name Friendly label for the cluster (e.g. prod-us-east-1)
Kubeconfig The kubeconfig, raw or base64-encoded, or a secret reference to one (leave blank for in-cluster ServiceAccount)
Context kubeconfig context name (uses current-context if blank)
Namespaces Comma-separated namespaces to scan; leave blank to scan all
Skip namespaces Comma-separated namespaces to exclude (e.g. kube-system,kube-public)

Each cluster is scanned independently - one task is dispatched per cluster, running in parallel with cloud and codebase scanner tasks.

  • Pod checks - privileged containers, missing resource limits, :latest image tags, secrets in plain-text env vars
  • RBAC checks - ClusterAdmin bindings, default service account token mounts
  • Network checks - missing NetworkPolicies per namespace
  • PSS checks - Pod Security Standards baseline violations

Auth options

Running inside a Kubernetes pod? Leave kubeconfig blank - the agent uses the pod's ServiceAccount automatically. For external clusters, provide the kubeconfig as it is or base64-encoded, directly or via a secret reference (e.g. env://KUBECONFIG_BASE64). The scanner needs read access to the cluster, and says what is missing if it lacks it: see Access a scan needs.

Leave the Kubernetes Clusters section empty if you are not scanning Kubernetes clusters.

Container Images

Add container images to scan for CVEs, OS compliance violations, and software bill of materials (SBOM). Tick a saved registry connection, or add one with Add. A registry can sign in with a saved cloud account or with its own credential.

An Artifact Registry repository saved from a GCP discovery adds every tagged image in it, each at its newest tag, with untagged images skipped. Single images cannot be picked from it. A schedule or a repeated run keeps the image list it was built with. The wizard shows how many images were included and skipped and how old the list is, and adds the repository's cloud account to the scan, because the images are pulled with its key.

Field Description
Registry Registry hostname (e.g. ghcr.io, docker.io, 123456789.dkr.ecr.us-east-1.amazonaws.com)
Repository Repository path (e.g. my-org/my-app)
Tag Image tag or digest (default: latest)
Platforms Target platforms to scan, e.g. linux/amd64
Registry username Username for private registry (or leave blank for public)
Registry password Password or token for private registry

Each image is scanned independently. You can add as many images as you need.

  • CVE scanning (Trivy) runs automatically for every image.
  • SBOM generation (Syft, CycloneDX format) runs automatically and is downloadable after the run.
  • OS compliance (OpenSCAP) is opt-in per image - enable it in the inspection config for slower but deeper OS-level checks.

Private registry credentials

For AWS ECR, Azure ACR, or GCP Artifact Registry you need to grant the VirtualSutra service account read access first. See the Container Registry setup guide.

Leave the Container Images section empty if you are not scanning container images.


Step 2 - Scope

Configure what gets analysed:

Option Description
Compliance frameworks Which standards to evaluate - CIS, SOC 2, ISO 27001, OWASP, PCI-DSS, NIST CSF, WAF. See Compliance.
WAF assessment Enables the Well-Architected Framework pillar scoring. See WAF Assessment.
LLM remediation AI-enhanced remediation guidance per finding and per WAF pillar. Requires an LLM API key configured by your administrator.
Run name Optional label to identify this run in the list (e.g. prod-aws-weekly)

You can select multiple compliance frameworks in a single run. Each is scored independently.


Step 3 - Output

Select the report formats to generate:

Format Use case
PDF Share with stakeholders and management
HTML Read in-browser with cross-linked findings and controls
JSON Import into other tools
CSV Analyse in Excel or Google Sheets
SARIF Upload to GitHub Advanced Security or VS Code

Priority

The same step carries a PRIORITY selector with three options:

Option Effect
Low Admitted after Normal and High work
Normal The default
High Admitted ahead of queued Normal and Low work

The console shows this note under the selector:

Higher priority runs jump ahead of queued work of the same type. Availability of High priority may depend on your plan.

Two things that follow from that:

  • Priority orders admission, not speed. A High run starts sooner when runs are queued; it does not scan faster once it is running. Within a tier, runs start in the order they were submitted.
  • On a hosted plan, High may not be available to your organisation. If it is not, your run is not rejected - it is submitted at Normal and still starts. The downgrade is recorded in the audit log. On self-hosted deployments High is always available.

Review the summary, then click Start Inspection.


Monitor a running inspection

After submitting you land on the Run Detail page (/runs/{id}). It shows:

  • Status badge - queued → initializing → running → aggregating → reporting → completed
  • Queue position - while the run is still queued, a Queue position: n indicator shows how many runs are ahead of it. 0 means yours starts next. It disappears once the run is admitted
  • Trace ID - when your administrator has enabled distributed tracing, the run shows its trace ID with a copy button. The page middle-truncates it for display (first eight characters, an ellipsis, last eight), but the copy button puts the full 32 characters on your clipboard. If they also configured a trace-backend URL at build time, the ID is a link straight to that run's trace in Jaeger, Tempo, Grafana or whatever backend they run; otherwise it is plain copyable text you can paste into their tooling. No trace ID means tracing is not enabled
  • Agent summaries - one card per agent (cloud inspector, codebase analyzer, kubernetes inspector, container scanner, compliance, WAF, reporting) with task count, finding count, and elapsed time
  • Live findings - appear as agents complete; the page updates automatically during the run
  • Resources tab - once the run completes, the Resources tab shows every scanned resource grouped as a catalog row. Each row displays the resource name (human-readable, e.g. my-s3-bucket extracted from an ARN or prod-us-east-1/default/my-pod from a K8s path), type, cloud provider, region, source agent, total finding count, and worst severity. Use this tab to quickly identify which specific resources carry the most risk.
  • Map tab - once the run completes, the Map tab shows a service map grid grouped by resource type (Compute, IAM, Storage, Codebase, Kubernetes, etc.). Each tile displays the highest severity and total finding count for that category. Click View Findings → on any tile to jump directly to the Findings tab pre-filtered for that tile's source and cloud provider. Service map nodes also include the resource names discovered during the run.

A typical run takes 5–20 minutes depending on the number of cloud accounts and repository size.


Run statuses

Status Meaning
queued Waiting for admission. Higher-priority runs are admitted first; Queue position shows where yours sits
initializing Validating credentials, building task plan
running Agents are actively scanning
aggregating Collecting and deduplicating findings across agents
reporting Generating compliance scores and report files
completed All done - findings, scores, and reports ready
failed Fatal error - check agent summaries for details
partial Some agents failed, or a scan completed without all of its checks (an account with an API or role missing, a cluster the scanner could not fully read); partial results are available

Repeating a run

To re-run an inspection with exactly the same configuration, click the Repeat button (↺) on any completed or failed run in the Runs list. This creates a new run immediately - no wizard needed.

The new run:

  • Inherits all targets, scope, and output format settings from the original
  • Gets a new run ID and a name prefixed with Repeat of …
  • Appears at the top of the Runs list as soon as it is queued

This is useful after remediating findings to confirm that issues are resolved, or to run a fresh scan of the same environment on demand.


Cancelling a run

Open the Run Detail page and click Cancel. Available while the run is queued, initializing, running, or aggregating.


Resuming, rescoring, and regenerating reports

For runs that are failed, partial, or completed, the Actions menu on the Run Detail page provides three operations that avoid re-running scanners:

Resume

Available for failed or partial runs. Opens a wizard showing the per-task pipeline status. Failed and not-started tasks are pre-selected for re-dispatch; completed tasks can be opted in via a "Force re-run completed tasks" toggle. Submitting the wizard re-dispatches only the selected tasks - completed tasks are skipped by default and their findings are preserved.

A plain resume (not a rescore or a task retry) also runs again a cloud, codebase, container or Kubernetes scanner type that completed with recorded coverage gaps, for every account or cluster of that type, with the configuration the run was submitted with. See Resume or start a new scan.

Re-run Compliance & Reports

Available for completed, failed, or partial runs. Re-runs compliance scoring against the cached findings and regenerates the reports. No scanners are re-executed. Useful when:

  • A compliance framework's scoring rules have changed (e.g. CIS weight tweaks)
  • A new compliance framework is added and you want to score an existing run against it
  • A control mapping bug was fixed and the run needs re-scoring

You can optionally restrict the rescore to a subset of frameworks via the modal.

On the hosted service a rescore is held to the frameworks your plan includes today. A rescore that names no framework rescores the run's frameworks that the plan includes; the ones it leaves out keep their earlier scores and are named in the API's answer. It is refused only when the plan includes none of them. A rescore that names a framework outside the plan is refused. A new run or schedule follows the same rule: one that lists no framework is scored for the default frameworks your plan includes, and one that lists a framework outside the plan is refused.

Regenerate Reports

Available for completed, failed, or partial runs. Re-renders all report formats (PDF, HTML, JSON, CSV, SARIF) from the cached findings JSON on the reports volume. No scanners or compliance agents run. Existing report files are replaced. Useful when:

  • A reporting template was updated
  • A previous report failed mid-render and you want to regenerate without rescanning
  • You changed the report layout / branding

Note: Regenerate Reports requires the original report findings JSON to still be present on the reports volume. Runs older than the report retention window cannot be regenerated this way - use Re-run Compliance & Reports instead, which loads findings from the database.


After the run completes