Bảo Mật trên Kubernetes

Bảo Mật trên Kubernetes

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ư RuntimeDefaultUnconfined, 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

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *