Configures KICS (Keeping Infrastructure as Code Secure), Checkmarx's scanner covering Terraform, Kubernetes, Helm, Dockerfile, OpenAPI, Ansible, ARM, CloudFormation, Pulumi, Crossplane - CLI / Docker / GitHub Action / pre-commit, JSON / SARIF / HTML / JUnit output, custom Rego queries. Use for the widest platform breadth, especially OpenAPI / Pulumi / Crossplane; for the broadest built-in checks with Python custom rules use checkov-policy, for Terraform-only scanning use tfsec-policy, and for a consolidated scanner use trivy-config.
76
95%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
KICS (Keeping Infrastructure as Code Secure) is Checkmarx's IaC scanner. Its distinctive strengths vs sister scanners:
Docker is the primary install path per the KICS getting-started docs; there is no install script.
docker pull checkmarx/kics:latestFor a version-pinned binary install, see the Pinned versions + binary-install section in references/kics-policy.md.
# Scan a directory (Docker)
docker run -v "$PWD:/path" checkmarx/kics scan -p /path --output-path /path/results
# Or via binary
kics scan -p . --output-path ./kics-results
# Specific platform
kics scan -p . -t terraform,kubernetes# JSON
kics scan -p . --report-formats json --output-path results/
# SARIF (GitHub Code Scanning)
kics scan -p . --report-formats sarif --output-path results/
# JUnit XML
kics scan -p . --report-formats junit --output-path results/
# HTML (human-readable)
kics scan -p . --report-formats html --output-path results/
# Multiple
kics scan -p . --report-formats json,sarif,html --output-path results/# Fail only on HIGH+
kics scan -p . --fail-on high,critical
# Don't fail; just report
kics scan -p . --no-progress --silentIn code:
# main.tf
resource "aws_s3_bucket" "public_data" {
# kics-scan ignore-line
acl = "public-read"
bucket = "my-public-data"
}For block-level:
# kics-scan disable=15ffbacc-fa42-4f6f-a57d-2feac7365caa
resource "aws_s3_bucket" "public_logs" {
acl = "public-read"
bucket = "my-public-logs"
}The disable directive references the specific KICS query ID (visible in the output).
KICS queries are written in Rego (same as OPA). Point KICS at a query
directory with -q:
kics scan -p . -q ./custom-queries/For a full query template (package Cx + CxPolicy[result]), see
references/kics-policy.md.
jobs:
kics:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: checkmarx/kics-github-action@v2
with:
path: .
fail_on: high,critical
output_formats: sarif
output_path: kics-results.sarif
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: kics-results.sarifKICS's distinguishing feature: scan OpenAPI specs for security issues:
kics scan -p ./api-spec.yaml -t openapiCatches:
For most teams, this is the unique reason to use KICS alongside Checkov.
kics scan -p ./pulumi-project/ -t pulumi
kics scan -p ./crossplane-config/ -t crossplaneFor Pulumi shops, KICS provides scanning that Checkov / tfsec don't.
See the anti-patterns table in
references/kics-policy.md - covers KICS as
the only scanner, unjustified ignore-line, skipping --fail-on in CI,
full-output noise, and untested custom queries.
kics.io and github.com/Checkmarx/kics.checkov-policy,
tfsec-policy - sister scanners.policy-as-code-runner -
custom OPA / Rego.