Khởi tạo Fulcio CA để cấp phát chứng chỉ mã hóa tạm thời
Chuẩn bị thư mục và cấu hình Root CA
Bạn cần tạo một Root CA nội bộ để Fulcio có thể cấp phát các chứng chỉ ngắn hạn (ephemeral certificates) cho các tác nhân ký. Đây là bước nền tảng để xây dựng niềm tin (trust anchor).
Thực hiện tạo thư mục làm việc và khởi tạo khóa RSA 4096 bit cùng chứng chỉ Root CA.
mkdir -p ~/sigstore-ca/{fulcio, rekor, tuf}
cd ~/sigstore-ca/fulcio
openssl genrsa -out root-ca.key 4096
openssl req -x509 -new -nodes -key root-ca.key -sha256 -days 1024 -out root-ca.pem -subj "/CN=Sigstore Root CA/O=MyOrg/C=VN"
Kết quả mong đợi: Bạn có hai file root-ca.key (khóa bí mật) và root-ca.pem (chứng chỉ công khai) trong thư mục hiện tại. File .pem này sẽ được dùng để xác minh chữ ký sau này.
Cấu hình Fulcio Server
Fulcio cần một file cấu hình để biết cách sử dụng Root CA vừa tạo, địa chỉ nghe (listen port) và cơ chế lưu trữ (chúng ta sẽ dùng SQLite đơn giản để bắt đầu).
Viết nội dung cấu hình vào file fulcio-config.yaml tại đường dẫn ~/sigstore-ca/fulcio/fulcio-config.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: fulcio-config
namespace: sigstore
data:
config.yaml: |
fulcio:
port: 8443
address: 0.0.0.0
ca:
type: x509
x509:
provider: kubernetes
serviceAccount: fulcio
issuer: sigstore-issuer
duration: 1h
# Trong môi trường dev/local, ta dùng file local
# provider: local
# local:
# rootCert: /etc/fulcio/certs/root-ca.pem
# rootKey: /etc/fulcio/certs/root-ca.key
log:
level: info
rekor:
url: https://rekor.sigstore.svc.cluster.local:3000
tuf:
root: /etc/fulcio/tuf/root.json
Kết quả mong đợi: File cấu hình được tạo. Lưu ý rằng trong môi trường production trên Kubernetes, bạn sẽ dùng Provider Kubernetes (GCP/AWS), nhưng ở đây chúng ta đang xây dựng hạ tầng local, nên bạn sẽ cần điều chỉnh phần ca để trỏ trực tiếp vào file root-ca.pem và root-ca.key nếu chạy bằng Docker hoặc binary trực tiếp.
Triển khai Fulcio và cấp phát chứng chỉ thử nghiệm
Bây giờ hãy giả lập việc Fulcio cấp phát chứng chỉ. Để đơn giản trong môi trường local không có K8s, chúng ta dùng công cụ fulcio (nếu đã cài) hoặc mô phỏng bằng OpenSSL với CA root để tạo một chứng chỉ client (tương tự như Fulcio làm).
Tạo một CSR (Certificate Signing Request) cho tác nhân ký (ví dụ: CI server) và ký nó bằng Root CA của Fulcio.
openssl genrsa -out client-key.pem 2048
openssl req -new -key client-key.pem -out client.csr -subj "/CN=github-actions-bot@myorg/C=VN"
openssl x509 -req -in client.csr -CA root-ca.pem -CAkey root-ca.key -CAcreateserial -out client-cert.pem -days 1 -sha256
Kết quả mong đợi: File client-cert.pem được tạo. Đây là chứng chỉ ngắn hạn (1 ngày) được ký bởi Root CA của Fulcio, đại diện cho chứng chỉ mà Fulcio sẽ cấp cho pipeline CI/CD của bạn.
Verify kết quả Fulcio
Để xác minh chứng chỉ vừa cấp phát có hợp lệ và được ký bởi Root CA của Fulcio, chạy lệnh sau:
openssl verify -CAfile root-ca.pem client-cert.pem
Kết quả mong đợi: Dòng client-cert.pem: OK xuất hiện, xác nhận chuỗi niềm tin đã được thiết lập thành công.
Cấu hình Rekor Log để lưu trữ bản ghi không thể chối bỏ
Khởi tạo Public Key cho Rekor
Rekor là một nhật ký (log) append-only. Để xác minh tính toàn vẹn của log, bạn cần một cặp khóa Public/Private. Khóa Public sẽ được public để mọi người verify, khóa Private được giữ bí mật bởi server Rekor để ký vào mỗi bản ghi (entry).
Chuyển sang thư mục Rekor và tạo cặp khóa Ed25519 (được khuyến nghị cho hiệu suất cao) hoặc RSA 4096.
cd ~/sigstore-ca/rekor
openssl genpkey -algorithm Ed25519 -out rekor-key.pem
openssl pkey -in rekor-key.pem -pubout -out rekor-key.pub
Kết quả mong đợi: Bạn có rekor-key.pem (khóa bí mật) và rekor-key.pub (khóa công khai). File .pub này sau này sẽ được đưa vào TUF root.
Cấu hình Rekor Server
Viết file cấu hình rekor-config.yaml tại đường dẫn ~/sigstore-ca/rekor/rekor-config.yaml để định nghĩa cách Rekor hoạt động, bao gồm đường dẫn lưu trữ log và khóa bí mật.
apiVersion: v1
kind: ConfigMap
metadata:
name: rekor-config
namespace: sigstore
data:
config.yaml: |
rekor:
port: 3000
address: 0.0.0.0
server:
publickey: /etc/rekor/rekor-key.pub
privatekey: /etc/rekor/rekor-key.pem
log:
level: info
storage:
type: local
local:
path: /var/lib/rekor/log
# Trong K8s production, dùng type: s3 hoặc gcs
tuf:
root: /etc/rekor/tuf/root.json
Kết quả mong đợi: File cấu hình đã sẵn sàng. Cấu hình này chỉ định Rekor lắng nghe ở cổng 3000 và lưu trữ log dưới dạng file local (phù hợp cho testing).
Triển khai Rekor và tạo bản ghi thử nghiệm
Để đảm bảo Rekor hoạt động, bạn cần khởi động nó. Giả sử bạn đã cài binary rekor-server hoặc chạy qua Docker. Ở đây ta giả lập việc tạo một bản ghi (entry) để kiểm tra tính append-only.
Khởi động Rekor (giả lập) và tạo một bản ghi hash đơn giản (tương tự như hash của một image artifact).
# Giả sử rekor-server đang chạy ở localhost:3000
# Tạo một entry dummy để test
echo '{"apiVersion": "0.0.1", "kind": "hashedrekord.v0.0.1", "spec": {"data": {"hash": {"algorithm": "sha256", "value": "2c26b46b68ffc68ff99b453c1d3c41346398d4a4c0139042acaa16b46990d61d"}}, "publicKey": {"key": "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----"}}}' | rekor-cli create --hash=sha256:2c26b46b68ffc68ff99b453c1d3c41346398d4a4c0139042acaa16b46990d61d --public-key=./rekor-key.pub --rekor-server=http://localhost:3000
Kết quả mong đợi: Rekor trả về một UUID của bản ghi (Entry ID) và xác nhận bản ghi đã được thêm vào log. Bạn không thể xóa hoặc sửa bản ghi này sau khi được ký.
Verify kết quả Rekor
Kiểm tra xem bản ghi vừa tạo có tồn tại và có thể xác minh tính toàn vẹn thông qua Proof of Inclusion (PoI) hay không.
rekor-cli get --uuid= --rekor-server=http://localhost:3000 --verify
Kết quả mong đợi: Lệnh trả về nội dung bản ghi và dòng Verified: true, chứng tỏ bản ghi không bị giả mạo và nằm trong log đã ký.
Tích hợp TUF (The Update Framework) để quản lý chứng chỉ root và metadata
Khởi tạo Repository TUF
TUF giúp quản lý các chứng chỉ Root và Metadata của Fulcio/Rekor một cách an toàn, cho phép rotation key và cập nhật metadata mà không cần tin tưởng server trung gian quá mức. Chúng ta sẽ dùng thư viện tuf (hoặc cosign hỗ trợ TUF) để khởi tạo.
Chuyển sang thư mục TUF và khởi tạo repository với các role: root, targets, snapshot, timestamp.
cd ~/sigstore-ca/tuf
tuf init --repository ./tuf-repo --metadata ./tuf-repo/metadata --targets ./tuf-repo/targets --keystore ./tuf-repo/keystore --passphrase "strong-password-here"
Kết quả mong đợi: Cấu trúc thư mục TUF được tạo với các file root.json, targets.json, v.v. và các file khóa trong thư mục keystore.
Thêm khóa Fulcio và Rekor vào TUF
Bây giờ bạn cần thêm chứng chỉ Root CA của Fulcio và khóa Public của Rekor vào TUF Targets để các client có thể tải xuống và xây dựng niềm tin.
Đưa file root-ca.pem (từ bước Fulcio) và rekor-key.pub (từ bước Rekor) vào thư mục targets của TUF.
cp ../fulcio/root-ca.pem ./tuf-repo/targets/fulcio-root.pem
cp ../rekor/rekor-key.pub ./tuf-repo/targets/rekor-key.pub
cd tuf-repo
# Cập nhật targets
tuf add-targets metadata targets fulcio-root.pem rekor-key.pub --passphrase "strong-password-here"
# Cập nhật snapshot
tuf update metadata snapshot --passphrase "strong-password-here"
# Cập nhật timestamp
tuf update metadata timestamp --passphrase "strong-password-here"
Kết quả mong đợi: Các file metadata trong thư mục metadata/ (cụ thể là targets.json, snapshot.json, timestamp.json) được cập nhật và ký bằng các khóa TUF tương ứng.
Xuất Root TUF để phân phối
File root.json là điểm khởi đầu duy nhất mà client cần tin tưởng để bắt đầu tải về các metadata khác (targets, snapshot, timestamp). Bạn cần export file này để đưa vào cấu hình của Fulcio và Rekor.
Chuyển file root.json ra thư mục chung và cập nhật chữ ký của nó.
cp metadata/root.json ../../
cd ..
# Đảm bảo root.json đã được ký bởi root key của TUF
tuf update metadata root --passphrase "strong-password-here"
cp metadata/root.json ../
Kết quả mong đợi: File root.json nằm ở ~/sigstore-ca/tuf/root.json (hoặc nơi bạn lưu). File này chứa danh sách các public key của Fulcio và Rekor đã được ký bởi TUF Root Key.
Verify kết quả TUF
Sử dụng công cụ cosign hoặc tuf client để xác minh rằng metadata của TUF là hợp lệ và chứa đúng các chứng chỉ bạn vừa thêm.
cosign verify-blob --signature=./tuf-repo/metadata/1.root.json --certificate=./tuf-repo/metadata/1.root.json --key=./tuf-repo/keystore/root_key.pem --key-password "strong-password-here" --tuf-root ./root.json 2>/dev/null && echo "TUF Root is valid"
Lưu ý: Lệnh trên là ví dụ minh họa logic. Trong thực tế, bạn dùng tuf verify hoặc thư viện client của ngôn ngữ bạn dùng để load root.json và fetch targets.json.
Kết quả mong đợi: Client có thể tải xuống targets.json và xác minh được nó chứa fulcio-root.pem và rekor-key.pub mà không bị giả mạo. Đây là bước cuối cùng để hoàn thiện hạ tầng bảo mật nền tảng.
Đ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 1: Chuẩn bị môi trường và yêu cầu hệ thống cho Secure Supply Chain
Phần 3: Triển khai Cosign để ký và xác minh container image »