Bảo mật là một khía cạnh quan trọng khi chạy Kubernetes trong môi trường production. Khi việc áp dụng Kubernetes ngày càng phát triển, nó ngày càng trở thành mục tiêu hấp dẫn đối với những kẻ tấn công. Trong phần này, chúng ta sẽ khám phá các biện pháp bảo mật toàn diện để bảo vệ cụm, khối lượng công việc và dữ liệu của bạn.
Nguyên tắc bảo mật cơ bản trong Kubernetes
Bảo mật Kubernetes nên được tiếp cận từ nhiều góc độ:
- Bảo mật cụm: Bảo mật các nút và mặt phẳng điều khiển Kubernetes
- Bảo mật vùng chứa: Bảo mật container image và thời gian chạy
- Bảo mật ứng dụng: Bảo mật khối lượng công việc đang chạy trong cụm của bạn
- Bảo mật mạng: Kiểm soát lưu lượng trong và ngoài cụm
- Bảo mật dữ liệu: Bảo vệ thông tin nhạy cảm
Chúng ta hãy khám phá từng kích thước này.
Bảo mật cụm Kubernetes
Kiểm soát an ninh máy bay
Mặt phẳng điều khiển Kubernetes là một thành phần bảo mật quan trọng. Hãy bảo vệ nó bằng các biện pháp sau:
Sử dụng TLS cho tất cả các giao tiếp API:
apiVersion: v1 kind: Pod metadata: name: kube-apiserver spec: containers: - name: kube-apiserver command: - kube-apiserver - --secure-port=6443 - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key - --client-ca-file=/etc/kubernetes/pki/ca.crtEBộ điều khiển truy cập máy chủ API có thể bật:
apiVersion: v1 kind: Pod metadata: name: kube-apiserver spec: containers: - name: kube-apiserver command: - kube-apiserver - --enable-admission-plugins=NodeRestriction,PodSecurityPolicy,AlwaysPullImagesHạn chế quyền truy cập vào etcd:
- Sử dụng TLS cho client etcd và giao tiếp ngang hàng
- Tường lửa cổng etcd khỏi truy cập không cần thiết
- Chạy etcd trên các nút chuyên dụng khi có thể
Triển khai các chính sách mạng cho mặt phẳng điều khiển:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: control-plane-protection namespace: kube-system spec: podSelector: matchLabels: tier: control-plane policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 10.0.0.0/24 # Admin workstations ports: - protocol: TCP port: 6443 # API server
Bảo mật nút
Bảo vệ các nút công nhân của bạn bằng các phương pháp sau:
Luôn cập nhật các nút:
- Áp dụng các bản vá bảo mật kịp thời
- Sử dụng hệ điều hành tối thiểu, cứng cáp image
- Xem xét các mô hình cơ sở hạ tầng bất biến
Cấu hình kubelet an toàn:
# /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration authentication: anonymous: enabled: false webhook: enabled: true x509: clientCAFile: /etc/kubernetes/pki/ca.crt authorization: mode: Webhook readOnlyPort: 0 protectKernelDefaults: trueCách ly và phân đoạn nút:
- Sử dụng nhóm nút riêng biệt cho các loại khối lượng công việc khác nhau
- Cô lập các nút cho khối lượng công việc nhạy cảm
- Áp dụng nhãn và nhãn nút thích hợp
Xác thực và ủy quyền
Thực hiện kiểm soát truy cập thích hợp:
Sử dụng các phương thức xác thực mạnh:
- Chứng chỉ ứng dụng khách X.509
- OpenID Connect (OIDC) với nhà cung cấp danh tính
- Tài khoản dịch vụ cho các ứng dụng
Kiểm soát truy cập dựa trên vai trò (RBAC):
Xác định vai trò với các quyền cụ thể:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [''] resources: ['pods'] verbs: ['get', 'watch', 'list']Ràng buộc vai trò với người dùng hoặc nhóm:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: default subjects: - kind: User name: jane apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.ioTuân theo nguyên tắc đặc quyền tối thiểu:
- Cấp quyền tối thiểu cần thiết cho mỗi vai trò
- Thường xuyên kiểm tra và xem xét các quyền RBAC
- Sử dụng không gian tên để thực thi sự phân tách
Bảo mật container và image
Bảo mật image
Bảo mật container image của bạn:
Sử dụng hình ảnh cơ bản tối thiểu:
- Alpine Linux hoặc image không phân phối được
- Loại bỏ các gói và công cụ không cần thiết
Quét image để tìm lỗ hổng:
# Using Trivy trivy image nginx:1.21 # Or in CI/CD pipeline trivy image --exit-code 1 --severity HIGH,CRITICAL myapp:latestTriển khai đăng ký image an toàn:
- Sử dụng sổ đăng ký riêng
- Kích hoạt xác thực và ủy quyền
- Thực thi việc ký và xác minh image bằng Docker Content Trust hoặc Cosign:
# Sign an image with Cosign cosign sign --key cosign.key registry.example.com/myapp:latest # Verify an image cosign verify --key cosign.pub registry.example.com/myapp:latestTạo và thực thi các chính sách image:
# Using OPA Gatekeeper apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sAllowedRepos metadata: name: require-trusted-repos spec: match: kinds: - apiGroups: [''] kinds: ['Pod'] parameters: repos: - 'registry.example.com/' - 'docker.io/bitnami/'
Bảo mật thời gian chạy container
Bảo mật thời gian chạy container:
Sử dụng hệ điều hành được tối ưu hóa container:
- Hệ điều hành được tối ưu hóa container (Google)
- Tên lửa chai (AWS)
- RancherOS hoặc K3OS
Định cấu hình hồ sơ seccomp:
apiVersion: v1 kind: Pod metadata: name: secure-pod spec: securityContext: seccompProfile: type: Localhost localhostProfile: profiles/restricted.json containers: - name: app image: myapp:1.0Sử dụng hộp cát thời gian chạy container:
- gVisor
- Kata container
- pháo nổ
Triển khai giám sát bảo mật thời gian chạy:
- Falco để phát hiện mối đe dọa thời gian chạy
- Sysdig cho khả năng hiển thị container
- Aqua Security hoặc Twistlock để bảo vệ toàn diện
Bảo mật khối lượng công việc
Bảo mật pod
Áp dụng các biện pháp bảo mật cho pod của bạn:
Sử dụng pod Tiêu chuẩn bảo mật:
Kể từ Kubernetes 1.25, Tuyển sinh bảo mật pod cung cấp khả năng thực thi tích hợp các Tiêu chuẩn bảo mật pod, thay thế Chính sách bảo mật pod không còn được dùng nữa:
# Namespace-level enforcement apiVersion: v1 kind: Namespace metadata: name: secure-namespace labels: pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/warn: restricted pod-security.kubernetes.io/audit: restrictedĐịnh cấu hình bối cảnh bảo mật:
apiVersion: v1 kind: Pod metadata: name: secure-pod spec: securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 3000 fsGroup: 2000 seccompProfile: type: RuntimeDefault containers: - name: app image: myapp:1.0 securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL readOnlyRootFilesystem: trueGiới hạn khả năng của container:
- Bỏ tất cả các khả năng theo mặc định
- Chỉ thêm các khả năng cần thiết
Định cấu hình giới hạn tài nguyên:
resources: requests: memory: '64Mi' cpu: '250m' limits: memory: '128Mi' cpu: '500m'
Bảo mật tài khoản dịch vụ
Bảo mật tài khoản dịch vụ của bạn:
Vô hiệu hóa tính năng tự động gắn mã thông báo tài khoản dịch vụ:
apiVersion: v1 kind: ServiceAccount metadata: name: restricted-sa automountServiceAccountToken: falseTạo và sử dụng các tài khoản dịch vụ tối thiểu:
apiVersion: v1 kind: ServiceAccount metadata: name: app-sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: app-role rules: - apiGroups: [''] resources: ['configmaps'] verbs: ['get'] resourceNames: ['app-config'] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: app-rb subjects: - kind: ServiceAccount name: app-sa roleRef: kind: Role name: app-role apiGroup: rbac.authorization.k8s.ioSử dụng mã thông báo tài khoản dịch vụ dự kiến:
apiVersion: v1 kind: Pod metadata: name: token-projected-pod spec: containers: - name: app image: myapp:1.0 volumeMounts: - name: token mountPath: /var/run/secrets/tokens volumes: - name: token projected: sources: - serviceAccountToken: path: token expirationSeconds: 3600 audience: api
Quản lý bí mật
Quản lý đúng thông tin nhạy cảm:
Sử dụng hệ thống quản lý bí mật bên ngoài:
- HashiCorp Vault
- Trình quản lý bí mật AWS
- Người quản lý bí mật của Google
- Kho khóa Azure
Sử dụng toán tử bí mật bên ngoài:
apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: database-credentials spec: refreshInterval: '15m' secretStoreRef: name: vault-backend kind: SecretStore target: name: database-credentials data: - secretKey: username remoteRef: key: databases/mysql/credentials property: username - secretKey: password remoteRef: key: databases/mysql/credentials property: passwordEmã hóa dữ liệu vvD:
apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets providers: - aescbc: keys: - name: key1 secret: <base64-encoded-key> - identity: {}Sử dụng các bí mật được niêm phong cho quy trình công việc GitOps:
# Encrypt a secret kubectl create secret generic db-creds \ --from-literal=username=admin \ --from-literal=password=secretpassword \ --dry-run=client -o yaml | \ kubeseal --format yaml > sealed-db-creds.yaml
An ninh mạng
Chính sách mạng
Thực hiện phân đoạn mạng:
Chính sách từ chối mặc định:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all spec: podSelector: {} policyTypes: - Ingress - EgressCho phép giao tiếp cụ thể:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: api-allow spec: podSelector: matchLabels: app: api policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 8080 egress: - to: - podSelector: matchLabels: app: database ports: - protocol: TCP port: 5432Cách ly không gian tên:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: namespace-isolation namespace: production spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production
Vào an toàn
Bảo vệ truy cập bên ngoài:
Chấm dứt TLS:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: secure-ingress spec: tls: - hosts: - api.example.com secretName: api-tls rules: - host: api.example.com http: paths: - path: / pathType: Prefix backend: service: name: api-service port: number: 80Xác thực bằng Proxy OAuth2:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: oauth-ingress annotations: nginx.ingress.kubernetes.io/auth-url: 'https://$host/oauth2/auth' nginx.ingress.kubernetes.io/auth-signin: 'https://$host/oauth2/start' spec: # ...Tường lửa ứng dụng web (WAF):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: waf-protected-ingress annotations: nginx.ingress.kubernetes.io/enable-modsecurity: 'true' nginx.ingress.kubernetes.io/modsecurity-transaction-id: '$request_id' spec: # ...
Bảo mật lưới dịch vụ
Triển khai lưới dịch vụ để tăng cường bảo mật:
Istio với mTLS:
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: default namespace: istio-system spec: mtls: mode: STRICTChính sách xác thực và ủy quyền:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: frontend-to-backend namespace: default spec: selector: matchLabels: app: backend rules: - from: - source: principals: ['cluster.local/ns/default/sa/frontend-sa'] to: - operation: methods: ['GET'] paths: ['/api/v1/*']
Tuân thủ và kiểm toán
Ghi nhật ký kiểm tra
Kích hoạt và định cấu hình ghi nhật ký kiểm tra:
apiVersion: v1
kind: Pod
metadata:
name: kube-apiserver
spec:
containers:
- name: kube-apiserver
command:
- kube-apiserver
- --audit-log-path=/var/log/kubernetes/audit.log
- --audit-log-maxage=30
- --audit-log-maxbackup=10
- --audit-log-maxsize=100
- --audit-policy-file=/etc/kubernetes/audit-policy.yaml
Với chính sách như:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
# Log pod changes at RequestResponse level
- level: RequestResponse
resources:
- group: ''
resources: ['pods']
# Log configmaps and secrets at Metadata level
- level: Metadata
resources:
- group: ''
resources: ['secrets', 'configmaps']
# Log nothing else
- level: None
Quét bảo mật và đo điểm chuẩn
Thường xuyên quét cụm của bạn:
Điểm chuẩn Kubernetes CIS:
# Using kube-bench kubectl run kube-bench --image=aquasec/kube-bench:latestKubernetes Quản lý tư thế bảo mật (KSPM):
- Kubescape
- falco
- Đám mây Prisma
Quét cấu hình:
# Using Trivy for configuration scanning trivy config --severity HIGH,CRITICAL ./kubernetes/
Khung tuân thủ
Phù hợp với tiêu chuẩn ngành:
Bản đồ điều khiển theo tiêu chuẩn:
- PCI DSS
- HIPAA
- SÓC 2
- ISO 27001
Thực hiện tuân thủ dưới dạng mã:
# OPA Gatekeeper constraint for PCI requirement 2.2 apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: name: required-compliance-labels spec: match: kinds: - apiGroups: [''] kinds: ['Pod'] parameters: labels: - key: 'compliance' allowedRegex: 'pci|hipaa|sox'
Phản hồi bảo mật
Phản hồi sự cố
Chuẩn bị cho sự cố an ninh:
Tạo kế hoạch ứng phó sự cố:
- Thủ tục phát hiện
- Chiến lược ngăn chặn
- Quá trình diệt trừ
- Các bước khôi phục
Thực hiện cơ chế phát hiện:
- Giám sát an ninh thời gian chạy
- Phát hiện bất thường
- Cảnh báo tương quan
Thực hành chiến lược ngăn chặn:
# Isolate a compromised node kubectl cordon <node-name> kubectl drain <node-name> --ignore-daemonsets # Isolate a namespace with network policies kubectl apply -f quarantine-policy.yaml
Khắc phục tự động
Thiết lập phản hồi tự động:
Pod khởi động lại khi có hoạt động đáng ngờ:
# Falco response using falco-sidekick spec: alertOutput: webhooks: - url: 'http://falco-sidekick:2801'Cách ly mạng:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: quarantine spec: podSelector: matchLabels: security.kubernetes.io/quarantine: 'true' policyTypes: - Ingress - Egress
Tăng cường bảo mật trong DigitalOcean Kubernetes
Dịch vụ DigitalOcean Kubernetes (DOKS) cung cấp một số tính năng bảo mật:
Kiểm soát an ninh mặt phẳng:
- Được quản lý và bảo mật bởi DigitalOcean
- Bản vá bảo mật tự động
- Mạng riêng cho các nút
Bảo mật nút:
- Cập nhật bảo mật thường xuyên
- image tối thiểu
Bảo mật mạng:
- Hỗ trợ chính sách mạng
- Mạng riêng
- Tích hợp VPC
Đăng ký với DigitalOcean để nhận tín dụng miễn phí trị giá 200 USD và triển khai ứng dụng của bạn trên nền tảng Kubernetes an toàn.
Bảo mật CI/CD pipeline
Bảo vệ triển khai pipeline của bạn:
Bảo mật môi trường xây dựng:
- Sử dụng môi trường xây dựng bị cô lập
- Triển khai đặc quyền tối thiểu cho hệ thống CI
- Quét các phần phụ thuộc trong quá trình xây dựng
Triển khai bảo mật GitOps:
- Yêu cầu commit đã ký
- Thực thi đánh giá mã
- Sử dụng các nhánh được bảo vệ
Thông tin xác thực triển khai an toàn:
- Sử dụng thông tin xác thực ngắn hạn
- Triển khai các tài khoản dịch vụ triển khai cụ thể
- Hạn chế triển khai ở các không gian tên cụ thể
Ví dụ về quy trình CI/CD an toàn:
# GitHub Actions workflow
name: Secure Kubernetes Deployment
on:
push:
branches: [main]
jobs:
scan-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Verify commit signature
run: git verify-commit HEAD
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to registry
uses: docker/login-action@v2
with:
registry: ${{ secrets.REGISTRY }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ secrets.REGISTRY }}/app:${{ github.sha }}
- name: Scan image
uses: aquasecurity/trivy-action@master
with:
image-ref: ${{ secrets.REGISTRY }}/app:${{ github.sha }}
format: 'sarif'
output: 'trivy-results.sarif'
exit-code: '1'
severity: 'CRITICAL'
- name: Deploy to Kubernetes
uses: Azure/k8s-deploy@v1
with:
manifests: |
kubernetes/deployment.yaml
kubernetes/service.yaml
images: |
${{ secrets.REGISTRY }}/app:${{ github.sha }}
namespace: production
Danh sách kiểm tra các phương pháp bảo mật tốt nhất
Sử dụng danh sách kiểm tra này để đảm bảo an ninh toàn diện:
Bảo mật cụm
- Mã hóa TLS cho tất cả các giao tiếp trên mặt phẳng điều khiển
- RBAC được cấu hình đúng
- Đã bật bộ điều khiển truy cập máy chủ API
- etcd được mã hóa và bảo mật
- Các nút được cập nhật thường xuyên và được củng cố
- Kubelet được cấu hình an toàn
Bảo mật container
- image được quét để tìm lỗ hổng
- Cơ sở image được thu nhỏ
- image đã ký và xác minh
- Đăng ký container được bảo mật
- Đã triển khai giám sát bảo mật thời gian chạy
- Bối cảnh bảo mật được định cấu hình
Bảo mật khối lượng công việc
- Tiêu chuẩn bảo mật pod được thực thi
- Tài khoản dịch vụ được quản lý đúng cách
- Bí mật được lưu trữ an toàn
- Giới hạn tài nguyên được xác định
- Người dùng không phải root đã được định cấu hình
- Hệ thống tập tin chỉ đọc nếu có thể
An ninh mạng
- Chính sách mạng được triển khai
- Chính sách từ chối mặc định được áp dụng
- Lưu lượng truy cập vào được bảo mật bằng TLS
- Lưới dịch vụ với mTLS (nếu có)
- Kiểm soát giao thông lối ra
Giám sát và kiểm toán
- Đã bật ghi nhật ký kiểm tra
- Quét bảo mật tự động
- Đã thực hiện kiểm tra tuân thủ
- Giám sát hoạt động đáng ngờ
- Kế hoạch ứng phó sự cố được ghi lại
Kết luận
Bảo mật Kubernetes yêu cầu cách tiếp cận phòng thủ nhiều lớp, giải quyết nhiều lớp của ngăn xếp. Bằng cách triển khai các phương pháp được nêu trong hướng dẫn này, bạn có thể cải thiện đáng kể tình trạng bảo mật của cụm của mình.
Hãy nhớ rằng bảo mật không phải là nhiệm vụ một lần mà là một quá trình liên tục. Luôn cập nhật các phương pháp bảo mật tốt nhất và lỗ hổng bảo mật ảnh hưởng đến Kubernetes và hệ sinh thái của nó.
Để triển khai production, hãy cân nhắc sử dụng dịch vụ Kubernetes được quản lý như DigitalOcean Kubernetes, dịch vụ này xử lý nhiều khía cạnh bảo mật cho bạn đồng thời giúp bạn linh hoạt triển khai các biện pháp bảo mật bổ sung cho nhu cầu cụ thể của mình.
Trong hướng dẫn toàn diện này, chúng tôi đã đề cập đến các nguyên tắc cơ bản của Kubernetes, từ kiến trúc đến bảo mật. Bây giờ bạn đã có kiến thức để triển khai, quản lý và bảo mật các ứng dụng Kubernetes trong nhiều môi trường khác nhau. Tiếp tục khám phá và thử nghiệm để nâng cao kiến thức chuyên môn của bạn về nền tảng điều phối container mạnh mẽ này.