1. Triển khai Kubernetes Cluster với Kind
1.1 Cài đặt và khởi tạo cluster Kind
Bước đầu tiên là thiết lập môi trường Kubernetes local để mô phỏng hạ tầng production. Chúng ta sử dụng Kind (Kubernetes in Docker) vì nó nhẹ, nhanh và tương thích cao với các công cụ bảo mật như Sigstore và Tekton.
Cài đặt công cụ Kind từ source chính thức và khởi tạo cluster với phiên bản Kubernetes tương thích (v1.28 trở lên).
Command để tải và cài đặt Kind:
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64 && chmod +x ./kind && sudo mv ./kind /usr/local/bin/kind
Kết quả mong đợi: Tool kind được cài đặt vào thư mục /usr/local/bin/ và có thể chạy lệnh kind --version.
Khởi tạo cluster Kind với cấu hình CNI (Calico) để đảm bảo networking hoạt động tốt cho các policy enforcement sau này:
cat > kind-config.yaml <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: secure-supply-chain
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
EOF
kind create cluster --config kind-config.yaml --image kindest/node:v1.28.0
Kết quả mong đợi: Cluster được tạo thành công với tên secure-supply-chain, bao gồm 1 node control-plane và mapping cổng 80/443 sang host.
1.2 Cấu hình kubectl
Sau khi cluster chạy, cần đảm bảo kubectl trỏ đúng vào context của cluster vừa tạo.
kubectl cluster-info --context kind-secure-supply-chain
Kết quả mong đợi: Xuất hiện thông tin Control Plane URL (thường là https://127.0.0.1:6443) và trạng thái Running.
2. Thiết lập Container Registry và CI/CD
2.1 Triển khai Harbor Registry trong Kubernetes
Để xây dựng Secure Supply Chain, chúng ta cần một Private Registry để lưu trữ image và tích hợp với Harbor Notary (trong các phần sau). Sử dụng Harbor Operator để triển khai dễ dàng trên Kind.
Thêm repository Harbor Operator và cài đặt CRD:
kubectl apply -f https://raw.githubusercontent.com/goharbor/harbor-operator/v0.10.0/helm/harbor-operator/crds.yaml
helm repo add harbor https://helm.goharbor.io
helm repo update
Kết quả mong đợi: CRD harbors.goharbor.io được tạo và repository harbor được thêm vào list.
Triển khai Harbor với cấu hình mặc định (sử dụng Redis và PostgreSQL internal):
helm install harbor harbor/harbor-operator --set harborAdminPassword=Harbor12345 --set registrySecret=Harbor12345 --set nodeSelector="{ingress-ready: true}" --namespace default
Kết quả mong đợi: Các pod harbor-operator và harbor-* (core, registry, jobservice) chuyển sang trạng thái Running.
Cấu hình Harbor để sử dụng HTTPS (Self-signed) bằng cách tạo Secret và áp dụng vào instance Harbor:
cat > harbor-instance.yaml <<EOF
apiVersion: goharbor.io/v1alpha1
kind: Harbor
metadata:
name: harbor
spec:
imagePullPolicy: IfNotPresent
externalURL: https://harbor.localhost
expose:
type: ingress
tls:
enabled: true
secretName: harbor-tls
persistence:
enabled: true
registry:
storage:
type: filesystem
volumeSize: 10Gi
jobservice:
image:
repository: goharbor/harbor-jobservice
notary:
enabled: false
EOF
kubectl apply -f harbor-instance.yaml
Kết quả mong đợi: Harbor instance được tạo, ingress controller sẽ tự động cấp chứng chỉ (hoặc sử dụng cert-manager nếu đã cài) để expose endpoint HTTPS.
2.2 Cấu hình GitLab/GitHub Actions
Chuẩn bị môi trường CI/CD để trigger pipeline ký image. Ở đây chúng ta giả định sử dụng GitHub Actions (tương tự với GitLab CI).
Tạo file cấu hình workflow tại đường dẫn .github/workflows/supply-chain-ci.yml trong repo của bạn:
cat > .github/workflows/supply-chain-ci.yml <<EOF
name: Secure Supply Chain CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
REGISTRY: "harbor.localhost"
IMAGE_NAME: "my-app"
jobs:
build-and-sign:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Harbor
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.HARBOR_USER }}
password: ${{ secrets.HARBOR_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
secrets: |
COSIGN_PRIVATE_KEY=${{ secrets.COSIGN_PRIVATE_KEY }}
- name: Sign the image
uses: sigstore/cosign-action@v3
with:
key: ${{ secrets.COSIGN_PRIVATE_KEY }}
image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
EOF
Kết quả mong đợi: File workflow được tạo sẵn sàng để trigger khi code được push lên repo. Lưu ý: Cần lưu trữ secret COSIGN_PRIVATE_KEY trên GitHub/GitLab Secrets.
3. Cài đặt các công cụ CLI cần thiết
3.1 Cài đặt Cosign và Rekor-cli
Cosign dùng để ký và xác minh image, Rekor-cli dùng để kiểm tra tính toàn vẹn của log ký (Transparency Log). Đây là hai thành phần cốt lõi của Sigstore.
Cài đặt Cosign từ binary chính thức:
curl -sSfL https://raw.githubusercontent.com/sigstore/cosign/main/cosign-installer.sh | sh -s -- -b /usr/local/bin
Kết quả mong đợi: Tool cosign được cài đặt và có thể chạy cosign version.
Cài đặt Rekor-cli:
curl -sSfL https://raw.githubusercontent.com/sigstore/rekor/main/rekor-installer.sh | sh -s -- -b /usr/local/bin
Kết quả mong đợi: Tool rekor-cli được cài đặt và có thể chạy rekor version.
3.2 Cài đặt Kube-bench
Kube-bench là công cụ kiểm tra tuân thủ CIS Benchmark cho Kubernetes, giúp đánh giá độ an toàn của cluster trước khi triển khai các policy bảo mật.
Cài đặt Kube-bench từ GitHub release:
curl -L https://github.com/aquasecurity/kube-bench/releases/download/v0.6.12/kube-bench-0.6.12-linux-amd64.tar.gz | tar -xz -C /tmp
sudo mv /tmp/kube-bench-0.6.12-linux-amd64/kube-bench /usr/local/bin/
Kết quả mong đợi: Tool kube-bench sẵn sàng sử dụng.
3.3 Cài đặt OPA Gatekeeper CLI (kubectl-gatekeeper)
Dù OPA Gatekeeper chạy dưới dạng controller trong cluster, việc có CLI để debug và test policy là rất cần thiết.
Cài đặt OPA (Open Policy Agent) để test policy local:
curl -sSfL https://raw.githubusercontent.com/open-policy-agent/opa/main/install | sh -s -- -b /usr/local/bin
Kết quả mong đợi: Tool opa được cài đặt. Chạy opa version để xác minh.
4. Kiểm tra và Xác minh môi trường (Verification)
4.1 Verify Kubernetes Cluster
Đảm bảo tất cả node và system pods đang hoạt động ổn định:
kubectl get nodes
kubectl get pods -n kube-system
Kết quả mong đợi: Tất cả nodes ở trạng thái Ready và pods hệ thống (kube-apiserver, etcd, coredns) ở trạng thái Running.
4.2 Verify Harbor Registry
Đẩy một image test vào Harbor để xác nhận registry hoạt động và HTTPS đã được thiết lập:
docker pull nginx:alpine
docker tag nginx:alpine harbor.localhost/test-verify:v1
docker push harbor.localhost/test-verify:v1
Kết quả mong đợi: Lệnh push thành công, không bị lỗi unauthorized hoặc connection refused. Nếu chưa login, cần chạy docker login harbor.localhost với user admin và pass Harbor12345.
4.3 Verify Tools
Chạy lệnh verify cho từng công cụ đã cài đặt:
cosign version
rekor-cli version
kube-bench version
opa version
Kết quả mong đợi: Mỗi lệnh in ra phiên bản tương ứng của tool, xác nhận cài đặt thành công.
4.4 Chạy Kube-bench để đánh giá sơ bộ
Chạy kiểm tra nhanh đối với node và control-plane:
kube-bench run --config ./kube-bench-config.yaml --targets node,controlplane --report kube-bench-report.txt
Kết quả mong đợi: File kube-bench-report.txt được tạo, liệt kê các điểm chưa đạt (Fail) theo chuẩn CIS. Đây là cơ sở để cấu hình OPA Gatekeeper trong các phần sau.
Đ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 2: Xây dựng hạ tầng bảo mật nền tảng với Sigstore và Fulcio »