0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Hướng Dẫn Toàn Diện về Security Context trong Kubernetes

Đăng vào 1 tháng trước

• 8 phút đọc

Mục Lục

  1. Giới thiệu
  2. Security Context là gì?
  3. Các trường của Security Context
  4. Security Context cấp Pod và Container
  5. Ví dụ thực tiễn
  6. Ràng buộc Security Context
  7. Thực hành tốt nhất
  8. Khắc phục sự cố
  9. Tài liệu tham khảo

Giới thiệu

Bảo mật là một khía cạnh quan trọng trong quản lý container, và Kubernetes cung cấp các cơ chế mạnh mẽ để thực thi các chính sách bảo mật ở cấp độ pod và container. Một trong những tính năng quan trọng nhất cho bảo mật container là Security Context, cho phép bạn định nghĩa các cài đặt quyền và kiểm soát truy cập cho pods và containers.

Bài viết này cung cấp cái nhìn tổng quan toàn diện về Security Context trong Kubernetes, bao gồm cả các khái niệm lý thuyết và triển khai thực tiễn dựa trên tài liệu chính thức của Kubernetes.

Security Context là gì?

Security Context định nghĩa các cài đặt quyền và kiểm soát truy cập cho một Pod hoặc Container. Nó bao gồm các cài đặt như:

  • ID người dùng (UID) và ID nhóm (GID) để chạy các tiến trình
  • Các khả năng của Linux
  • Các tùy chọn SELinux
  • Hồ sơ AppArmor
  • Hồ sơ Seccomp
  • Quyền truy cập hệ thống tệp
  • Kiểm soát tăng quyền

Security Context giúp thực thi nguyên tắc quyền tối thiểu bằng cách đảm bảo rằng các container chỉ chạy với các quyền tối thiểu cần thiết để hoạt động đúng.

Các trường của Security Context

Các trường Security Context chính

Dựa trên tài liệu chính thức của Kubernetes, dưới đây là các trường chính có trong một Security Context:

Cài đặt Người dùng và Nhóm

  • runAsUser: Chỉ định ID người dùng để chạy các tiến trình container
  • runAsGroup: Chỉ định ID nhóm chính cho các tiến trình container
  • runAsNonRoot: Chỉ ra rằng container phải chạy dưới quyền người dùng không phải là root
  • fsGroup: Định nghĩa ID nhóm hệ thống tệp cho quyền sở hữu volume

Kiểm soát Quyền

  • privileged: Xác định xem container có chạy ở chế độ privilegiated hay không
  • allowPrivilegeEscalation: Kiểm soát xem một tiến trình có thể tăng thêm quyền hay không
  • readOnlyRootFilesystem: Gắn hệ thống tệp gốc của container ở chế độ chỉ đọc

Các Mô-đun Bảo mật Linux

  • seLinuxOptions: Cài đặt ngữ cảnh bảo mật SELinux
  • appArmorProfile: Cấu hình hồ sơ AppArmor
  • seccompProfile: Cài đặt hồ sơ Seccomp

Khả năng

  • capabilities: Các khả năng của Linux để thêm hoặc bỏ bớt

Security Context cấp Pod và Container

Security Context có thể được chỉ định ở hai cấp độ:

Security Context cấp Pod

Áp dụng cho tất cả các container trong pod (trừ khi bị ghi đè ở cấp container):

yaml Copy
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  containers:
  - name: sec-ctx-demo
    image: busybox:1.28
    command: [ "sh", "-c", "sleep 1h" ]

Security Context cấp Container

Áp dụng cho các container cụ thể và ghi đè các cài đặt cấp pod:

yaml Copy
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-2
spec:
  containers:
  - name: sec-ctx-demo
    image: busybox:1.28
    command: [ "sh", "-c", "sleep 1h" ]
    securityContext:
      runAsUser: 2000
      allowPrivilegeEscalation: false

Ví dụ thực tiễn

Hãy cùng khám phá các cấu hình Security Context khác nhau với các ví dụ thực tiễn.

Ví dụ 1: Cấu hình Người dùng và Nhóm cơ bản

yaml Copy
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-1
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  containers:
  - name: sec-ctx-vol
    image: busybox:1.28
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}

Điều này thực hiện:

  • Chạy tiến trình container dưới ID người dùng 1000
  • Đặt ID nhóm chính thành 3000
  • Đặt nhóm hệ thống tệp thành 2000 (các volume sẽ thuộc sở hữu bởi nhóm này)

Ví dụ 2: Thực thi Người dùng Không phải Root

yaml Copy
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-2
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
  containers:
  - name: sec-ctx-demo
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true

Điều này thực hiện:

  • Đảm bảo container không thể chạy dưới quyền root
  • Ngăn chặn tăng quyền
  • Gắn hệ thống tệp gốc ở chế độ chỉ đọc

Ví dụ 3: Quản lý Các khả năng

yaml Copy
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-3
spec:
  containers:
  - name: sec-ctx-demo
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      capabilities:
        add: ["NET_ADMIN", "SYS_TIME"]
        drop: ["ALL"]

Điều này thực hiện:

  • Bỏ tất cả các khả năng mặc định
  • Chỉ thêm các khả năng NET_ADMIN và SYS_TIME

Ví dụ 4: Cấu hình SELinux

yaml Copy
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-4
spec:
  securityContext:
    seLinuxOptions:
      level: "s0:c123,c456"
  containers:
  - name: sec-ctx-demo
    image: gcr.io/google-samples/node-hello:1.0

Ví dụ 5: Hồ sơ Seccomp

yaml Copy
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-5
spec:
  securityContext:
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: sec-ctx-demo
    image: gcr.io/google-samples/node-hello:1.0

Ví dụ 6: Tăng cường Bảo mật Hoàn chỉnh

