1. Giới Thiệu
Bảo mật là một mối quan tâm quan trọng đối với hầu hết các tổ chức và cá nhân quản lý Kubernetes clusters. Việc bảo vệ hệ thống khỏi các mối đe dọa tiềm ẩn, đảm bảo tính toàn vẹn và sẵn sàng của ứng dụng là yếu tố then chốt để duy trì hoạt động kinh doanh liên tục và tin cậy.
Trong Kubernetes, có nhiều phương pháp và công cụ để quản lý và cải thiện bảo mật cluster. Bài viết này sẽ hướng dẫn bạn cách triển khai và quản lý các khía cạnh bảo mật của Kubernetes, bao gồm việc áp dụng các tiêu chuẩn bảo mật cho Pods ở cấp độ cluster và namespace, giới hạn quyền truy cập của container thông qua AppArmor, và hạn chế các syscalls của container bằng seccomp.
2. Áp Dụng Pod Security Standards tại Cấp Độ Cluster
Pod Security Standards (PSS) là một bộ các tiêu chuẩn bảo mật được thiết kế để giúp quản trị viên Kubernetes đảm bảo rằng tất cả các Pods trong cluster tuân thủ các chính sách bảo mật nhất định.
2.1. Hiểu Về Pod Security Standards
PSS cung cấp các cấp độ bảo mật khác nhau cho Pods:
- Privileged: Không giới hạn, Pods có thể thực hiện bất kỳ hành động nào trên host.
- Baseline: Các yêu cầu cơ bản để ngăn ngừa các mối đe dọa phổ biến.
- Restricted: Cấp độ bảo mật cao nhất, giới hạn tối đa quyền truy cập của Pods.
2.2. Cài Đặt Pod Security Standards tại Cấp Độ Cluster
Để áp dụng PSS tại cấp độ cluster, bạn có thể sử dụng PodSecurity admission controller, một tính năng tích hợp sẵn trong Kubernetes.
Bước 1: Kiểm Tra Tính Năng PodSecurity
Đảm bảo rằng tính năng PodSecurity đã được kích hoạt trong Kubernetes cluster của bạn. Kiểm tra bằng lệnh:
kubectl api-versions | grep policy
Bước 2: Tạo Policy PodSecurity
Tạo một PodSecurityPolicy để áp dụng các tiêu chuẩn bảo mật cho tất cả các Pods trong cluster.
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'secret'
- 'persistentVolumeClaim'
hostNetwork: false
hostIPC: false
hostPID: false
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'RunAsAny'
fsGroup:
rule: 'RunAsAny'
Bước 3: Áp Dụng PodSecurityPolicy vào Cluster
Sử dụng lệnh kubectl apply
để triển khai PodSecurityPolicy.
kubectl apply -f pod-security-policy.yaml
Bước 4: Tạo Role và RoleBinding cho PodSecurityPolicy
Tạo một Role để cho phép sử dụng PodSecurityPolicy và liên kết nó với các user hoặc service accounts thông qua RoleBinding.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: psp-user
rules:
- apiGroups: ["policy"]
resources: ["podsecuritypolicies"]
verbs: ["use"]
resourceNames: ["restricted"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: psp-user-binding
namespace: default
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: psp-user
apiGroup: rbac.authorization.k8s.io
Áp dụng các tài nguyên này:
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
3. Áp Dụng Pod Security Standards tại Cấp Độ Namespace
Áp dụng PSS tại cấp độ namespace giúp bạn kiểm soát bảo mật cho từng môi trường hoặc nhóm ứng dụng riêng biệt trong cùng một cluster.
3.1. Tạo Namespace với PodSecurity Standards
Sử dụng PodSecurity Standards khi tạo hoặc cập nhật namespace để áp dụng các chính sách bảo mật.
Ví dụ: Tạo Namespace với Cấp Độ Bảo Mật Baseline
apiVersion: v1
kind: Namespace
metadata:
name: secure-namespace
labels:
pod-security.kubernetes.io/enforce: "baseline"
pod-security.kubernetes.io/enforce-version: "latest"
Áp dụng namespace:
kubectl apply -f secure-namespace.yaml
3.2. Kiểm Tra Các Namespace Đã Áp Dụng PSS
Kiểm tra các namespace và các label liên quan đến PodSecurity:
kubectl get namespaces --show-labels
Kết quả:
NAME STATUS AGE LABELS
default Active 10m pod-security.kubernetes.io/enforce=baseline,pod-security.kubernetes.io/enforce-version=latest
secure-namespace Active 5m pod-security.kubernetes.io/enforce=baseline,pod-security.kubernetes.io/enforce-version=latest
3.3. Điều Chỉnh Chính Sách Bảo Mật cho Namespace
Bạn có thể thay đổi các label liên quan đến PodSecurity để áp dụng các cấp độ bảo mật khác nhau cho từng namespace.
Ví dụ: Thay Đổi Cấp Độ Bảo Mật của Namespace
kubectl label namespace secure-namespace pod-security.kubernetes.io/enforce=restricted --overwrite
4. Giới Hạn Quyền Truy Cập của Container với AppArmor
AppArmor là một module bảo mật cho Linux giúp giới hạn quyền truy cập của các ứng dụng bằng cách áp dụng các profile bảo mật.
4.1. Hiểu Về AppArmor trong Kubernetes
AppArmor giúp kiểm soát các hành động mà một container có thể thực hiện, giảm thiểu nguy cơ từ các lỗ hổng bảo mật trong ứng dụng.
4.2. Tạo Profile AppArmor
Bước 1: Tạo File Profile AppArmor
Tạo một profile AppArmor, ví dụ my-apparmor-profile
, để giới hạn quyền truy cập của container.
profile my-apparmor-profile flags=(attach_disconnected) {
# Allow basic file access
/usr/bin/nginx mr,
/var/log/nginx/** rw,
# Deny everything else
deny /** mrwklx,
}
Bước 2: Tải và Kích Hoạt Profile AppArmor
sudo apparmor_parser -r -W /etc/apparmor.d/my-apparmor-profile
4.3. Áp Dụng AppArmor Profile vào Pod
Cập nhật Deployment để sử dụng AppArmor profile vừa tạo.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
annotations:
container.apparmor.security.beta.kubernetes.io/nginx: localhost/my-apparmor-profile
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
Áp dụng Deployment:
kubectl apply -f nginx-deployment.yaml
4.4. Kiểm Tra Áp Dụng AppArmor Profile
Kiểm tra Pods để đảm bảo rằng AppArmor profile đã được áp dụng.
kubectl describe pod <pod-name>
Tìm phần annotations để xác nhận profile.
5. Giới Hạn Các Syscalls của Container với seccomp
seccomp (secure computing mode) là một công cụ bảo mật cho phép bạn giới hạn các syscalls mà container có thể thực hiện, giảm thiểu nguy cơ từ các lỗ hổng bảo mật trong kernel hoặc ứng dụng.
5.1. Hiểu Về seccomp trong Kubernetes
seccomp giúp hạn chế các hành động mà container có thể thực hiện bằng cách chỉ cho phép một tập hợp các syscalls được định nghĩa trước.
5.2. Tạo Profile seccomp
Kubernetes hỗ trợ các profile seccomp như RuntimeDefault
và Unconfined
, hoặc bạn có thể tạo profile tùy chỉnh.
Ví dụ: Tạo Profile seccomp Tùy Chỉnh
Tạo file JSON my-seccomp-profile.json
:
{
"defaultAction": "SCMP_ACT_ERRNO",
"syscalls": [
{
"name": "clone",
"action": "SCMP_ACT_ALLOW"
},
{
"name": "execve",
"action": "SCMP_ACT_ALLOW"
},
{
"name": "read",
"action": "SCMP_ACT_ALLOW"
},
{
"name": "write",
"action": "SCMP_ACT_ALLOW"
}
]
}
Bước 1: Tạo ConfigMap cho seccomp Profile
apiVersion: v1
kind: ConfigMap
metadata:
name: my-seccomp-profile
namespace: default
data:
my-seccomp-profile.json: |
{
"defaultAction": "SCMP_ACT_ERRNO",
"syscalls": [
{
"name": "clone",
"action": "SCMP_ACT_ALLOW"
},
{
"name": "execve",
"action": "SCMP_ACT_ALLOW"
},
{
"name": "read",
"action": "SCMP_ACT_ALLOW"
},
{
"name": "write",
"action": "SCMP_ACT_ALLOW"
}
]
}
Áp dụng ConfigMap:
kubectl apply -f seccomp-configmap.yaml
5.3. Áp Dụng seccomp Profile vào Pod
Cập nhật Deployment để sử dụng seccomp profile tùy chỉnh.
apiVersion: apps/v1
kind: Deployment
metadata:
name: secure-nginx
spec:
replicas: 2
selector:
matchLabels:
app: secure-nginx
template:
metadata:
labels:
app: secure-nginx
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
securityContext:
seccompProfile:
type: Localhost
localhostProfile: my-seccomp-profile.json
volumes:
- name: seccomp-profile
configMap:
name: my-seccomp-profile
Bước 1: Áp Dụng Deployment
kubectl apply -f secure-nginx-deployment.yaml
5.4. Kiểm Tra Áp Dụng seccomp Profile
Kiểm tra Pods để đảm bảo rằng seccomp profile đã được áp dụng.
kubectl describe pod <pod-name>
Tìm phần seccompProfile
trong Security Context
.
6. Best Practices Trong Bảo Mật Kubernetes
6.1. Quản Lý ConfigMaps
- Tên Hợp Lý: Đặt tên ConfigMap rõ ràng và phản ánh mục đích sử dụng.
- Phiên Bản: Sử dụng các phiên bản hoặc suffix để quản lý các bản cập nhật của ConfigMap.
- Tách Biệt Cấu Hình: Tách biệt cấu hình cho các môi trường khác nhau (development, staging, production) để dễ dàng quản lý và cập nhật.
6.2. Bảo Mật Thông Tin Cấu Hình
- Secret Management: Không lưu trữ thông tin nhạy cảm trong ConfigMap. Sử dụng Secrets để quản lý các thông tin như mật khẩu, khóa API.
- Giới Hạn Quyền Truy Cập: Sử dụng RBAC để hạn chế quyền truy cập vào ConfigMap cho các người dùng và dịch vụ cụ thể.
6.3. Sử Dụng Sidecar Containers Hiệu Quả
- Tách Biệt Chức Năng: Đảm bảo rằng sidecar container chỉ thực hiện các chức năng phụ trợ, không làm tăng độ phức tạp của ứng dụng chính.
- Quản Lý Tài Nguyên: Đặt resource requests và limits cho sidecar containers để tránh ảnh hưởng đến container chính.
- Giám Sát Sidecar: Theo dõi và giám sát hoạt động của sidecar containers để đảm bảo chúng hoạt động ổn định.
7. Giám Sát và Quản Lý Bảo Mật
7.1. Sử Dụng Prometheus và Grafana
- Prometheus: Thu thập và lưu trữ các metrics về hiệu suất và trạng thái của ứng dụng và cluster.
- Grafana: Trực quan hóa dữ liệu từ Prometheus thông qua các dashboard tùy chỉnh, giúp bạn dễ dàng theo dõi và phân tích các chỉ số tài nguyên.
Ví dụ: Cài Đặt Prometheus và Grafana với Helm
helm install prometheus prometheus-community/prometheus
helm install grafana grafana/grafana
7.2. Theo Dõi Thay Đổi ConfigMaps
- Audit Logs: Sử dụng audit logs để theo dõi các thay đổi trong ConfigMaps và phát hiện các hoạt động bất thường.
- Version Control: Lưu trữ các file cấu hình ConfigMap trong hệ thống quản lý phiên bản như Git để dễ dàng theo dõi và khôi phục khi cần thiết.
8. Kết Luận
Bảo mật là một phần không thể thiếu trong việc quản lý và vận hành Kubernetes cluster. Bằng cách áp dụng Pod Security Standards tại cấp độ cluster và namespace, giới hạn quyền truy cập của container thông qua AppArmor, và hạn chế các syscalls của container bằng seccomp, bạn có thể đảm bảo rằng các ứng dụng trên Kubernetes được bảo vệ tốt khỏi các mối đe dọa tiềm ẩn.
Những Điểm Chính:
- Pod Security Standards: Đảm bảo các Pods tuân thủ các chính sách bảo mật nhất định.
- AppArmor và seccomp: Giới hạn quyền truy cập và hành động của container để tăng cường bảo mật.
- Best Practices: Áp dụng các phương pháp tốt nhất để quản lý và bảo vệ cấu hình ứng dụng.
- Giám Sát và Quản Lý: Sử dụng các công cụ giám sát để theo dõi và quản lý các khía cạnh bảo mật của cluster.
9. Tiếp Theo
- Deploy an App trên Kubernetes với Minikube: Hướng dẫn chi tiết cách triển khai và quản lý ứng dụng sử dụng Minikube.
- Expose Your App Publicly trên Kubernetes: Hướng dẫn cách sử dụng Service để expose ứng dụng ra ngoài cluster.
- Scale Your App trên Kubernetes: Hướng dẫn chi tiết cách scale ứng dụng sử dụng kubectl và Horizontal Pod Autoscaler.
- Update Your App trên Kubernetes: Hướng dẫn cách thực hiện Rolling Update cho ứng dụng sử dụng kubectl.
- Sử Dụng Helm để Quản Lý Các Ứng Dụng Kubernetes: Tìm hiểu cách sử dụng Helm charts để dễ dàng triển khai và quản lý các ứng dụng phức tạp.
10. Tài Nguyên Tham Khảo
- Kubernetes Documentation – PodSecurity
- Kubernetes Documentation – AppArmor
- Kubernetes Documentation – seccomp
- Kubernetes Documentation – ConfigMaps
- Kubernetes Documentation – Deployments
- Kubernetes Documentation – RBAC
- Prometheus Documentation
- Grafana Documentation
- Helm Documentation
- The Kubernetes Book
- Kubernetes Up & Running
- Open Policy Agent (OPA)
- Kubernetes Documentation – Secrets
- Kubernetes Documentation – Horizontal Pod Autoscaler
- AppArmor Documentation
- seccomp Documentation