Skip to content

Autopilot Security Hardening

Tại sao Autopilot có security posture mạnh hơn Standard

Trong Standard clusters, security là trách nhiệm của bạn: bạn phải enable Workload Identity, cấu hình PodSecurityStandards, drop Linux capabilities, và đảm bảo container không chạy với root privileges không cần thiết.

Autopilot approach khác: Google enforce một baseline security profile trên mọi workload, bởi vì Google đang quản lý node infrastructure. Nếu một workload compromise node, nó ảnh hưởng đến tất cả workloads khác trên node đó — và Google chịu trách nhiệm về điều này.

Điều này tạo ra một tension thú vị: security mạnh mẽ hơn, nhưng một số workloads hợp lệ (CNI plugins, monitoring agents, storage drivers) có thể bị block.

Pod Security Standards trong Autopilot

Autopilot enforce Pod Security Standards (PSS) ở tầng Baseline với một số restrictions bổ sung từ tầng Restricted:

Các restrictions mặc định

RestrictionTrạng tháiGhi chú
hostNetwork: true❌ BlockedKhông thể dùng host network namespace
hostPID: true❌ BlockedKhông thể dùng host PID namespace
hostIPC: true❌ BlockedKhông thể dùng host IPC namespace
privileged: true❌ Blocked (trừ allowlist)Privileged containers bị reject
allowPrivilegeEscalation: true❌ Blocked (mặc định)Ngăn privilege escalation
HostPath volumesGiới hạnChỉ read-only /var/log
seccompProfile✅ RuntimeDefault bắt buộcGoogle apply tự động

Seccomp và AppArmor

Seccomp: Autopilot tự động áp dụng RuntimeDefault seccomp profile cho mọi workload, ngay cả khi bạn không khai báo:

yaml
# Bạn không cần khai báo điều này — Autopilot tự apply
securityContext:
  seccompProfile:
    type: RuntimeDefault

RuntimeDefault profile block các syscalls nguy hiểm như ptrace, keyctl, add_key trong khi cho phép các syscalls bình thường mà container apps cần.

AppArmor: Container-Optimized OS tự động áp dụng AppArmor profiles cho containers trong Autopilot.

Running as root

Autopilot cho phép container chạy với user root (UID 0), không như Restricted PSS profile. Lý do: phần lớn Docker images được build mặc định với root user, và forcing non-root sẽ break quá nhiều workloads.

Tuy nhiên, Autopilot vẫn giới hạn những gì root có thể làm thông qua Linux capabilities restrictions.

Linux Capabilities

Đây là phần quan trọng nhất trong Autopilot security model.

Capabilities bị drop theo mặc định

Autopilot drop CAP_NET_RAWCAP_NET_ADMIN khỏi tất cả containers:

CAP_NET_RAW: Cho phép tạo raw IP packets, thực hiện ARP spoofing, IP spoofing. Đây là capability nguy hiểm và ít workloads thực sự cần. Nó được drop để ngăn containers tấn công network của các Pods khác trên cùng node.

CAP_NET_ADMIN: Cho phép cấu hình network interfaces, iptables rules, routing tables. Cần thiết cho CNI plugins và một số network tools, nhưng nguy hiểm trong môi trường multi-tenant.

Re-enable capabilities có chọn lọc

CAP_NET_RAW: Có thể re-enable nếu workload thực sự cần (ví dụ: ping, raw socket apps):

yaml
spec:
  containers:
  - name: app
    securityContext:
      capabilities:
        add:
        - NET_RAW

CAP_NET_ADMIN: Chỉ available nếu cluster được tạo với flag đặc biệt:

bash
gcloud container clusters create CLUSTER_NAME \
  --enable-autopilot \
  --workload-policies=allow-net-admin \
  --region REGION

Sau khi cluster được tạo với flag này, workloads có thể request NET_ADMIN:

yaml
spec:
  containers:
  - name: app
    securityContext:
      capabilities:
        add:
        - NET_ADMIN

Lưu ý: Flag --workload-policies=allow-net-admin không thể thêm vào cluster đã tạo. Bạn phải quyết định khi tạo cluster.

Capabilities được phép

Các capabilities sau được phép trong Autopilot và không cần khai báo thêm:

  • SETPCAP, CHOWN, SETUID, SETGID
  • NET_BIND_SERVICE (bind ports < 1024)
  • DAC_OVERRIDE (bypass file permission checks)
  • FOWNER, FSETID
  • KILL, MKNOD

Privileged containers và allowlist

Privileged containers (privileged: true) bị block theo mặc định vì chúng có access toàn bộ kernel capability và có thể escape container boundaries.

Partner workloads được phép

Google duy trì một allowlist cho các workloads từ partner vendors được phép chạy với elevated privileges trong Autopilot. Các workload trong allowlist thường là:

  • Security agents (Falco, Sysdig, Aqua Security)
  • CNI plugins được Google verified
  • Storage drivers (Portworx, StorageOS với configurations cụ thể)
  • Logging agents từ một số vendors

Để kiểm tra workload của mình có được phép không:

bash
# Thử apply manifest và xem error message
kubectl apply -f your-privileged-workload.yaml

