configure-container-scan — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited configure-container-scan (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Add a container image scanning step to an existing Harness pipeline using the native HarnessSCA STO scanner.
Ask for org, project, and pipeline identifier if not already known. This skill only works with existing pipelines.
Call MCP tool: harness_get
Parameters:
resource_type: "pipeline"
resource_id: "<pipeline_identifier>"
org_id: "<organization>"
project_id: "<project>"Parse the pipeline YAML to identify:
CI, SecurityTests, Deployment, Approval)SecurityTests stage already existsPresent the structure to the user:
Pipeline: <name>
Stage 1: <stage_name> (type: <stage_type>)
- Step 1: <step_name> (type: <step_type>)
...Ask the user where they want the scanner step added:
Present the available insertion points:
CI stage (scanner step is added directly into that stage's execution.steps)SecurityTests stage (scanner step is added into that stage's execution.steps)SecurityTests stage (appended to the pipeline if no suitable stage exists or user prefers isolation)Recommendation guidance:
CI stage — simpler, no extra infrastructure needed, scan runs as part of the buildSecurityTests stage — isolated, runs independently, useful when scanning images built elsewhere or from a registryIf the user doesn't specify, default to adding inside the existing CI stage if one exists.
Present the available container image scanners supported in Harness STO:
Available Container Scanners:
Default recommendation: Use Harness SCA — native, no additional credentials required, and integrates directly with Harness STO results.
Ask the user which scanner they prefer. If they don't specify, use Harness SCA as the default.
Step type mapping and scanner product auth requirements:
| Scanner | type field | Product auth needed? | Auth fields |
|---|---|---|---|
| Harness SCA | HarnessSCA | No | — |
| Aqua Trivy | AquaTrivy | No | — |
| Grype | Grype | No | — |
| Snyk | Snyk | Yes | access_token (Snyk API token) |
| Prisma Cloud | PrismaCloud | Yes | access_id (Access Key), access_token (Secret Key) |
| Anchore Enterprise | AnchoreEnterprise | Yes | access_id (username), access_token (password/API key) |
| Black Duck | BlackDuck | Yes | access_token (Hub API token) |
| Wiz | Wiz | Yes | access_id (Client ID), access_token (Client Secret) |
If the user picks a commercial scanner (Snyk, Prisma Cloud, Anchore Enterprise, Black Duck, Wiz):
<+secrets.getValue("project.<secret_identifier>")>auth block of the step spec — separate from the registry image credentialsExample prompt to user:
"Snyk requires an API token. Please provide the Harness secret identifier for your Snyk API token (e.g.,snyk_api_token). I'll reference it as<+secrets.getValue("project.snyk_api_token")>."
If the secret doesn't exist yet, suggest creating it first via /create-secret before proceeding.
Ask the user which registry type their image is in, then collect the fields for that type:
Option A — Harness Registry
The image is stored in the Harness internal container registry.
| Field | Required | Description |
|---|---|---|
| Registry | Yes | Harness registry connector ref (e.g., account.account-level-test) |
| Image Path | Yes | e.g., harness/todolist-sample — maps to image_path in YAML |
YAML:
image:
type: harness
registry: <harness_registry_connector_ref>
image_path: <image_path>Option B — Third-Party Registry (Docker Hub, ECR, GCR, ACR, JFrog, etc.)
| Field | Required | Description |
|---|---|---|
| Type | Yes | Registry protocol — almost always docker_v2 |
| Domain | No | Defaults to docker.io. For ECR: 123456789.dkr.ecr.us-east-1.amazonaws.com, for GCR: gcr.io |
| Name | Yes | Image name, e.g., harness/todolist-sample or myorg/myapp |
| Tag / Digest | Yes | e.g., latest, 123, or sha256:1234567890abcdef... |
| Access Id | No | Secret ref for private registry username/access key, e.g., <+secrets.getValue("project.access_id")> |
| Access Token | No | Secret ref for private registry password/token, e.g., <+secrets.getValue("project.access_token")> |
YAML:
image:
type: docker_v2
domain: <domain> # omit if Docker Hub (docker.io)
name: <image_name>
tag: <tag>
access_id: <+secrets.getValue("project.access_id")> # omit if public image
access_token: <+secrets.getValue("project.access_token")> # omit if public imageOption C — Local (image built in this stage)
The image was built earlier in the same pipeline stage and is available locally on the build node.
| Field | Required | Description |
|---|---|---|
| Name | Yes | Image name, e.g., harness/todolist-sample |
| Tag / Digest | Yes | e.g., latest, 123, or sha256:1234567890abcdef... |
| Domain | No | Defaults to docker.io |
YAML:
image:
type: local_image
name: <image_name>
tag: <tag>
domain: <domain> # omit if not neededDefault: Third-Party → Docker Hub (docker_v2, domain docker.io) with latest tag if the user doesn't specify.
Only required when adding a new `SecurityTests` stage. If inserting into an existing CI or SecurityTests stage, skip this step — the stage already has infrastructure.
If a new SecurityTests stage is being created and infrastructure is not yet defined, ask for:
account.stoqadelegate)harness-delegate)Use the step type from the scanner mapping in Step 3. Examples below.
For Harness SCA (default scanner):
- step:
type: HarnessSCA
name: Container_Scan
identifier: Container_Scan
spec:
mode: orchestration
config: default
target:
type: container
detection: auto
advanced:
log:
level: info
resources:
limits:
memory: 2G
cpu: 1000m
privileged: true
image:
<use the image block from Step 4 based on registry type>Use the image block generated in Step 4 (Harness / Third-Party / Local). The rest of the step spec is identical regardless of registry type.
For Aqua Trivy (open-source):
- step:
type: AquaTrivy
name: Aqua_Trivy_Scan
identifier: Aqua_Trivy_Scan
spec:
mode: orchestration
config: default
target:
type: container
detection: auto
advanced:
log:
level: info
privileged: true
image:
type: docker_v2
name: <image_name>
tag: <tag>For Grype (open-source):
- step:
type: Grype
name: Grype_Scan
identifier: Grype_Scan
spec:
mode: orchestration
config: default
target:
type: container
detection: auto
advanced:
log:
level: info
privileged: true
image:
type: docker_v2
name: <image_name>
tag: <tag>For commercial scanners — add an `auth` block with scanner product credentials:
- step:
type: Snyk # or PrismaCloud, AnchoreEnterprise, BlackDuck, Wiz
name: Snyk_Container_Scan
identifier: Snyk_Container_Scan
spec:
mode: orchestration
config: default
target:
type: container
detection: auto
auth:
access_id: <+secrets.getValue("project.snyk_access_id")> # omit if scanner only needs token
access_token: <+secrets.getValue("project.snyk_api_token")>
advanced:
log:
level: info
privileged: true
image:
type: docker_v2
name: <image_name>
tag: <tag>Use the auth field names from the scanner product auth table in Step 3. Only include access_id if the scanner requires it (Snyk only needs access_token; Prisma Cloud, Anchore, and Wiz need both).
Scenario A — Adding to an existing `CI` stage:
Insert the step into spec.execution.steps of the chosen CI stage. The stage already has its own infrastructure and cloneCodebase: true. No changes needed to the stage itself — just append the step:
- step:
type: HarnessSCA
name: Container_Scan
identifier: Container_Scan
spec:
mode: orchestration
config: default
target:
type: container
detection: auto
advanced:
log:
level: info
resources:
limits:
memory: 2G
cpu: 1000m
privileged: true
image:
type: docker_v2
name: <image_name>
tag: <tag>Scenario B — Adding to an existing `SecurityTests` stage:
Insert the step into spec.execution.steps of the existing stage. Ensure the stage has:
cloneCodebase: falseprivileged: true on the stepScenario C — No suitable stage exists, creating a new `SecurityTests` stage:
Append a new stage to the pipeline:
- stage:
name: Container Scan
identifier: Container_Scan_Stage
type: SecurityTests
spec:
cloneCodebase: false
infrastructure:
type: KubernetesDirect
spec:
connectorRef: <delegate_connector>
namespace: <namespace>
automountServiceAccountToken: true
nodeSelector: {}
os: Linux
execution:
steps:
- step:
type: HarnessSCA
name: Container_Scan
identifier: Container_Scan
spec:
mode: orchestration
config: default
target:
type: container
detection: auto
advanced:
log:
level: info
resources:
limits:
memory: 2G
cpu: 1000m
privileged: true
image:
type: docker_v2
name: <image_name>
tag: <tag>Call MCP tool: harness_update
Parameters:
resource_type: "pipeline"
resource_id: "<pipeline_identifier>"
org_id: "<organization>"
project_id: "<project>"
body: { yamlPipeline: "<updated pipeline YAML string>" }## Container Scan Configured
**Pipeline:** <pipeline_name>
**Scanner:** <scanner_name> (<scanner_type>)
**Stage:** <stage_name> (SecurityTests)
**Image:** <image_name>:<tag>
**Registry:** <registry_type>
**Pipeline URL:** https://app.harness.io/ng/account/<account_id>/module/sto/orgs/<org_id>/projects/<project_id>/pipelines/<pipeline_id>/pipeline-studio/
### Next Steps
1. Run the pipeline to verify the scan step executes successfully
2. View scan results in the Security Tests tab of the execution
3. Set failure thresholds using `failOnSeverity` (CRITICAL, HIGH, MEDIUM, LOW) in the step's Advanced tab
4. Configure exemptions for false positives via `/security-report` skill
5. Enforce pipeline gates on severity via `/create-policy` skill/create-container-scan
Add a container scan to my pipeline for the image johnkday/nodegoat:latest/create-container-scan
Add container scanning to my deploy pipeline. The image is in ECR:
123456789.dkr.ecr.us-east-1.amazonaws.com/my-service:v2.1.0
Use our ECR credentials stored in secrets./create-container-scan
I want to scan my Docker image myorg/api-server:latest before it gets deployed.
Add it to the existing SecurityTests stage in my backend-deploy pipeline.HarnessSCA (and all other scanners) can be added to CI stages (inline with build) or SecurityTests stages (isolated) — ask the user, default to CI stage if one existsauth.access_id / auth.access_token) before generating YAML — these are different from registry credentials/create-secret before proceedingauth block sits at the step spec level, separate from image credentialsprivileged: true on the HarnessSCA step — it is required for container scanningSecurityTests stage — existing stages already have infrastructurecloneCodebase: false on SecurityTests stages — CI stages already manage their own codebase settingmode: orchestration and config: default unless the user specifies otherwisememory: 2G and cpu: 1000m to avoid OOM failures during scanorg_id and project_id are correctharness_list (resource_type: "pipeline")privileged: true is set on the step specimage.access_id and image.access_token reference valid secretsauth.access_token (and auth.access_id where required) reference valid Harness secretsharness_get(resource_type="secret")access_token is needed (API token), not access_idaccess_id and access_token are required/create-secret then re-run the skillidentifier matches pattern ^[a-zA-Z_][0-9a-zA-Z_]{0,127}$SecurityTests stage has a valid infrastructure block with a working delegate connector~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.