Sử Dụng Kyverno trên Kubernetes
Kubernetes là một nền tảng mạnh mẽ và phổ biến để quản lý các containerized applications. Nó giúp các tổ chức triển khai, mở rộng và quản lý các ứng dụng dễ dàng hơn. Tuy nhiên, với sự phát triển và phức tạp của hệ thống Kubernetes, vấn đề bảo mật trở thành một yếu tố cực kỳ quan trọng. Để giải quyết các thách thức về bảo mật, các công cụ như Kyverno đã được phát triển.
Kyverno là một công cụ chính sách (policy) mã nguồn mở được thiết kế đặc biệt cho Kubernetes. Nó giúp quản trị viên kiểm soát và quản lý các tài nguyên trong Kubernetes thông qua việc định nghĩa và thực thi các chính sách bảo mật.
Kyverno là một công cụ quản lý chính sách mã nguồn mở được thiết kế dành riêng cho Kubernetes. Tên "Kyverno" xuất phát từ tiếng Hy Lạp, có nghĩa là "quản trị viên" hoặc "người quản lý". Kyverno cho phép quản trị viên Kubernetes xác định, thực thi và kiểm tra các chính sách trực tiếp trên các đối tượng Kubernetes mà không cần phải học một ngôn ngữ chính sách mới. Thay vào đó, Kyverno sử dụng các tài nguyên Kubernetes quen thuộc như ConfigMaps và CustomResourceDefinitions (CRDs).
Lợi Ích của Việc Sử Dụng Kyverno
Đơn Giản Hóa Quản Lý Chính Sách: Kyverno cho phép định nghĩa các chính sách bảo mật dưới dạng tài nguyên Kubernetes (CRD - Custom Resource Definitions). Điều này làm cho việc quản lý và áp dụng chính sách trở nên đơn giản và tự nhiên đối với người dùng đã quen thuộc với Kubernetes.
Không Cần Thêm Ngôn Ngữ Mới: Kyverno sử dụng YAML, ngôn ngữ mà các quản trị viên Kubernetes đã quen thuộc, để định nghĩa các chính sách. Điều này giảm thiểu sự phức tạp khi triển khai và quản lý các chính sách bảo mật.
Tự Động Hóa và Thực Thi Chính Sách: Kyverno có thể tự động kiểm tra và thực thi các chính sách bảo mật khi các tài nguyên được tạo, cập nhật hoặc xóa bỏ trong Kubernetes. Điều này đảm bảo rằng các chính sách bảo mật luôn được tuân thủ.
Kyverno cho phép tự động thêm hoặc thay đổi các trường (fields) trong các tài nguyên Kubernetes, chẳng hạn như tự động thêm nhãn hoặc chú thích (annotations) vào các Pod hoặc các Deployment.
Kyverno có thể thực thi các chính sách quản lý vòng đời, chẳng hạn như tự động làm sạch các tài nguyên cũ hoặc không còn sử dụng
Các Loại Chính Sách Bảo Mật với Kyverno
Chính Sách Xác Thực (Validation Policies): Các chính sách này kiểm tra các tài nguyên Kubernetes để đảm bảo chúng tuân thủ các yêu cầu bảo mật trước khi chúng được tạo hoặc cập nhật. Ví dụ, một chính sách có thể yêu cầu tất cả các container phải chạy với user không phải là root.
Chính Sách Biến Đổi (Mutation Policies): Kyverno cho phép tự động sửa đổi các tài nguyên khi chúng được tạo hoặc cập nhật. Điều này có thể bao gồm việc thêm các nhãn (labels), chú thích (annotations) hoặc sửa đổi cấu hình để tuân thủ các tiêu chuẩn bảo mật.
Chính Sách Tạo Tài Nguyên (Generation Policies): Kyverno có thể tự động tạo các tài nguyên bổ sung dựa trên các quy tắc định trước. Điều này hữu ích trong việc đảm bảo rằng các tài nguyên liên quan đến bảo mật như Secrets hoặc ConfigMaps được tạo ra tự động khi cần thiết.
Ví Dụ:
Chính Sách Cấm Container Chạy Với User Root:
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: disallow-root-user spec: rules: - name: validate-root-user match: resources: kinds: - Pod validate: message: "Running as root user is not allowed" pattern: spec: containers: - securityContext: runAsNonRoot: true
Lỗi xuất hiện khi vi phạm policy
Error from server: error when creating "namespace.yaml": admission webhook "validate.kyverno.svc-fail" denied the request: resource Namespace//unicorn-app was blocked due to the following policies require-ns-label: require-ns-env-label: 'validation error: You must have label `env` with a value of `dev`, `stage`, or `prod` set on all new namespaces. rule require-ns-env-label failed at path /metadata/labels/env/'
Chính Sách Bắt Buộc Label Cho Pod:
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: require-labels spec: rules: - name: check-for-labels match: resources: kinds: - Pod validate: message: "Pod is missing required labels 'app' and 'env'" pattern: metadata: labels: app: "?*" env: "?*"
Giả sử bạn muốn các Pod có nhãn
app: myapp
chỉ được phép kéo image từ repositorymyregistry.com
.apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: require-specific-registry spec: rules: - name: validate-image-registry match: resources: kinds: - Pod selector: matchLabels: app: myapp validate: message: "Pods with label 'app: myapp' must use images from 'myregistry.com'." pattern: spec: containers: - image: "myregistry.com/*" initContainers: - image: "myregistry.com/*"
Disallow latest tag
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: disallow-latest-tag annotations: policies.kyverno.io/title: Disallow Latest Tag policies.kyverno.io/category: Best Practices policies.kyverno.io/minversion: 1.6.0 policies.kyverno.io/severity: medium policies.kyverno.io/subject: Pod spec: validationFailureAction: Enforce background: true rules: - name: require-image-tag match: any: - resources: kinds: - Pod validate: message: "An image tag is required." pattern: spec: containers: - image: "*:*" - name: validate-image-tag match: any: - resources: kinds: - Pod validate: message: "Using a mutable image tag e.g. 'latest' is not allowed." pattern: spec: containers: - image: "!*:latest"
Lỗi khi apply:
$ kubectl apply -f ./pod-latest.yaml Error from server: error when creating "./pod-latest.yaml": admission webhook "validate.kyverno.svc-fail" denied the request: resource Pod/default/nginx was blocked due to the following policies disallow-latest-tag: validate-image-tag: 'validation error: Using a mutable image tag e.g. ''latest'' is not allowed. rule validate-image-tag failed at path /spec/containers/0/image/'
Policy Yêu Cầu Resource Quota apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: require-resource-quota spec: rules: - name: check-for-resource-quota match: resources: kinds: - Namespace validate: message: "Namespace must have a ResourceQuota with limits on CPU and memory." pattern: kind: ResourceQuota spec: hard: requests.cpu: "?*" requests.memory: "?*" limits.cpu: "?*" limits.memory: "?*" - name: add-default-resource-quota match: resources: kinds: - Namespace generate: kind: ResourceQuota name: default-resource-quota namespace: "{{request.object.metadata.name}}" synchronize: true data: spec: hard: requests.cpu: "1" requests.memory: "1Gi" limits.cpu: "2" limits.memory: "2Gi"
Mô hình mô tả hoạt động của Kyverno:
Người dùng/Quản trị viên: Định nghĩa các chính sách Kyverno (ClusterPolicy hoặc Policy) và áp dụng chúng vào cụm Kubernetes.
API Server: Nhận các yêu cầu từ người dùng hoặc các thành phần khác trong cụm và chuyển tiếp chúng đến các webhook thích hợp, bao gồm cả Kyverno.
Kyverno:
Admission Controller Webhook: Kyverno hoạt động như một admission controller webhook, nhận các yêu cầu tạo, cập nhật hoặc xóa tài nguyên từ API Server và kiểm tra chúng dựa trên các chính sách đã định nghĩa.
Policy Engine: Thành phần chính của Kyverno xử lý các chính sách và áp dụng chúng vào các tài nguyên phù hợp.
Webhook Server: Nhận các yêu cầu từ API Server và chuyển chúng đến Policy Engine để xử lý.
Kubernetes Objects: Các tài nguyên Kubernetes như Pod, Deployment, Service, v.v. sẽ bị kiểm tra và điều chỉnh bởi Kyverno trước khi chúng được tạo hoặc cập nhật trong cụm.
Dưới đây là biểu đồ mô tả mô hình hoạt động của Kyverno:
plaintextSao chép mã+------------------+ +------------------+
| User/Admin | | Kubernetes |
| - Define Policy | | Objects |
| - Apply Policy | | - Pod |
+--------+---------+ | - Deployment |
| | - Service |
v +---------+--------+
+--------+---------+ |
| Kubernetes API | |
| Server | |
| - Receives | |
| Requests | |
+--------+---------+ |
| |
v |
+--------+---------+ Admission |
| Kyverno |<-------- Webhook ---------->|
| - Webhook Server| |
| - Policy Engine | |
+--------+---------+ |
^ |
| |
| |
+---------------------------------------+
Chi tiết từng bước:
Người dùng/Quản trị viên định nghĩa và áp dụng các chính sách Kyverno bằng cách sử dụng các công cụ như
kubectl
.API Server nhận các yêu cầu tạo, cập nhật hoặc xóa tài nguyên Kubernetes và chuyển tiếp chúng đến Kyverno thông qua admission webhook.
Webhook Server của Kyverno nhận yêu cầu từ API Server và chuyển nó đến Policy Engine.
Policy Engine của Kyverno kiểm tra yêu cầu so với các chính sách đã được định nghĩa và xác định xem yêu cầu có tuân thủ hay không.
Kyverno thực hiện hành động thích hợp (chấp nhận, từ chối, hoặc điều chỉnh yêu cầu) dựa trên kết quả kiểm tra chính sách.
API Server tiếp nhận phản hồi từ Kyverno và tiếp tục xử lý yêu cầu nếu nó tuân thủ chính sách.
Quy Trình Xử Lý Yêu Cầu API
API Request: Bắt đầu từ yêu cầu API gửi đến Kubernetes API Server.
HTTP Handler: API Server nhận và xử lý yêu cầu ban đầu.
Authentication / Authorization (Authn / Authz): Kiểm tra xác thực và quyền truy cập của yêu cầu.
Mutating Admission: Kiểm tra và thay đổi yêu cầu nếu cần thiết dựa trên các webhook mutating.
Schema Validation: Kiểm tra tính hợp lệ của yêu cầu theo schema của Kubernetes.
Validating Admission: Kiểm tra yêu cầu dựa trên các chính sách xác thực, bao gồm Kyverno.
Thành Phần Kyverno
Admission Review
- Admission Review: Quy trình đánh giá admission request, nơi các yêu cầu được gửi đến các Admission Controller để xác thực và tuân thủ chính sách.
Admission Controller
Admission Controller: Là trung tâm của Kyverno, xử lý các yêu cầu từ API Server và áp dụng các chính sách.
Webhook Controller: Quản lý cấu hình webhook để đảm bảo Kyverno có thể nhận các yêu cầu từ API Server.
Cert Renewer: Quản lý và gia hạn chứng chỉ cần thiết cho webhook.
Engine
- Engine: Thành phần chính của Kyverno, nơi các quy tắc và chính sách được kiểm tra và thực thi.
Controllers
Report Controllers: Tạo và quản lý các báo cáo về việc tuân thủ chính sách, gồm:
Admission Reports: Báo cáo về các yêu cầu bị từ chối hoặc chấp nhận.
Background Scan Reports: Báo cáo về việc quét nền để kiểm tra tuân thủ chính sách.
Policy Reports: Báo cáo chi tiết về các chính sách đã được thực thi.
Background Controller: Thực hiện các kiểm tra và áp dụng chính sách nền, giúp duy trì tính nhất quán và tuân thủ trong toàn cụm.
Các Tài Nguyên và Cấu Hình
Webhook Configuration: Cấu hình webhook để Kyverno có thể nhận và xử lý các yêu cầu từ API Server.
Secrets: Quản lý các bí mật và thông tin nhạy cảm cần thiết cho hoạt động của Kyverno.
Kết Quả và Báo Cáo
Admission Reports: Báo cáo chi tiết về việc các yêu cầu có tuân thủ chính sách hay không.
Background Scan Reports: Báo cáo về kết quả quét nền của các tài nguyên trong cụm.
Policy Reports: Báo cáo chi tiết về các chính sách và việc thực thi của chúng.
Update Requests: Các yêu cầu cập nhật được gửi đi sau khi kiểm tra và thực thi chính sách.
Policies và Policy Exceptions
Policies: Các chính sách do quản trị viên định nghĩa và áp dụng để kiểm tra và kiểm soát tài nguyên Kubernetes.
Policy Exceptions: Các ngoại lệ của chính sách cho phép tùy chỉnh và linh hoạt trong việc áp dụng chính sách.
Quy Trình Hoạt Động Tổng Quan
Yêu cầu API đến Kubernetes API Server.
Xử lý yêu cầu qua nhiều bước xác thực và kiểm tra (HTTP Handler, Authn/Authz, Mutating Admission, Schema Validation).
Admission Review: Gửi yêu cầu đến Kyverno Admission Controller.
Kyverno Admission Controller: Kiểm tra và thực thi các chính sách dựa trên cấu hình webhook và engine.
Engine: Áp dụng chính sách và xác định tuân thủ.
Controllers: Quản lý báo cáo và kiểm tra nền.
Kết quả: Báo cáo về việc tuân thủ chính sách được tạo và lưu trữ, các yêu cầu được cập nhật hoặc từ chối dựa trên kết quả kiểm tra.
Mô hình này cho thấy cách Kyverno tích hợp vào luồng xử lý yêu cầu của Kubernetes để đảm bảo các chính sách được thực thi một cách tự động và nhất quán, giúp quản lý và bảo mật các tài nguyên trong cụm Kubernetes.
- Mô hình này cho thấy cách Kyverno tích hợp vào quy trình xử lý yêu cầu trong Kubernetes để quản lý và thực thi các chính sách một cách tự động và hiệu quả.