# Error sẽ chỉ rõ nếu workload bị block hoặc được permit

Nếu bạn cần chạy workload privileged không có trong allowlist, phải dùng Standard cluster thay vì Autopilot.

Xem danh sách workload được phép

Google không publish danh sách đầy đủ các allowed privileged workloads, nhưng bạn có thể kiểm tra:

bash
kubectl get configmap gke-autopilot-privileged-workloads -n kube-system -o yaml

Org Policy constraints cho Autopilot

Organization Policy cho phép bạn kiểm soát behavior Autopilot ở cấp tổ chức hoặc project, không chỉ ở cấp cluster.

Restrict privileged workloads

Mặc dù Autopilot đã giới hạn privileged containers, bạn có thể thêm lớp protection thông qua Org Policy để prevent users từ việc cố tình bypass:

bash
# Enforce constraint: không cho phép cluster Autopilot với NET_ADMIN policy
gcloud resource-manager org-policies set-policy \
  --organization=ORG_ID \
  policy.yaml
yaml
# policy.yaml
name: organizations/ORG_ID/policies/container.restrictAutopilotWorkloadPolicies
spec:
  rules:
  - denyAll: true

Constraint container.restrictAutopilotWorkloadPolicies ngăn tạo Autopilot clusters với --workload-policies=allow-net-admin.

Enforce Autopilot over Standard

Nếu muốn buộc mọi GKE cluster trong org phải dùng Autopilot (vì security baseline tốt hơn):

yaml
name: organizations/ORG_ID/policies/container.restrictClusterCreation
spec:
  rules:
  - condition:
      expression: "resource.type == 'container.googleapis.com/Cluster' && !resource.data.autopilot.enabled"
    deny: {}

Network security thêm

Autopilot cũng tự động áp dụng một số network security restrictions:

  • External IPs on Services bị giới hạn: Autopilot thực hiện workaround cho CVE-2020-8554 (External IPs Service attack) bằng cách validate Service configurations
  • Mutating webhooks trong managed namespaces: Không được phép modify Pods trong kube-system và các managed namespaces khác

Tác động đến các tools phổ biến

Istio / Anthos Service Mesh

Istio sidecar injection yêu cầu NET_ADMIN để cấu hình iptables rules cho traffic interception. Trong Autopilot:

  • Anthos Service Mesh (managed Istio) hoạt động — Google verified
  • Self-managed Istio cần cluster được tạo với --workload-policies=allow-net-admin
  • Sidecar injection method thay đổi trong Autopilot để không dùng iptables

Falco (security monitoring)

Falco cần kernel module hoặc eBPF probe để monitor syscalls. Trong Autopilot:

  • Falco Helm chart chuẩn không hoạt động (cần privileged container)
  • Falco provider hoặc Google Cloud's Threat Detection là alternative
  • Một số security vendors có verified versions cho Autopilot

Datadog / Dynatrace / New Relic agents

Monitoring agents thường cần:

  • HostPath access để đọc container metrics
  • procfs access cho process monitoring
  • Network traffic inspection

Trong Autopilot, nhiều agent cần configuration đặc biệt. Check với vendor để biết Autopilot-specific deployment guide.

Logging agents tùy chỉnh

Nếu bạn cần deploy Fluentd hoặc logging agent tùy chỉnh thay vì Google's built-in logging:

yaml
# DaemonSet cho custom logging agent
spec:
  containers:
  - name: fluentd
    securityContext:
      # Chỉ cần read access đến /var/log
      readOnlyRootFilesystem: true
    volumeMounts:
    - name: varlog
      mountPath: /var/log
      readOnly: true
  volumes:
  - name: varlog
    hostPath:
      path: /var/log
      type: Directory

HostPath read-only /var/log được phép trong Autopilot cho trường hợp này.

SSH access và node debugging

Autopilot block SSH access vào nodes theo thiết kế. Điều này là tốt cho security nhưng tạo ra challenge khi debug:

bash
# Không thể: gcloud compute ssh node-name
# Có thể: debug thông qua ephemeral container
kubectl debug -it pod/POD_NAME --image=busybox --target=my-container

# Debug node (nếu được phép bởi policy):
kubectl debug node/NODE_NAME -it --image=ubuntu

Debug ephemeral containers trong Autopilot vẫn bị giới hạn bởi security restrictions — bạn không thể chạy container với elevated privileges trong namespace của Pod đang debug.

Security comparison với Standard

Security featureAutopilotStandard (không hardened)Standard (hardened)
Seccomp RuntimeDefault✅ Tự động❌ Manual✅ Nếu cấu hình
CAP_NET_RAW dropped✅ Mặc định✅ Nếu cấu hình
SSH disabled✅ Không thể❌ (SSH allowed)
Node auto-patching✅ Managed❌ Manual✅ Nếu bật
HostPath restricted✅ Read-only /var/log❌ Bất kỳ path✅ Nếu cấu hình PSS
Privileged containers❌ Chỉ allowlist✅ Full access❌ Nếu PSS Baseline
Workload Identity✅ Mặc định bật❌ Manual✅ Nếu bật

References