Skip to main content

Ensure Only Trusted Container Images Are Used

More Info:

Use Binary Authorization to enforce that only signed, attested container images can be deployed to the cluster. This prevents running untrusted or unverified images.

Risk Level

Medium

Address

Security

Compliance Standards

  • CIS GKE

Triage and Remediation

Remediation

Manual Steps
  1. Identify current Binary Authorization status

    • On any machine with gcloud access:
      gcloud container clusters describe CLUSTER_NAME \
      --location LOCATION \
      --project PROJECT_ID \
      --format=json | jq '.binaryAuthorization'
    • Review whether enabled is true and what evaluationMode is set to (DISABLED, PROJECT_SINGLETON_POLICY_ENFORCE, or PROJECT_SINGLETON_POLICY_ALLOW_ALWAYS).
  2. Retrieve and review the current Binary Authorization policy

    • On any machine with gcloud access:
      gcloud container binauthz policy export --project PROJECT_ID > binauthz-policy.yaml
    • Open binauthz-policy.yaml and verify:
      • Required attestors are defined for relevant images/projects.
      • Any admissionWhitelistPatterns are strictly limited and justified.
      • The default rule enforces attestation for images that should be trusted only when signed.
  3. Compare policy against organizational requirements

    • With security and platform owners, confirm:
      • Which registries and image paths are allowed.
      • Which teams/signing keys/attestors must sign images.
      • Any exceptions (e.g., third‑party images) are explicitly listed and documented in the policy rather than broadly whitelisting entire registries.
  4. Update the Binary Authorization policy as needed

    • Edit binauthz-policy.yaml to:
      • Add/remove attestors and adjust admission rules so only properly signed images are allowed.
      • Tighten or remove unnecessary whitelist patterns.
    • Import the updated policy:
      gcloud container binauthz policy import binauthz-policy.yaml --project PROJECT_ID
  5. Enable or strengthen Binary Authorization on the cluster

    • Choose an appropriate evaluation mode (typically PROJECT_SINGLETON_POLICY_ENFORCE for full enforcement after testing):
      gcloud container clusters update CLUSTER_NAME \
      --location LOCATION \
      --project PROJECT_ID \
      --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE
    • For staged rollout, you may temporarily use PROJECT_SINGLETON_POLICY_ALLOW_ALWAYS to log decisions before enforcing.
  6. Verify configuration and perform a deployment test

    • Re‑check cluster configuration:
      gcloud container clusters describe CLUSTER_NAME \
      --location LOCATION \
      --project PROJECT_ID \
      --format=json | jq '.binaryAuthorization'
    • Attempt to deploy:
      • One unsigned image that should be blocked (confirm admission is denied).
      • One properly signed/attested image (confirm admission is allowed).
Using kubectl

kubectl cannot configure Binary Authorization or enforce trusted images because this control is managed at the GKE control-plane / cloud-provider level. To enable and configure Binary Authorization, make the changes via the Google Cloud console, gcloud CLI, or IaC as described in the Manual Steps section.

Automation
#!/usr/bin/env bash
#
# Report Binary Authorization status for all GKE clusters in a project.
# Requirements:
# - gcloud, jq
# - Authenticated with privileges to list and describe clusters & binauthz policy
#
# Usage:
# ./report-binauthz.sh <PROJECT_ID>
#

set -euo pipefail

PROJECT_ID="${1:-}"

if [[ -z "$PROJECT_ID" ]]; then
echo "Usage: $0 <PROJECT_ID>" >&2
exit 1
fi

echo "Project: $PROJECT_ID"
echo "Timestamp: $(date -Iseconds)"
echo "========================================"

# List all regions/zones that have clusters
LOCATIONS=$(gcloud container clusters list \
--project "${PROJECT_ID}" \
--format='value(location)' | sort -u)

if [[ -z "$LOCATIONS" ]]; then
echo "No clusters found in project ${PROJECT_ID}"
exit 0
fi

# Try to fetch the Binary Authorization policy once (may not exist)
echo
echo "=== Project-level Binary Authorization Policy ==="
if gcloud container binauthz policy export --project "${PROJECT_ID}" >/tmp/binauthz-policy.yaml 2>/dev/null; then
echo "Binary Authorization policy FOUND for project ${PROJECT_ID}"
echo "Policy summary:"
# Show only high-level fields; detailed review is manual
grep -E '^(defaultAdmissionRule|clusterAdmissionRules:|globalPolicyEvaluationMode:)' -n \
/tmp/binauthz-policy.yaml || true
else
echo "No Binary Authorization policy configured for project ${PROJECT_ID}"
fi
echo "========================================"
echo

# For each cluster, show Binary Authorization configuration
for LOCATION in ${LOCATIONS}; do
echo "=== LOCATION: ${LOCATION} ==="
CLUSTERS=$(gcloud container clusters list \
--project "${PROJECT_ID}" \
--location "${LOCATION}" \
--format='value(name)')

if [[ -z "$CLUSTERS" ]]; then
echo " No clusters in ${LOCATION}"
continue
fi

for CLUSTER in ${CLUSTERS}; do
echo
echo "Cluster: ${CLUSTER}"

# Describe the cluster's Binary Authorization block
DESC_JSON=$(gcloud container clusters describe "${CLUSTER}" \
--project "${PROJECT_ID}" \
--location "${LOCATION}" \
--format=json)

echo "${DESC_JSON}" | jq '.binaryAuthorization // {}'

# Simple classification to highlight potential issues
EVAL_MODE=$(echo "${DESC_JSON}" | jq -r '.binaryAuthorization.evaluationMode // "NOT_SET"')

case "${EVAL_MODE}" in
ENABLED|PROJECT_SINGLETON_POLICY_ENFORCE)
STATUS="ENFORCED"
;;
DISABLED)
STATUS="DISABLED"
;;
*)
STATUS="UNKNOWN_OR_NOT_SET"
;;
esac

echo " Evaluation mode: ${EVAL_MODE} => Status: ${STATUS}"

# Flag clusters without enforcement
if [[ "${STATUS}" != "ENFORCED" ]]; then
echo " WARNING: Binary Authorization is NOT enforced on this cluster."
fi
done

echo
done

echo "========================================"
echo "Review guidance:"
echo " - For each cluster, .binaryAuthorization.evaluationMode should indicate enforcement (e.g. ENABLED or PROJECT_SINGLETON_POLICY_ENFORCE)."
echo " - A problem is indicated when:"
echo " * .binaryAuthorization is null or empty, OR"
echo " * evaluationMode is DISABLED or NOT_SET, OR"
echo " * No project-level Binary Authorization policy exists."
echo " - Policy contents (attestors, rules, exceptions) must be reviewed manually against your trust requirements."

How to interpret output (what indicates a problem)

  • For a cluster, any of the following indicate a potential finding for “only trusted container images are used”:

    • .binaryAuthorization is {} or null.
    • evaluationMode is DISABLED, NOT_SET, or missing.
    • The script prints: WARNING: Binary Authorization is NOT enforced on this cluster.
  • At the project level:

    • If No Binary Authorization policy configured for project is shown, clusters cannot enforce a meaningful Binary Authorization policy and should be reviewed and fixed via the cloud console/CLI/IaC.