yaml Copy
apiVersion: v1
kind: Pod
metadata:
  name: hardened-pod
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 10001
    runAsGroup: 10001
    fsGroup: 10001
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: hardened-container
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop:
        - ALL
    resources:
      limits:
        memory: "128Mi"
        cpu: "100m"
      requests:
        memory: "64Mi"
        cpu: "50m"
    volumeMounts:
    - name: tmp-volume
      mountPath: /tmp
  volumes:
  - name: tmp-volume
    emptyDir: {}

Ràng buộc Security Context

Tiêu chuẩn Bảo mật Pod

Kubernetes cung cấp các Tiêu chuẩn Bảo mật Pod làm việc với Security Context:

  1. Privileged: Chính sách không hạn chế
  2. Baseline: Chính sách hạn chế tối thiểu
  3. Restricted: Chính sách hạn chế nặng nề

Ví dụ Chính sách Bảo mật Pod (Đã bị ngừng sử dụng để chuyển sang Tiêu chuẩn Bảo mật Pod)

yaml Copy
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'projected'
    - 'secret'
    - 'downwardAPI'
    - 'persistentVolumeClaim'
  runAsUser:
    rule: 'MustRunAsNonRoot'
  seLinux:
    rule: 'RunAsAny'
  fsGroup:
    rule: 'RunAsAny'

Thực hành tốt nhất

1. Luôn chạy dưới quyền không phải Root

yaml Copy
securityContext:
  runAsNonRoot: true
  runAsUser: 10001

2. Bỏ tất cả các khả năng theo mặc định

yaml Copy
securityContext:
  capabilities:
    drop:
    - ALL

3. Sử dụng hệ thống tệp gốc chỉ đọc

yaml Copy
securityContext:
  readOnlyRootFilesystem: true

4. Vô hiệu hóa tăng quyền

yaml Copy
securityContext:
  allowPrivilegeEscalation: false

5. Sử dụng hồ sơ Seccomp

yaml Copy
securityContext:
  seccompProfile:
    type: RuntimeDefault

6. Đặt giới hạn tài nguyên

yaml Copy
resources:
  limits:
    memory: "128Mi"
    cpu: "100m"
  requests:
    memory: "64Mi"
    cpu: "50m"

Khắc phục sự cố

Các vấn đề phổ biến và giải pháp

1. Lỗi bị từ chối quyền

Vấn đề: Container không khởi động được do vấn đề quyền
Giải pháp: Kiểm tra các cài đặt runAsUser, runAsGroup, và fsGroup

bash Copy
kubectl logs <pod-name>
kubectl describe pod <pod-name>

2. Vấn đề về khả năng

Vấn đề: Ứng dụng yêu cầu khả năng cụ thể
Giải pháp: Thêm các khả năng cần thiết trong khi bỏ bớt các khả năng không cần thiết

yaml Copy
securityContext:
  capabilities:
    add: ["NET_BIND_SERVICE"]
    drop: ["ALL"]

3. Vấn đề truy cập hệ thống tệp

Vấn đề: Không thể ghi vào các volume đã gắn
Giải pháp: Đặt fsGroup phù hợp

yaml Copy
securityContext:
  fsGroup: 2000

Các lệnh gỡ lỗi

bash Copy
# Kiểm tra ngữ cảnh bảo mật của pod
kubectl get pod <pod-name> -o yaml | grep -A 10 securityContext

# Thực thi vào pod để kiểm tra người dùng / nhóm
kubectl exec -it <pod-name> -- id

# Kiểm tra quyền truy cập tệp
kubectl exec -it <pod-name> -- ls -la /path/to/volume

Kiểm tra Security Context

Tạo một Pod thử nghiệm

bash Copy
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: security-test
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  containers:
  - name: test-container
    image: busybox:1.28
    command: ["sleep", "3600"]
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop:
        - ALL
EOF

Xác minh các cài đặt bảo mật

bash Copy
# Kiểm tra người dùng và nhóm
kubectl exec security-test -- id

#output
uid=1000 gid=3000 groups=2000,3000

# Thử tăng quyền (nên thất bại)
kubectl exec security-test -- su -

#output
su: must be suid to work properly
command terminated with exit code 1

# Kiểm tra khả năng
kubectl exec security-test -- cat /proc/1/status | grep Cap

#output
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000000000000000
CapAmb: 0000000000000000

Kết luận

Security Context là một thành phần cơ bản của bảo mật Kubernetes, cung cấp kiểm soát chi tiết về cách các pod và container hoạt động trong cụm của bạn. Bằng cách cấu hình Security Context một cách hợp lý, bạn có thể cải thiện độ an toàn của cụm và tuân thủ nguyên tắc quyền tối thiểu.

Những điểm chính: hãy bắt đầu với các cài đặt hạn chế, kiểm tra kỹ lưỡng và kết hợp Security Context với các biện pháp bảo mật khác của Kubernetes để bảo vệ toàn diện. Bảo mật là một quá trình liên tục - hãy thường xuyên xem xét và cập nhật các cấu hình của bạn khi ứng dụng và bối cảnh mối đe dọa của bạn phát triển.


Bài viết này dựa trên tài liệu chính thức của Kubernetes và các thực tiễn tốt nhất cho bảo mật container. Hãy luôn tham khảo tài liệu mới nhất của Kubernetes để có thông tin cập nhật nhất.

Tài liệu tham khảo

  • Tài liệu chính thức của Kubernetes - Cấu hình Security Context cho Pod hoặc Container
  • Tham chiếu API Kubernetes - SecurityContext
  • Tiêu chuẩn Bảo mật Pod
  • Các Khả năng của Linux
  • Seccomp
  • AppArmor
  • SELinux

Nội dung bài viết

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào