Ký Git commit không cần key với Gitsign và Sigstore: Xác thực danh tính thời hiện đại

Git tutorial - IT technology blog
Git tutorial - IT technology blog

So sánh các cách xác thực commit trong Git

Giả mạo author trong Git dễ đến mức nực cười. Chỉ cần gõ git config user.name "Linus Torvalds" kèm email của ông ấy, anh em đã có thể tạo commit mang danh cha đẻ Linux ngay trên máy mình.

Vấn đề này đe dọa trực tiếp đến Software Supply Chain Security. Để xác thực người đẩy code thực sự là ai, cộng đồng hiện dùng 3 phương án:

  • Commit tự do (Unsigned Commit): Không ký gì cả. Git mặc định tin mọi tên và email khai báo trong máy.
  • Ký bằng Private Key dài hạn (GPG / SSH): Dev tự sinh cặp key trên máy, cất private key và đẩy public key lên GitHub. Mỗi commit sẽ mang theo chữ ký mã hóa tương ứng.
  • Ký không dùng key tĩnh (Keyless Signing với Sigstore & Gitsign): Cơ chế này tận dụng giao thức OpenID Connect (OIDC). Dev đăng nhập qua tài khoản GitHub, Google hoặc Microsoft. Hệ thống Fulcio cấp chứng chỉ số ngắn hạn (ephemeral cert) chỉ sống tầm 10-15 phút để ký commit. Toàn bộ chữ ký sau đó được ghi vào sổ cái minh bạch Rekor.

Ưu và nhược điểm thực tế của từng giải pháp

Nhiều dự án mã nguồn mở lớn như Kubernetes hay CPython đang chuyển hẳn sang Sigstore. Dưới đây là phân tích chi tiết từng lựa chọn khi đưa vào vận hành thực tế.

1. Để commit tự do (Unsigned)

  • Ưu điểm: Nhanh. Dev mới vào dự án có thể clone repo và code được ngay, không vướng cấu hình nào.
  • Nhược điểm: Rủi ro bảo mật cực cao. Kẻ xấu có thể push backdoor dưới tên Tech Lead mà repo không thể phát hiện.

2. Quản lý key truyền thống (GPG / SSH)

  • Ưu điểm: Quá quen thuộc. GitHub, GitLab và Bitbucket đều hỗ trợ sẵn. Commit hiện badge Verified xanh mướt.
  • Nhược điểm: Quản trị key là một cơn ác mộng. Dev phải lo backup private key, nhớ passphrase, canh ngày hết hạn. Khi nhân sự nghỉ việc, việc thu hồi key rất nhiêu khê. Mất private key mà quên tạo sẵn revocation certificate thì chịu chết, key đó trôi nổi vĩnh viễn. Nếu key rò rỉ, hacker ung dung ký code độc mà cả team không hề hay biết.

3. Keyless Signing với Sigstore & Gitsign

  • Ưu điểm: Không lưu private key trên ổ cứng. Không sợ lộ key. Danh tính gắn thẳng vào tài khoản SSO công ty hoặc OAuth cá nhân. Fulcio cấp chứng chỉ tạm thời sống 10-15 phút để đóng dấu commit rồi hủy. Toàn bộ vết ký được lưu trên sổ cái Rekor, tamper-proof tuyệt đối.
  • Nhược điểm: Cần mạng để mở browser đăng nhập OIDC. Với runner CI/CD offline hoặc môi trường air-gapped, team phải tự dựng cụm Fulcio và Rekor nội bộ.

Khi nào nên chọn giải pháp nào?

Mỗi dự án có một bối cảnh hạ tầng riêng. Tùy vào tính chất hệ thống, anh em cân nhắc:

  • Chọn GPG/SSH: Phù hợp khi hạ tầng hoàn toàn cô lập với Internet. Hoặc khi công ty bắt buộc dùng khóa bảo mật vật lý như YubiKey.
  • Chọn Gitsign (Keyless): Phù hợp khi muốn cả team ký commit đồng bộ mà không ai phải loay hoay import hay gia hạn key. Đây là lựa chọn lý tưởng cho các team DevOps hiện đại và repo open-source.

Quy trình càng phức tạp thì dev càng dễ tìm cách lách luật. Cứ thử bắt gõ passphrase vài chục lần mỗi ngày, họ sẽ tắt luôn tính năng ký cho rảnh nợ. Gitsign giải quyết gọn gàng nghịch lý này: bảo mật chuẩn Sigstore nhưng trải nghiệm mượt mà.

Các bước cài đặt và cấu hình Gitsign

Gitsign là công cụ dòng lệnh được Sigstore tạo ra để thay thế trực tiếp binary gpg trong Git. Cách thiết lập trên Linux và macOS rất đơn giản.

Bước 1: Cài đặt Gitsign binary

Trên macOS, anh em dùng Homebrew:

brew install gitsign

Trên Linux (Ubuntu/Debian), tải trực tiếp bản release binary từ GitHub:

# Lấy tag phiên bản mới nhất
VERSION=$(curl -s https://api.github.com/repos/sigstore/gitsign/releases/latest | grep tag_name | cut -d '"' -f 4)
curl -LO "https://github.com/sigstore/gitsign/releases/download/${VERSION}/gitsign_${VERSION#v}_linux_amd64.tar.gz"

# Giải nén và đưa vào thư mục PATH
tar -xvzf "gitsign_${VERSION#v}_linux_amd64.tar.gz" gitsign
sudo mv gitsign /usr/local/bin/
gitsign --version

Bước 2: Cấu hình Git nhận diện Gitsign

Git cho phép đổi trình ký thông qua config gpg.x509.program. Hãy trỏ Git sang binary gitsign vừa cài:

# Bật ký tự động cho commit và tag
git config --global commit.gpgsign true
git config --global tag.gpgsign true

# Thiết lập format chứng chỉ X.509 và trỏ vào Gitsign
git config --global gpg.format x509
git config --global gpg.x509.program gitsign

Bước 3: Thực hiện commit và xác thực OIDC

Setup xong rồi, giờ anh em làm việc như bình thường. Khi gõ lệnh commit:

git add .
git commit -m "feat: implement authentication flow"

Gitsign tự động mở một tab trình duyệt để yêu cầu đăng nhập OIDC:

[gitsign] Opening your browser to authenticate with Sigstore...
[gitsign] Successfully authenticated! Ephemeral certificate issued.

Chỉ cần chọn tài khoản Google hoặc GitHub. Gitsign sẽ xin chứng chỉ ngắn hạn từ Fulcio, ký commit với email khớp với git config user.email rồi ghi nhận vết.

Bước 4: Xác minh chữ ký của commit

Muốn kiểm tra commit đã có chữ ký chuẩn hay chưa, anh em dùng lệnh sau:

git log -1 --show-signature

Kết quả hiển thị thông tin chứng chỉ X.509, đơn vị phát hành và log index trên Rekor:

commit a1b2c3d4e5f67890123456789abcdef012345678
gitsign: Valid signature from: [email protected]
gitsign: Issuer: https://github.com/login/oauth
gitsign: Rekor log index: 12948210
Author: Developer <[email protected]>
Date:   Sun Oct 11 08:30:00 2026 +0700

    feat: implement authentication flow

Mẹo thêm: Bật cache để không phải mở browser liên tục

Mỗi lần commit lại nhảy browser thì khá phiền. Anh em có thể bật credential cache để giữ session trong 1 tiếng:

git config --global gitsign.connectorID "https://github.com/login/oauth"
gitsign cache enable

Chỉ cần đăng nhập một lần vào đầu buổi làm việc. Các commit sau đó được ký tức thì, tốc độ phản hồi dưới 1 giây mà vẫn đảm bảo tính minh bạch.

Share: