Skip to main content

Minimize Admission Of Containers Sharing The Host IPC

More Info:

Sharing the host IPC namespace allows a container to access shared memory of other processes on the node. Enforce policies that restrict admission of hostIPC containers.

Risk Level

High

Address

Security

Compliance Standards

  • CIS OKE

Triage and Remediation

Remediation

Manual Steps
  1. List existing pods using hostIPC in all namespaces

    • Run on: any machine with kubectl access
    • Command:
      kubectl get pods -A -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,HOST_IPC:.spec.hostIPC' --no-headers | grep -w true || echo "No pods with hostIPC: true found"
    • Review which workloads currently require hostIPC: true, and document the business/technical justification for each.
  2. Inspect pod specs that use hostIPC to understand why it is needed

    • Run on: any machine with kubectl access
    • For each namespace with hostIPC: true pods:
      NAMESPACE=<namespace-name>
      kubectl get pods -n "$NAMESPACE" -o yaml | awk '/^ hostIPC: true/{show=1} show{print} /^status:/{show=0}'
    • Decide case-by-case whether the host IPC access is strictly required or can be removed/alternative design used.
  3. Review existing admission controls (e.g. Pod Security Standards / policies) per namespace

    • Run on: any machine with kubectl access
    • If using built-in Pod Security admission labels:
      kubectl get ns --show-labels
    • If using Gatekeeper/Kyverno or another policy engine, list policies and identify those that constrain spec.hostIPC:
      # Gatekeeper example
      kubectl get k8spsp* constraints.constraints.gatekeeper.sh -A 2>/dev/null || true
      kubectl get constraints.constraints.gatekeeper.sh -A 2>/dev/null || true

      # Kyverno example
      kubectl get clusterpolicy,policy -A 2>/dev/null || true
    • Determine which namespaces hosting user workloads currently lack any policy preventing hostIPC: true.
  4. Decide and design namespace-level policy to minimize hostIPC

    • For each user-workload namespace, decide:
      • Should hostIPC be completely forbidden?
      • Are there exceptional workloads that must be allowed, and how will they be identified (labels, dedicated namespace, etc.)?
    • Based on your admission controller (Pod Security, Gatekeeper, Kyverno, etc.), design or select a policy that:
      • Denies pods with spec.hostIPC: true in general user namespaces.
      • Optionally allows only explicitly approved workloads/namespaces.
  5. Apply or adjust the policy manifests for each user-workload namespace

    • Run on: any machine with kubectl access
    • Apply your chosen policy manifests using kubectl apply -f <file>.yaml (content depends on your chosen policy engine and your decision in step 4).
    • For namespaces that must permit hostIPC for specific workloads, document and implement a controlled exception mechanism (e.g., dedicated namespace with stricter access control).
  6. Re-verify that hostIPC usage is minimized and new admission is restricted

    • Run on: any machine with kubectl access
    • Confirm no unintended pods use hostIPC:
      kubectl get pods -A -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,HOST_IPC:.spec.hostIPC' --no-headers | grep -w true || echo "No pods with hostIPC: true found (except any intentional exceptions)"
    • Attempt (in a test namespace) to create a pod with hostIPC: true and confirm it is rejected by the policy, adjusting the policy if necessary.
Using kubectl

Using kubectl

Run all commands from any machine with kubectl access.

1. Discover current PodSecurity admission level per namespace

These labels indicate if baseline/restricted Pod Security is enforced, which can block hostIPC: true.

kubectl get ns --show-labels

Potential problem:

  • Namespaces that run user workloads and either:
    • Have no pod-security.kubernetes.io/* labels, or
    • Are labeled with privileged or have only warn/audit levels, not enforce, may allow hostIPC: true pods.

Focus on namespaces like default, app-specific namespaces, and any non-system namespaces.

2. List existing pods/containers using hostIPC

kubectl get pods -A -o jsonpath='{range .items[?(@.spec.hostIPC==true)]}{.metadata.namespace}{"\t"}{.metadata.name}{"\n"}{end}'

Any output indicates pods that are sharing the host IPC namespace and should be reviewed.

To inspect one of them:

kubectl get pod -n <namespace> <pod-name> -o yaml

Look for:

spec:
hostIPC: true

Problem indication:

  • Any workload pod (not a deliberately privileged/system tool) with hostIPC: true is a potential security concern.

3. Check workloads that could create hostIPC pods

Deployments:

kubectl get deploy -A
kubectl get deploy -A -o yaml | grep -n "hostIPC"

DaemonSets:

kubectl get daemonset -A
kubectl get daemonset -A -o yaml | grep -n "hostIPC"

StatefulSets:

kubectl get statefulset -A
kubectl get statefulset -A -o yaml | grep -n "hostIPC"

Problem indication:

  • Any controller spec containing hostIPC: true will continuously create pods with host IPC enabled unless changed.

4. Find admission policies that address hostIPC (if using Kyverno/OPA/Gatekeeper, etc.)

Kyverno ClusterPolicies:

kubectl get clusterpolicy | sed '1d' || echo "No Kyverno ClusterPolicies found"

If present, inspect for hostIPC rules:

kubectl get clusterpolicy -o yaml | grep -n "hostIPC"

Gatekeeper constraints (if installed):

kubectl get constrainttemplates || echo "No Gatekeeper ConstraintTemplates found"
kubectl get constraints --all-namespaces || echo "No Gatekeeper constraints found"
kubectl get constraints --all-namespaces -o yaml | grep -n "hostIPC"

Problem indication:

  • No admission policies referencing hostIPC in namespaces with user workloads means there is no explicit control preventing hostIPC: true pods.

5. Verification after any policy decisions

After you adjust labels/policies manually, verify again:

# 1) Confirm no new hostIPC pods exist
kubectl get pods -A -o jsonpath='{range .items[?(@.spec.hostIPC==true)]}{.metadata.namespace}{"\t"}{.metadata.name}{"\n"}{end}'

# 2) Confirm namespaces have intended PodSecurity labels
kubectl get ns --show-labels

# 3) Confirm admission policies reference hostIPC as intended (if used)
kubectl get clusterpolicy -o yaml | grep -n "hostIPC" || true
kubectl get constraints --all-namespaces -o yaml | grep -n "hostIPC" || true

Any remaining hostIPC: true workloads should be individually reviewed to decide if they are truly necessary and appropriately isolated.

Automation
#!/usr/bin/env bash
# Report pods that share the host IPC namespace, cluster-wide.
# Run on: any machine with kubectl access and current kube-context set.

set -euo pipefail

echo "=== Host IPC usage by pods (hostIPC: true) ==="
echo

# 1) List all pods with hostIPC: true, across all namespaces
kubectl get pods -A -o jsonpath='{range .items[?(@.spec.hostIPC==true)]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.spec.serviceAccountName}{"\n"}{end}' \
| sort \
| awk 'BEGIN { printf "%-30s %-40s %-30s\n", "NAMESPACE", "POD", "SERVICEACCOUNT";
print "------------------------------ ---------------------------------------- ------------------------------" }
{ printf "%-30s %-40s %-30s\n", $1, $2, $3 }'

echo
echo "=== Namespaces that contain pods with hostIPC: true ==="
kubectl get pods -A -o jsonpath='{range .items[?(@.spec.hostIPC==true)]}{.metadata.namespace}{"\n"}{end}' \
| sort -u

echo
echo "=== Detailed spec for each hostIPC pod (for review) ==="
for ns in $(kubectl get pods -A -o jsonpath='{range .items[?(@.spec.hostIPC==true)]}{.metadata.namespace}{"\n"}{end}' | sort -u); do
echo
echo "Namespace: ${ns}"
echo "-----------------------------"
# Show only the hostIPC=true field and basic identifiers to keep it readable
kubectl get pods -n "${ns}" \
-o jsonpath='{range .items[?(@.spec.hostIPC==true)]}POD: {.metadata.name} SA: {.spec.serviceAccountName} hostIPC: {.spec.hostIPC}{"\n"}{end}'
done

echo
echo "=== OPTIONAL: PodSecurity-related labels on each affected namespace ==="
echo "(These labels influence whether hostIPC is allowed under Pod Security Admission)"
echo
for ns in $(kubectl get pods -A -o jsonpath='{range .items[?(@.spec.hostIPC==true)]}{.metadata.namespace}{"\n"}{end}' | sort -u); do
echo "Namespace: ${ns}"
kubectl get ns "${ns}" --show-labels
echo
done

How to interpret the output

  • The first table lists all pods that currently have hostIPC: true.
    • Any entry here is a potential problem that must be explicitly justified as an exception.
  • The “Namespaces that contain pods with hostIPC: true” list shows where you must ensure admission policies (e.g., Pod Security, PSP replacements, or validating admission policies) are configured to control or forbid hostIPC.
  • The detailed spec section helps you review:
    • Which service accounts and applications are using host IPC.
    • Whether usage aligns with an approved exception.
  • The namespace labels section helps you see if Pod Security (or equivalent) is configured strongly enough; namespaces with permissive labels while also having hostIPC: true pods are higher-risk and should be reviewed closely.

This script only reports; you must decide case by case whether each hostIPC: true pod is acceptable and then adjust admission policies and workload manifests accordingly.