Skip to content

Module 8: Pod Security Context & Hardening Standards

🛡️ HPN Engineering Standard

"Secure by Design" Tại HPN, chúng ta không "vá" bảo mật sau khi deploy. Chúng ta xây dựng bảo mật ngay từ manifest đầu tiên.

1. The "Root" Evil (UID 0)

Theo mặc định, Container chạy với user root (UID 0). Đây là một lỗ hổng bảo mật nghiêm trọng. Nếu Hacker thoát được khỏi Container (Container Breakout), họ sẽ có quyền root trên chính Node (Server) của bạn.

The Bad Way

dockerfile
# Dockerfile mặc định
FROM ubuntu:latest
# Mặc định chạy as root
CMD ["/my-app"]

The HPN Standard (Non-Root)

Chúng ta bắt buộc mọi Pod phải chạy với runAsUser khác 0 (thường là 1000).

yaml
apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  securityContext:
    runAsUser: 1000  # UID 1000 standard
    runAsGroup: 3000
    fsGroup: 2000    # Quyền truy cập volume
  containers:
  - name: app
    image: my-secure-app:1.0

Dockerfile Base

Để điều này hoạt động, Dockerfile của bạn cũng phải hỗ trợ user này hoặc ít nhất không yêu cầu quyền ghi vào các thư mục hệ thống.


2. Immutable Infrastructure: Read-Only Filesystem

Nếu Hacker xâm nhập được vào ứng dụng (ví dụ qua log4shell), điều đầu tiên chúng làm là:

  1. Tải malware về (wget mal.sh).
  2. Sửa file cấu hình hệ thống (/etc/hosts, /usr/bin/).

Chúng ta chặn đứng điều này bằng cách biến filesystem thành Read-Only.

yaml
spec:
  containers:
  - name: app
    securityContext:
      readOnlyRootFilesystem: true # 🔒 Bất khả xâm phạm

Xử lý ghi file tạm (Logs, Cache)

Nếu App cần ghi file tạm, hãy mount một emptyDir volume vào /tmp. Hacker chỉ có thể ghi vào đó và sẽ mất hết khi Pod restart.

yaml
    volumeMounts:
    - name: tmp-volume
      mountPath: /tmp
  volumes:
  - name: tmp-volume
    emptyDir: {}

3. Prevent Privilege Escalation

Một process con có thể yêu cầu quyền cao hơn cha nó (giống lệnh sudo). Trong Container, chúng ta không bao giờ muốn điều này.

yaml
spec:
  containers:
  - name: app
    securityContext:
      allowPrivilegeEscalation: false # ⛔ Cấm leo thang đặc quyền

4. Linux Capabilities (Deep Hardening)

Linux chia quyền root thành nhiều mảnh nhỏ gọi là "Capabilities" (ví dụ: CAP_NET_ADMIN để chỉnh mạng, CAP_CHOWN để đổi chủ file). Docker mặc định cấp khoảng 14 capabilities. Hầu hết App web chỉ cần... 0.

Drop ALL Strategy

Quy tắc vàng: "Drop tất cả, chỉ thêm lại cái thực sự cần".

yaml
spec:
  containers:
  - name: app
    securityContext:
      capabilities:
        drop: ["ALL"] # 🛡️ Tước bỏ mọi quyền năng
        add: ["NET_BIND_SERVICE"] # (Optional) Chỉ thêm nếu cần bind port < 1024

5. The Golden Standard YAML

Đây là khuôn mẫu (Template) cho mọi Deployment tại HPN. Copy và áp dụng ngay.

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hpn-secure-app
spec:
  template:
    spec:
      # 1. Pod Level Security
      securityContext:
        runAsUser: 1000
        runAsGroup: 3000
        fsGroup: 2000
      
      containers:
      - name: main-app
        image: hpn-app:1.0.0
        
        # 2. Container Level Security
        securityContext:
          allowPrivilegeEscalation: false
          readOnlyRootFilesystem: true
          capabilities:
            drop: ["ALL"]
            
        # 3. Handle Immutable FS
        volumeMounts:
        - name: tmp-storage
          mountPath: /tmp
          
      volumes:
      - name: tmp-storage
        emptyDir: {}

Tổng kết Checklist

Trước khi ship ra Production, hãy tự hỏi:

  1. [ ] Pod có đang chạy root không? (Phải là KHÔNG)
  2. [ ] Hacker có ghi được file vào /bin hay /etc không? (Phải là KHÔNG)
  3. [ ] Process có thể chạy sudo hay leo thang quyền không? (Phải là KHÔNG)
  4. [ ] Process có những Capability thừa thãi không? (Drop ALL chưa?)

WARNING

Áp dụng Hardening có thể làm App bị crash nếu App đó được code cẩu thả (ví dụ: cố ghi log vào code folder). Hãy test kỹ trên Staging.