Configures tfsec for Terraform-specific security scanning - covers AWS / Azure / GCP / Kubernetes / OpenStack / Oracle / DigitalOcean / CloudStack, custom YAML rules, and SARIF / JUnit / Markdown output. Note: tfsec is transitioning to Trivy per Aqua Security, so new projects evaluate that first. Use for an existing Terraform-only tfsec stack; for the consolidated forward-path scanner use trivy-config, for the broadest multi-framework checks use checkov-policy, and for wider platform breadth use kics-policy.
75
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Medium
Suggest reviewing before use
Per tfsec-home, tfsec is transitioning to Trivy, Aqua Security's consolidated scanner. For new projects, evaluate Trivy first; tfsec remains stable for existing usage.
tfsec . against the Terraform tree, starting at
--minimum-severity HIGH to keep the signal high (Step 2).tfsec:ignore: comments (Step 4).tfsec . --minimum-severity HIGH after
remediation and assert it reports no HIGH findings before
merging; if any remain, fix or justify-ignore them and re-run.# macOS
brew install tfsec
# Linux
curl -L https://github.com/aquasecurity/tfsec/releases/latest/download/tfsec-linux-amd64 \
-o /usr/local/bin/tfsec
chmod +x /usr/local/bin/tfsec# Scan current directory
tfsec .
# Scan specific path
tfsec ./terraform/
# Concise output
tfsec . --concise-output
# Specific severity threshold
tfsec . --minimum-severity HIGHPer tfsec-home: "JSON and SARIF output capabilities for integration with external tools and workflows."
# JSON
tfsec . -f json > tfsec.json
# SARIF (GitHub Code Scanning)
tfsec . -f sarif -O tfsec.sarif
# JUnit XML
tfsec . -f junit -O tfsec.xml
# Markdown (PR comments)
tfsec . -f markdown# Skip specific checks
tfsec . -e aws-s3-enable-bucket-encryption,aws-s3-enable-versioning
# Skip everything matching a pattern
tfsec . -e aws-s3-*Inline:
# main.tf
resource "aws_s3_bucket" "public_data" {
# tfsec:ignore:aws-s3-enable-bucket-encryption Public dataset, not encrypted by design
# tfsec:ignore:aws-s3-enable-bucket-logging Public CDN, no audit logging needed
bucket = "my-public-data"
acl = "public-read"
}Author custom YAML rules for team-specific policy the built-in set misses: references/custom-rules-and-ci.md.
Run the official tfsec action with SARIF upload to GitHub Code Scanning: references/custom-rules-and-ci.md.
Per tfsec-home, tfsec covers AWS (S3, EC2, RDS, IAM, Lambda, API Gateway, and 30+ services), Azure (App Service, Storage, Database, Container, Key Vault), Google Cloud (Compute, GKE, SQL, Storage, IAM, BigQuery), plus Kubernetes, OpenStack, Oracle, DigitalOcean, and CloudStack.
For unsupported clouds, fall back to OPA / Conftest with custom
Rego per policy-as-code-runner.
Per tfsec-home guidance:
# Install Trivy
brew install trivy # or apt-get / etc.
# Trivy includes tfsec's checks under `trivy config`
trivy config ./terraform/The migration is mostly mechanical - Trivy ingests the same .tf files; rule names may differ.
Multiple scanners catch overlapping but non-identical issues. tfsec is faster and Terraform-specific; Checkov is broader; KICS adds different rule classes.
tfsec . -f json > tfsec.json
checkov -d . -o json > checkov.json
kics scan -p . --report-formats json
# unify results across the three scannersA team runs tfsec on an AWS Terraform module while planning a Trivy migration.
brew install tfsec, then tfsec ./terraform/ --minimum-severity HIGH to focus on the worst findings first.aws-s3-enable-bucket-encryption) as HIGH.# tfsec:ignore:aws-s3-enable-bucket-encryption Public dataset, not encrypted by design inline.aquasecurity/tfsec-action@v1.0.3 with format: sarif;
the SARIF upload posts remaining findings to the Security tab.trivy config ./terraform/ and
confirm the same .tf files scan under Trivy.Result: HIGH-severity misconfigurations gate the build, intentional exceptions are documented inline, and the Trivy forward-path is validated before switching.
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| Starting new tfsec adoption in 2026+ without Trivy evaluation | Investing in deprecating path. | Evaluate Trivy first (Step 8). |
tfsec:ignore without justification comment | Skips invisible to reviewers; security debt. | Always include reason (Step 4 example). |
--minimum-severity LOW everywhere | Noise floods CI; team disables. | Start HIGH; ratchet down. |
| Custom rules without tests | Bugs in custom rules let bad config through. | Cross-reference with OPA-tested policies (Step 5 + Conftest). |
| Single-scanner approach | Tool-specific gaps. | Multiple scanners (Step 9). |
checkov-policy,
kics-policy - sister scanners.policy-as-code-runner -
custom OPA / Rego policies (for unsupported clouds or custom
rules).