Cấu hình chế độ Enforce để chặn vi phạm chính sách
Chế độ Enforce (Thi hành) của OPA Gatekeeper được thiết lập để chặn ngay lập tức bất kỳ tài nguyên Kubernetes nào vi phạm chính sách. Khi một Pod hoặc Deployment không đáp ứng tiêu chuẩn, API Server sẽ từ chối yêu cầu tạo hoặc cập nhật tài nguyên đó, trả về lỗi cho người dùng.
Mục tiêu là đảm bảo an ninh tuyệt đối bằng cách ngăn chặn các image container không được ký (unsigned) hoặc không có provenance hợp lệ được triển khai vào cluster.
Bước 1: Tạo Constraint cho chính sách chặn image không được ký
Tạo một file YAML định nghĩa K8sImageProvenance constraint. File này áp dụng chính sách kiểm tra chữ ký của image cho tất cả các container trong cluster, với chế độ mặc định là Enforce.
Đường dẫn file: /etc/gatekeeper/constraints/image-provenance-enforce.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sImageProvenance
metadata:
name: deny-unsigned-images
namespace: gatekeeper-system
spec:
enforcementAction: "deny"
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
images:
- "registry.example.com/my-app:*"
sources:
- name: "tekton-pipeline"
uri: "https://sigstore.our-internal-domain.com"
Kết quả mong đợi: File YAML được tạo thành công. Khi áp dụng, bất kỳ Pod nào sử dụng image registry.example.com/my-app mà không có chữ ký từ source tekton-pipeline sẽ bị từ chối tạo.
Bước 2: Áp dụng chính sách vào Cluster
Sử dụng kubectl để áp dụng file constraint vừa tạo vào namespace gatekeeper-system. Lệnh này gửi định nghĩa chính sách đến OPA Gatekeeper controller.
kubectl apply -f /etc/gatekeeper/constraints/image-provenance-enforce.yaml
Kết quả mong đợi: Trả về thông báo constraint.gatekeeper.sh "deny-unsigned-images" created. Gatekeeper bắt đầu giám sát và thực thi chính sách này ngay lập tức.
Bước 3: Kiểm tra hoạt động của chế độ Enforce
Thử nghiệm bằng cách tạo một Pod sử dụng image không được ký (hoặc không khớp provenance) để xác nhận hệ thống có chặn đúng không.
cat
Kết quả mong đợi: Lệnh bị lỗi với thông báo admission webhook "validation.gatekeeper.sh" denied the request. Nội dung lỗi sẽ chỉ rõ constraint deny-unsigned-images đã bị vi phạm. Pod test-pod-unsigned không được tạo.
Cấu hình chế độ Audit để ghi log vi phạm
Chế độ Audit (Kiểm toán) cho phép Gatekeeper ghi lại các vi phạm chính sách vào log mà không chặn việc tạo tài nguyên. Chế độ này hữu ích trong giai đoạn đầu triển khai để đánh giá mức độ ảnh hưởng của chính sách trước khi bật chế độ chặn (Enforce).
Mục tiêu là thu thập dữ liệu về các vi phạm chính sách provenance để phân tích xu hướng và chuẩn bị sửa chữa code hoặc pipeline, mà không làm gián đoạn dịch vụ hiện tại.
Bước 1: Tạo Constraint với chế độ Audit
Tạo một file YAML mới, tương tự như bước Enforce nhưng thay đổi trường enforcementAction thành audit. Điều này báo cho Gatekeeper chỉ ghi log vi phạm.
Đường dẫn file: /etc/gatekeeper/constraints/image-provenance-audit.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sImageProvenance
metadata:
name: audit-unsigned-images
namespace: gatekeeper-system
spec:
enforcementAction: "audit"
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
images:
- "registry.example.com/my-app:*"
sources:
- name: "tekton-pipeline"
uri: "https://sigstore.our-internal-domain.com"
Kết quả mong đợi: File YAML được tạo. Khi áp dụng, Gatekeeper sẽ không chặn Pod nhưng sẽ tạo một record vi phạm trong tài nguyên Violation.
Bước 2: Áp dụng chính sách Audit
Áp dụng file constraint audit vào cluster. Gatekeeper sẽ bắt đầu ghi nhận các vi phạm cho chính sách này.
kubectl apply -f /etc/gatekeeper/constraints/image-provenance-audit.yaml
Kết quả mong đợi: Trả về constraint.gatekeeper.sh "audit-unsigned-images" created. Pod có thể được tạo thành công nhưng vi phạm sẽ được ghi lại.
Bước 3: Kiểm tra và xem log vi phạm
Đầu tiên, tạo lại Pod test (bước này sẽ thành công vì chế độ Audit không chặn). Sau đó, liệt kê các tài nguyên Violation để xem log vi phạm.
cat
Kết quả mong đợi: Pod test-pod-audit được tạo thành công (Running). Lệnh kubectl get violations sẽ trả về một dòng mới với tên constraint audit-unsigned-images, trạng thái violation, và thời gian phát hiện.
Bước 4: Chi tiết vi phạm
Xem chi tiết của violation để biết chính xác Pod nào và Container nào đã vi phạm chính sách.
kubectl describe violation audit-unsigned-images-test-pod-audit
Kết quả mong đợi: Hiển thị thông tin chi tiết về Pod test-pod-audit, container app, và lý do vi phạm (thiếu chữ ký hoặc provenance không khớp với source đã định nghĩa).
Định nghĩa chính sách kiểm tra Provenance từ Tekton Pipeline
Provenance (Nguồn gốc) trong bối cảnh Secure Supply Chain xác nhận rằng image được xây dựng từ một pipeline cụ thể (ở đây là Tekton) và sử dụng source code từ một commit cụ thể. OPA Gatekeeper cần được cấu hình để yêu cầu metadata này từ chữ ký Sigstore.
Mục tiêu là tạo một Constraint tùy chỉnh hoặc sử dụng Constraint template có sẵn để yêu cầu tekton-pipeline phải là nguồn tạo ra image, đảm bảo traceability từ code đến binary.
Bước 1: Tạo Custom Constraint Template cho Provenance
Mặc dù có template có sẵn, việc tạo template tùy chỉnh giúp kiểm soát chặt chẽ hơn các trường trong provenance metadata (như source, digest, pipeline). Dưới đây là template kiểm tra trường tekton-pipeline trong provenance.
Đường dẫn file: /etc/gatekeeper/templates/tekton-provenance-template.yaml
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8stektonprovenance
spec:
crd:
spec:
names:
kind: K8sTektonProvenance
validation:
openAPIV3Schema:
type: object
properties:
images:
type: array
items:
type: string
sources:
type: array
items:
type: object
properties:
name:
type: string
uri:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8stektonprovenance
import data.gatekeeper.rego
violation[{
"msg": msg,
"details": {
"source": source,
"image": image
}
}] {
input.review.object.kind == "Pod"
image := input.review.object.spec.containers[_].image
not valid_provenance(image)
msg := sprintf("Image %v does not have valid Tekton provenance signature", [image])
}
valid_provenance(image) {
some s in input.parameters.sources
s.name == "tekton-pipeline"
# Logic giả lập: Kiểm tra nếu image có trong chữ ký với provenance metadata
# Trong thực tế, cần tích hợp với cosign verify-attestation logic qua webhook custom
# Ở đây giả định constraint này được gọi sau khi image đã được verify bởi webhook khác
# và metadata provenance đã được inject vào annotation của Pod hoặc Pod spec
# Để đơn giản, ta giả sử Pod đã có annotation "cosign.sigstore.dev/attestations" chứa provenance
input.review.object.metadata.annotations["cosign.sigstore.dev/attestations"] == "tekton-pipeline"
}
Kết quả mong đợi: Template k8stektonprovenance được tạo. Template này định nghĩa logic Rego để kiểm tra xem Pod có annotation chứng minh provenance từ Tekton hay không.
Bước 2: Áp dụng Template và tạo Constraint
Đầu tiên áp dụng template vào cluster, sau đó tạo một Constraint dựa trên template này với chế độ Enforce.
Đường dẫn file: /etc/gatekeeper/constraints/tekton-provenance-enforce.yaml
cat
Kết quả mong đợi: Template và Constraint được tạo. Gatekeeper giờ sẽ chặn mọi Pod không có annotation cosign.sigstore.dev/attestations có giá trị tekton-pipeline.
Bước 3: Kiểm tra chính sách Provenance
Thử nghiệm bằng cách tạo Pod không có annotation provenance (giả lập image không đi qua pipeline Tekton hoặc không được verify provenance).
cat
Kết quả mong đợi: Lệnh bị lỗi admission webhook "validation.gatekeeper.sh" denied the request. Lỗi chỉ rõ Pod thiếu annotation chứng minh provenance từ Tekton.
Bước 4: Kiểm tra Pod hợp lệ (có provenance)
Tạo Pod với annotation giả lập (trong thực tế, annotation này được thêm bởi Tekton Pipeline hoặc Cosign webhook sau khi verify thành công).
cat
Kết quả mong đợi: Pod test-pod-valid-provenance được tạo thành công (Running). Chính sách cho phép Pod có provenance hợp lệ đi qua.
Verify kết quả tổng thể
Để đảm bảo toàn bộ hệ thống hoạt động đúng theo yêu cầu, thực hiện các bước kiểm tra sau để xác nhận trạng thái của các constraint và violations.
Kiểm tra trạng thái Constraints
Liệt kê tất cả constraints đang hoạt động để đảm bảo chế độ Enforce và Audit đã được áp dụng đúng.
kubectl get constraints --namespace gatekeeper-system
Kết quả mong đợi: Danh sách hiển thị các constraint deny-unsigned-images (Enforce), audit-unsigned-images (Audit), và require-tekton-provenance (Enforce).
Kiểm tra số lượng Violations
Đếm số lượng vi phạm đang tồn tại trong cluster, đặc biệt chú ý đến các vi phạm thuộc chế độ Audit.
kubectl get violations --namespace gatekeeper-system -o wide
Kết quả mong đợi: Hiển thị danh sách violations. Các violations từ constraint Audit sẽ tồn tại, trong khi violations từ constraint Enforce sẽ không xuất hiện vì Pod bị chặn ngay từ đầu (trừ khi bạn dùng kubectl run --dry-run=client để test).
Kiểm tra log của Gatekeeper Controller
Xem log của container gatekeeper để xác nhận các quyết định (deny/audit) đang được xử lý.
kubectl logs -n gatekeeper-system -l app=gatekeeper-controller --tail=50 | grep -E "deny|audit|violation"
Kết quả mong đợi: Log hiển thị các dòng ghi nhận việc từ chối (denied) hoặc ghi log (audited) các request tương ứng với các Pod đã test ở các bước trên.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Secure Software Supply Chain với Sigstore, Cosign, Tekton và OPA Gatekeeper trên Kubernetes để đảm bảo an toàn vòng đời phần mềm
« Phần 5: Triển khai OPA Gatekeeper để thực thi chính sách bảo mật
Phần 7: Tích hợp end-to-end: Từ code đến production với chuỗi cung ứng an toàn »