Mục Lục
- Giới thiệu
- Security Context là gì?
- Các trường của Security Context
- Security Context cấp Pod và Container
- Ví dụ thực tiễn
- Ràng buộc Security Context
- Thực hành tốt nhất
- Khắc phục sự cố
- 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 containerrunAsGroup: Chỉ định ID nhóm chính cho các tiến trình containerrunAsNonRoot: Chỉ ra rằng container phải chạy dưới quyền người dùng không phải là rootfsGroup: Đị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ôngallowPrivilegeEscalation: Kiểm soát xem một tiến trình có thể tăng thêm quyền hay khôngreadOnlyRootFilesystem: 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 SELinuxappArmorProfile: Cấu hình hồ sơ AppArmorseccompProfile: 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
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
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
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
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
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
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
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
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:
- Privileged: Chính sách không hạn chế
- Baseline: Chính sách hạn chế tối thiểu
- 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
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
securityContext:
runAsNonRoot: true
runAsUser: 10001
2. Bỏ tất cả các khả năng theo mặc định
yaml
securityContext:
capabilities:
drop:
- ALL
3. Sử dụng hệ thống tệp gốc chỉ đọc
yaml
securityContext:
readOnlyRootFilesystem: true
4. Vô hiệu hóa tăng quyền
yaml
securityContext:
allowPrivilegeEscalation: false
5. Sử dụng hồ sơ Seccomp
yaml
securityContext:
seccompProfile:
type: RuntimeDefault
6. Đặt giới hạn tài nguyên
yaml
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
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
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
securityContext:
fsGroup: 2000
Các lệnh gỡ lỗi
bash
# 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
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
# 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