OCI OKE Should Minimize Containers Sharing the Host Network
More Info:
hostNetwork=true gives a pod direct access to node interfaces, bypassing NetworkPolicy and potentially exposing kubelet, kube-proxy, and other host services. Restrict this to system add-ons that genuinely require it.
Risk Level
High
Address
Compliance, Security
Compliance Standards
- CIS OKE
Triage and Remediation
- Remediation
Remediation
Using Console
To remediate “OCI OKE should minimize containers sharing the host network namespace” using the OCI Console, you need to:
- Identify workloads using
hostNetwork
- Sign in to the OCI Console.
- In the left menu, go to Developer Services → Containers & Artifacts → Kubernetes Clusters (OKE).
- Click your cluster.
- In the cluster detail page, click Workloads.
- For each Deployment / StatefulSet / DaemonSet / Pod:
- Open the workload.
- Click YAML (or Edit YAML / View YAML, depending on the console version).
- Look for:
spec:hostNetwork: true
- Also check container
portsforhostPortvalues (often appear with hostNetwork).
Any workload with hostNetwork: true is sharing the host network namespace.
- Edit workloads to stop using the host network
For each offending workload you found:
- In Workloads, click the workload (e.g., a Deployment).
- Click Edit YAML.
- In the pod spec, change or remove:
to either:spec:hostNetwork: trueor remove thespec:hostNetwork: false
hostNetworkline entirely (default isfalse). - If possible, also remove any
hostPortmappings under containers:containers:- name: <container-name>ports:- containerPort: 8080hostPort: 8080 # remove this if not strictly required - Click Save / Update to apply the changes.
- The Deployment/StatefulSet/DaemonSet will roll out new pods without
hostNetwork.
Repeat for all workloads using hostNetwork: true.
- (Optional but recommended) Enforce a policy to prevent future use
OKE does not yet provide a native “checkbox” to forbid hostNetwork, but you can enforce via Kubernetes policy tools (e.g., Gatekeeper/OPA) deployed to your cluster. From the OCI Console you:
- Go to your OKE cluster → Access Cluster → use the Cloud Shell or local
kubectl. - Deploy an admission policy that denies pods with
spec.hostNetwork: true.
Example Gatekeeper ConstraintTemplate and Constraint would enforce this at cluster level. (This is done via kubectl apply rather than GUI, but initiated from the Console via Cloud Shell.)
- Verify remediation
- In the Workloads view, re-open the YAML for each previously offending workload.
- Confirm:
hostNetworkis not present, or explicitly set tofalse.hostPortis removed where not necessary.
- Optionally, use:
- Cloud Guard (if enabled) → check your target/recipe to ensure the detector for host network sharing is now green/not triggering for the cluster.
This removes container sharing of the host network namespace for your OKE workloads via changes made through the OCI Console.
Using CLI
In OKE this setting is controlled in the Pod spec (hostNetwork: true), so the remediation is to update workloads so they no longer request the host network. OCI CLI is only for cluster/infra management, so you use it to get kubeconfig, then use kubectl against the cluster.
1. Get kubeconfig for the OKE cluster using OCI CLI
# Replace these with your values
COMPARTMENT_OCID="<compartment_ocid>"
CLUSTER_OCID="<cluster_ocid>"
KUBECONFIG_PATH="$HOME/.kube/config-oke"
oci ce cluster create-kubeconfig \
--cluster-id "$CLUSTER_OCID" \
--file "$KUBECONFIG_PATH" \
--region "<region-identifier>" \
--token-version 2.0.0 \
--kube-endpoint PUBLIC_ENDPOINT
export KUBECONFIG="$KUBECONFIG_PATH"
2. Find Pods using hostNetwork: true
kubectl get pods -A -o jsonpath='{range .items[?(@.spec.hostNetwork==true)]}{.metadata.namespace}{"\t"}{.metadata.name}{"\n"}{end}'
If you want to find the owning controllers (Deployments/DaemonSets/StatefulSets):
kubectl get pods -A -o json | jq -r '
.items[]
| select(.spec.hostNetwork == true)
| "\(.metadata.namespace)\t\(.metadata.name)\t\(.metadata.ownerReferences[0].kind)\t\(.metadata.ownerReferences[0].name)"'
3. Update the owning resources to stop using host networking
For each Deployment/DaemonSet/StatefulSet that uses hostNetwork: true, remove or set it to false.
Example – patch a Deployment:
NAMESPACE="<ns>"
DEPLOYMENT_NAME="<deploy-name>"
kubectl -n "$NAMESPACE" patch deployment "$DEPLOYMENT_NAME" \
--type='json' \
-p='[
{"op":"remove","path":"/spec/template/spec/hostNetwork"}
]'
If the field must exist and be explicit:
kubectl -n "$NAMESPACE" patch deployment "$DEPLOYMENT_NAME" \
--type='merge' \
-p='{"spec":{"template":{"spec":{"hostNetwork":false}}}}'
Repeat similarly for DaemonSets/StatefulSets, changing the resource kind:
kubectl -n "$NAMESPACE" patch daemonset "$DAEMONSET_NAME" ...
kubectl -n "$NAMESPACE" patch statefulset "$STS_NAME" ...
Note: If containers were binding to host ports (hostPort), you must reconfigure them to use ClusterIP/NodePort/LoadBalancer Services instead.
4. (Optional) Enforce policy so new Pods can’t use hostNetwork
You can use Admission Control / Pod Security Standards (if enabled in your OKE version) or a policy engine like Gatekeeper. A simple starting point is to apply a PodSecurity admission config or a Gatekeeper constraint that denies Pods with spec.hostNetwork: true. That’s done with kubectl apply -f <policy.yaml> after preparing the policy YAML; OCI CLI itself does not control that per‑Pod setting.
Using Python
In OKE this is a standard Kubernetes setting: containers use the host network when the Pod spec has hostNetwork: true. To “minimize” it, you must:
- Find workloads using
hostNetwork: true. - Update their specs to
hostNetwork: false(or remove the field). - Optionally enforce a policy so it can’t be reintroduced.
Below is how to do this programmatically in Python using the Kubernetes Python client against your OKE cluster.
1. Prerequisites
pip install kubernetes
Make sure your kubeconfig for the OKE cluster is set (e.g. created via OCI CLI) and that kubectl get pods works.
2. Python: Detect Pods Using hostNetwork: true
This script lists all pods in all namespaces that have hostNetwork enabled:
from kubernetes import client, config
def main():
# Load kubeconfig (for OKE cluster)
config.load_kube_config() # or config.load_incluster_config() if running inside cluster
v1 = client.CoreV1Api()
pods = v1.list_pod_for_all_namespaces(watch=False)
print("Pods using hostNetwork:")
for pod in pods.items:
if pod.spec.host_network:
print(f"{pod.metadata.namespace}/{pod.metadata.name}")
if __name__ == "__main__":
main()
3. Python: Identify Higher-Level Controllers Using hostNetwork
Usually you don’t patch pods directly; you patch Deployments/DaemonSets/StatefulSets/Jobs that create them.
Example to scan Deployments and DaemonSets:
from kubernetes import client, config
def main():
config.load_kube_config()
apps_v1 = client.AppsV1Api()
print("Deployments using hostNetwork:")
deps = apps_v1.list_deployment_for_all_namespaces()
for d in deps.items:
if d.spec.template.spec.host_network:
print(f"Deployment: {d.metadata.namespace}/{d.metadata.name}")
print("\nDaemonSets using hostNetwork:")
dss = apps_v1.list_daemon_set_for_all_namespaces()
for ds in dss.items:
if ds.spec.template.spec.host_network:
print(f"DaemonSet: {ds.metadata.namespace}/{ds.metadata.name}")
if __name__ == "__main__":
main()
4. Python: Patch Workloads to Disable hostNetwork
This will set hostNetwork: false for Deployments and DaemonSets that currently use it.
from kubernetes import client, config
def disable_host_network_deployments():
config.load_kube_config()
apps_v1 = client.AppsV1Api()
deps = apps_v1.list_deployment_for_all_namespaces()
for d in deps.items:
if d.spec.template.spec.host_network:
ns = d.metadata.namespace
name = d.metadata.name
print(f"Patching Deployment {ns}/{name}: hostNetwork -> false")
patch_body = {
"spec": {
"template": {
"spec": {
"hostNetwork": False
}
}
}
}
apps_v1.patch_namespaced_deployment(
name=name,
namespace=ns,
body=patch_body
)
def disable_host_network_daemonsets():
config.load_kube_config()
apps_v1 = client.AppsV1Api()
dss = apps_v1.list_daemon_set_for_all_namespaces()
for ds in dss.items:
if ds.spec.template.spec.host_network:
ns = ds.metadata.namespace
name = ds.metadata.name
print(f"Patching DaemonSet {ns}/{name}: hostNetwork -> false")
patch_body = {
"spec": {
"template": {
"spec": {
"hostNetwork": False
}
}
}
}
apps_v1.patch_namespaced_daemon_set(
name=name,
namespace=ns,
body=patch_body
)
if __name__ == "__main__":
disable_host_network_deployments()
disable_host_network_daemonsets()
Notes:
- This will trigger rolling updates; pods will be recreated without host networking.
- Only run this on workloads where host networking is not required (e.g., not node-level agents).
5. Optional: Enforce No hostNetwork via Admission Control (Python + OPA Gatekeeper)
In OKE you can deploy OPA Gatekeeper or Kyverno. With Gatekeeper, you would:
- Install Gatekeeper in the OKE cluster.
- Apply a ConstraintTemplate that denies
hostNetwork: true. - Apply a Constraint that targets your namespaces.
The actual Gatekeeper policy is YAML, but you can apply it via Python:
from kubernetes import client, config
GATEKEEPER_TEMPLATE = """
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8snohostnetwork
spec:
crd:
spec:
names:
kind: K8sNoHostNetwork
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8snohostnetwork
violation[{"msg": msg}] {
input.review.kind.kind == "Pod"
input.review.object.spec.hostNetwork == true
msg := "hostNetwork must not be true"
}
"""
GATEKEEPER_CONSTRAINT = """
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sNoHostNetwork
metadata:
name: disallow-hostnetwork
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
namespaces:
- default
- your-app-namespace
"""
def apply_yaml(yaml_str):
from kubernetes.utils import create_from_yaml
config.load_kube_config()
k8s_client = client.ApiClient()
create_from_yaml(k8s_client, yaml_objects=[yaml_str])
if __name__ == "__main__":
apply_yaml(GATEKEEPER_TEMPLATE)
apply_yaml(GATEKEEPER_CONSTRAINT)
(Adjust namespaces and ensure Gatekeeper is already installed.)
Summary
- Use the Kubernetes Python client against your OKE cluster.
- Enumerate and patch any workloads whose Pod templates have
hostNetwork: true. - Optionally deploy an admission policy (Gatekeeper or Kyverno) to prevent future
hostNetworkusage.
Using Terraform
# This finding cannot be remediated on the OKE *cluster* Terraform resource itself.
# The `oci_containerengine_cluster` (or equivalent) resource has no argument that
# controls whether Pods use `hostNetwork`; that setting lives only in the Pod spec.
# To fix this with Terraform you must change the Kubernetes workload manifests
# (or Helm values) that Terraform applies, ensuring `hostNetwork` is not set or is false.
# Example for a Pod/Deployment managed via the Kubernetes provider:
resource "kubernetes_deployment_v1" "APP_DEPLOYMENT" {
metadata {
name = "APP_NAME" # substitute: your app name
namespace = "APP_NAMESPACE" # substitute: your namespace
}
spec {
replicas = 1
selector {
match_labels = {
app = "APP_NAME" # substitute: label matching the pod template
}
}
template {
metadata {
labels = {
app = "APP_NAME"
}
}
spec {
# Ensure hostNetwork is NOT true (omit it, or set explicitly to false)
host_network = false
container {
name = "APP_CONTAINER_NAME" # substitute: your container name
image = "APP_IMAGE" # substitute: your container image
}
}
}
}
}
The OCI OKE “cluster” resource cannot enforce hostNetwork usage; you must remediate by updating Kubernetes manifests (Deployments, DaemonSets, Pods, Helm charts) so spec.hostNetwork is not set to true, and then re-apply via Terraform. This change does not recreate the cluster, only the affected workloads. After changes, terraform plan should show updates to the specific Kubernetes workload resources where host_network is being changed.