Security Analysis

KubeGraf scans your Kubernetes cluster for security vulnerabilities, misconfigurations, and best practice violations. Get actionable recommendations to harden your cluster.

Running a Security Scan

# Run full security analysis
kubegraf security

# Scan specific namespace
kubegraf security -n production

# Filter by minimum severity
kubegraf security --severity high

# Output as JSON for CI/CD
kubegraf security --output json

# Output as YAML
kubegraf security --output yaml

# Exit with error code if issues found (for CI)
kubegraf security --fail-on high

Severity Levels

LevelDescriptionAction
Critical Immediate security risk, potential for cluster compromise Fix immediately
High Significant security issue that should be addressed soon Fix within days
Medium Moderate risk, best practice violation Plan remediation
Low Minor issue or hardening recommendation Consider fixing

Security Checks

KubeGraf performs over 50 security checks across multiple categories:

Pod Security

Critical Privileged Containers

Detects containers running in privileged mode, which grants full host access.

Critical Host PID/Network/IPC

Identifies pods sharing the host's PID, network, or IPC namespace.

High Run as Root

Finds containers running as root user (UID 0).

High Writable Root Filesystem

Containers without readOnlyRootFilesystem set to true.

Medium Missing Security Context

Pods without explicit security context defined.

Medium Capability Additions

Containers with added Linux capabilities beyond defaults.

RBAC & Access Control

Critical Cluster Admin Bindings

Identifies excessive cluster-admin role bindings.

High Wildcard Permissions

Roles with wildcard (*) permissions on resources or verbs.

High Secrets Access

ServiceAccounts with broad access to secrets.

Medium Default ServiceAccount

Pods using the default service account with auto-mounted token.

Network Security

High Missing Network Policies

Namespaces without any NetworkPolicy defined.

Medium Exposed Services

Services of type LoadBalancer or NodePort exposing sensitive ports.

Medium Ingress Without TLS

Ingress resources not configured with TLS.

Resource Configuration

High Secrets in Environment Variables

Secrets exposed as plain environment variables instead of mounted files.

Medium Missing Resource Limits

Containers without CPU/memory limits defined.

Medium Latest Image Tag

Containers using :latest or no tag, making versions unpredictable.

Low Missing Liveness/Readiness Probes

Containers without health probes configured.

Web Dashboard View

The security dashboard provides:

CI/CD Integration

Integrate security scanning into your pipeline:

# GitHub Actions example
- name: Security Scan
  run: |
    kubegraf security --output json > security-report.json
    kubegraf security --fail-on critical

# GitLab CI example
security_scan:
  script:
    - kubegraf security --severity medium --fail-on high
  artifacts:
    reports:
      junit: security-report.xml

Exit Codes

CodeMeaning
0No issues found (or below threshold)
1Issues found meeting --fail-on criteria
2Error running scan

Suppressing Findings

Suppress known issues or false positives:

# Suppress via annotation on resource
metadata:
  annotations:
    kubegraf.io/ignore: "privileged-container,run-as-root"

# Suppress globally in config
security:
  ignore:
    - check: privileged-container
      resource: kube-system/*
      reason: "System components require privileges"
    - check: latest-tag
      resource: default/dev-*
      reason: "Development environment"

Warning: Only suppress findings after careful review. Document the reason for each suppression.

Custom Policies

Define custom security policies using Rego (Open Policy Agent):

# ~/.config/kubegraf/policies/custom.rego
package kubegraf.custom

deny[msg] {
  input.kind == "Deployment"
  not input.spec.template.spec.containers[_].resources.limits.memory
  msg := sprintf("Deployment %s missing memory limit", [input.metadata.name])
}

deny[msg] {
  input.kind == "Pod"
  input.spec.containers[_].image
  not contains(input.spec.containers[_].image, "myregistry.io")
  msg := "Images must be from myregistry.io"
}
# Run with custom policies
kubegraf security --policy-dir ~/.config/kubegraf/policies

Configuration

# config.yaml
security:
  # Default severity threshold for display
  minSeverity: "low"
  # Checks to skip
  skipChecks:
    - "missing-probes"
  # Custom policy directory
  policyDir: "~/.config/kubegraf/policies"
  # Ignore rules
  ignore: []