Running Kubernetes on Azure is already a solid choice in 2026. Azure Kubernetes Service (AKS) manages the control plane, Azure Container Registry (ACR) stores your images, and GitHub Actions drives your CI/CD pipeline. But what about security? This guide covers the most cost-effective open-source security tooling you can layer on top of that stack — without paying for expensive commercial platforms.
The Stack at a Glance
| Tool | Role | Cost |
|---|---|---|
| Trivy | Container and IaC vulnerability scanning | Free / Open Source |
| Falco | Runtime threat detection | Free / Open Source |
| Checkov | Infrastructure-as-Code policy checks | Free / Open Source |
| Kubescape | Kubernetes security posture management | Free / Open Source |
| Grafana | Observability and security dashboards | Free / Open Source |
| Dependabot | Dependency vulnerability alerts | Free (GitHub native) |
Every tool in this stack has a zero-dollar license for self-hosted use. You only pay for the AKS nodes and ACR storage you already need to run your workloads.
1. Trivy — Scan Before You Ship
Trivy is the de facto standard for container image scanning. It checks your images for OS-level CVEs, language package vulnerabilities, misconfigurations, and secrets — all in a single binary.
How to integrate with GitHub Actions and ACR:
Add a Trivy scan step immediately after building and pushing to ACR. If Trivy finds a critical or high CVE, the workflow fails and the deployment is blocked.
# .github/workflows/build-and-scan.yml
name: Build, Scan, and Push
on:
push:
branches: [main]
env:
ACR_REGISTRY: yourregistry.azurecr.io
IMAGE_NAME: your-app
jobs:
build-scan-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Azure Login
uses: azure/login@v2
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Login to ACR
run: az acr login --name yourregistry
- name: Build image
run: docker build -t $ACR_REGISTRY/$IMAGE_NAME:${{ github.sha }} .
- name: Scan image with Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: ${{ env.ACR_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
format: table
exit-code: "1"
severity: CRITICAL,HIGH
ignore-unfixed: true
- name: Push to ACR
run: docker push $ACR_REGISTRY/$IMAGE_NAME:${{ github.sha }}
Trivy only runs the push if the scan passes. Unfixed CVEs (where no patch exists yet) are ignored to avoid noise from unavoidable findings.
Cost note: Trivy is entirely free. The only cost is the GitHub Actions minutes used per run, which is negligible compared to alternatives like Snyk Container or Prisma Cloud.
2. Falco — Runtime Threat Detection on AKS
Trivy catches vulnerabilities before deployment. Falco catches threats after deployment — at runtime, inside your running pods.
Falco watches Linux system calls and fires alerts when behavior deviates from defined rules. Common detections include:
- A shell spawned inside a container
- Unexpected file writes to sensitive paths like
/etc/passwd - Network connections to suspicious destinations
- Privilege escalation attempts
Deploy Falco on AKS with Helm:
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco falcosecurity/falco \
--namespace falco \
--create-namespace \
--set driver.kind=ebpf \
--set falcosidekick.enabled=true \
--set falcosidekick.config.grafana.hostport=http://grafana.monitoring:3000 \
--set falcosidekick.config.grafana.apikey=$GRAFANA_API_KEY
Using the eBPF driver is recommended for AKS because it works without kernel module support and avoids node-level OS changes.
Falco Sidekick forwards alerts to Grafana (and optionally Slack, PagerDuty, or any webhook). This keeps your entire observability pipeline in one place.
Cost note: Falco is free. Falco Sidekick is free. You pay only for the AKS nodes running the DaemonSet — typically one pod per node.
3. Checkov — Shift-Left IaC Security
Checkov scans Terraform, Bicep, Kubernetes manifests, Helm charts, and Dockerfiles for security misconfigurations before any infrastructure is provisioned.
Common findings on AKS workloads:
- Containers running as root
- Missing resource limits
- Privileged containers
- Missing network policies
- Secrets stored in environment variables
GitHub Actions integration:
# .github/workflows/checkov.yml
name: Checkov IaC Scan
on:
pull_request:
paths:
- "infra/**"
- "k8s/**"
- "Dockerfile"
jobs:
checkov:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: .
framework: terraform,kubernetes,dockerfile
soft_fail: false
output_format: sarif
output_file_path: checkov-results.sarif
- name: Upload SARIF to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: checkov-results.sarif
Uploading the SARIF output sends Checkov findings directly into GitHub’s Security tab under Code Scanning. Your team sees IaC issues alongside code vulnerabilities — no separate dashboard required.
Cost note: Checkov is fully open source (Bridgecrew/Prisma Cloud owns it, but the CLI is free). The GitHub SARIF upload is free on public repos and included in GitHub Advanced Security for enterprises.
4. Kubescape — Kubernetes Security Posture Management
Once your cluster is running, Kubescape continuously evaluates your AKS configuration against security frameworks like NSA-CISA, MITRE ATT&CK, and the CIS Kubernetes Benchmark.
It answers: Is this cluster configured securely right now?
Install and run a baseline scan:
# Install Kubescape CLI
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
# Scan against NSA-CISA framework
kubescape scan framework nsa --format pretty-printer --output results.txt
# Scan against all frameworks
kubescape scan framework all --format html --output report.html
In-cluster operator for continuous monitoring:
helm repo add kubescape https://kubescape.github.io/helm-charts
helm repo update
helm install kubescape kubescape/kubescape-operator \
--namespace kubescape \
--create-namespace \
--set clusterName=$(kubectl config current-context)
The in-cluster operator runs scheduled scans and exposes metrics for Grafana, giving you a live security posture score without leaving your cluster.
In GitHub Actions — gate on posture score:
- name: Install Kubescape
run: curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
- name: Run Kubescape scan
run: |
kubescape scan framework nsa \
--fail-threshold 70 \
--format json \
--output kubescape-results.json
Setting --fail-threshold 70 blocks the pipeline if your cluster scores below 70% compliance — a practical floor for production workloads.
5. Grafana — Unified Security Observability
Grafana ties the entire stack together. Instead of checking five different dashboards, you get one pane of glass for:
- Falco alerts — runtime threats from Falco Sidekick
- Kubescape scores — compliance posture over time
- AKS metrics — node health, pod restarts, resource usage from Azure Monitor / Prometheus
- Trivy findings (via Trivy Operator) — image vulnerability summaries in-cluster
Deploy the Grafana + Prometheus stack on AKS:
helm repo add grafana https://grafana.github.io/helm-charts
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Deploy kube-prometheus-stack (includes Prometheus + Grafana)
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace \
--set grafana.adminPassword=your-secure-password \
--set grafana.persistence.enabled=true \
--set grafana.persistence.size=10Gi
Add Falco dashboard:
In Grafana, import dashboard ID 11914 — the official Falco Sidekick dashboard. It shows alert severity, rule names, and container context in real time.
Trivy Operator metrics in Grafana:
helm install trivy-operator aquasecurity/trivy-operator \
--namespace trivy-system \
--create-namespace \
--set serviceMonitor.enabled=true
With serviceMonitor.enabled=true, Prometheus scrapes Trivy Operator metrics automatically. Import Grafana dashboard 17813 for the Trivy vulnerability overview.
Cost note: The entire monitoring stack is free. You pay for AKS node compute and Azure Disk (Persistent Volume) storage — typically a few dollars per month for a 10Gi Grafana volume.
6. Dependabot — Automated Dependency Updates
Dependabot is GitHub-native and free. It watches your package.json, pom.xml, requirements.txt, go.mod, Dockerfile base images, and GitHub Actions workflow dependencies for known vulnerabilities and outdated versions.
Enable Dependabot in .github/dependabot.yml:
version: 2
updates:
# Application dependencies
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10
# Dockerfile base image
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
# GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
# Helm chart dependencies (if using a chart)
- package-ecosystem: "pip"
directory: "/scripts"
schedule:
interval: "weekly"
Dependabot opens pull requests automatically. Combined with Trivy in CI, every Dependabot PR gets scanned before merge — giving you both automated dependency updates and automated vulnerability validation in the same workflow.
Putting It All Together — Full Pipeline Flow
Developer pushes code
│
▼
GitHub Actions CI starts
│
├── Checkov scans IaC + Dockerfile ──► GitHub Security tab
│
├── docker build
│
├── Trivy scans built image ──────────► Fail if CRITICAL/HIGH
│
├── docker push to ACR (if scan passes)
│
└── kubectl apply / Helm upgrade to AKS
│
▼
AKS cluster (running)
│
├── Falco DaemonSet ──────────► Runtime alerts → Grafana
│
├── Trivy Operator ──────────► Continuous image scanning → Grafana
│
├── Kubescape Operator ──────► Posture score → Grafana
│
└── Grafana ─────────────────► Unified security dashboard
Dependabot (async, weekly)
│
└── Opens PRs for outdated deps ──► CI runs Trivy on updated images
Cost Summary
| Component | Monthly Cost (Estimate) |
|---|---|
| AKS control plane | Free (Microsoft covers it) |
| AKS worker nodes (2x Standard_B2s) | ~$70/month |
| ACR Basic tier | ~$5/month |
| GitHub Actions (private repo) | ~$0–$10/month (2,000 free minutes) |
| Grafana + Prometheus PV storage | ~$2/month |
| Trivy, Falco, Checkov, Kubescape, Dependabot | $0 |
| Total security tooling cost | $0 |
The entire security platform adds zero dollars to your bill. The only costs are the infrastructure you were already paying for.
Final Thoughts
The 2026 Kubernetes security landscape no longer requires expensive commercial platforms to achieve meaningful protection. This stack gives you:
- Pre-deployment scanning with Trivy and Checkov — catching issues before they reach production
- Runtime protection with Falco — detecting threats in live workloads
- Posture management with Kubescape — continuous compliance against industry frameworks
- Unified observability with Grafana — one dashboard for everything
- Automated dependency hygiene with Dependabot — vulnerabilities caught before they accumulate
All of it integrates natively with AKS, ACR, and GitHub Actions. None of it requires a vendor contract.
Start with Trivy in CI — it’s a single action step and immediately blocks vulnerable images. Add Dependabot on day one since it’s a YAML file. Once those are running, layer in Checkov, Falco, and Kubescape as your team matures. Wire everything to Grafana last for the full picture.
Security doesn’t have to be expensive. It has to be consistent.