Tôi đã ký các commit Git từ năm 2020, và đó là một trong những thực hành bảo mật có vẻ tùy chọn cho đến khi bạn nhận ra việc người khác mạo danh bạn dễ dàng thế nào.
GitHub commit signing sử dụngGPG (GNU Privacy Guard)để chứng minh bằng mật mã rằng bạn, và chỉ bạn, đã thực hiện commit.

Bất kỳ ai cũng có thể đặt cấu hình git của họ để sử dụng tên và email của bạn, đẩy commit lên, và chúng sẽ xuất hiện trên GitHub như thể bạn đã viết chúng.
Thật đấy.
Điểm khác biệt duy nhất?
Sẽ không có huy hiệu “Đã xác minh”.

GPG là gì?

GPG (GNU Privacy Guard) là một triển khai mã nguồn mở của tiêu chuẩn OpenPGP để mã hóa và ký dữ liệu.
Mặc dù nó thường được sử dụng để mã hóa email và tệp tin, nó cũng hoàn hảo để ký các commit Git.
Khi bạn ký một commit bằng GPG, bạn đang tạo ra một chữ ký mật mã chứng minh rằng commit đến từ người có quyền truy cập vào khóa riêng tư của bạn, không chỉ là ai đó biết tên và địa chỉ email của bạn.

Nếu bạn muốn tìm hiểu sâu hơn về tiêu chuẩn OpenPGP, hãy xemđặc tả OpenPGP chính thức.

Tại sao nên ký commit của bạn?

Ví dụ mạo danh trong thực tế

Mạo danh commit không chỉ là lý thuyết.
Dưới đây là một số tình huống mà nó thực sự quan trọng:

  • Đóng góp mã nguồn mở:
    Ai đó có thể gửi một commit độc hại sử dụng danh tính của người bảo trì chính, làm cho nó trông giống như mã đáng tin cậy
  • Môi trường làm việc:
    Kẻ tấn công có quyền truy cập kho lưu trữ có thể commit code dưới danh tính của bạn, có thể khiến bạn bị đổ lỗi cho lỗi hoặc vấn đề bảo mật
  • Dấu vết kiểm tra:
    Trong các ngành công nghiệp được quy định, khả năng chứng minh bằng mật mã ai đã commit code nào có thể rất quan trọng cho việc tuân thủ
  • Tấn công chuỗi cung ứng:
    Kẻ tấn công đã mạo danh nhà phát triển để tiêm mã độc vào các thư viện được sử dụng rộng rãi, ảnh hưởng đến hàng ngàn dự án hạ nguồn

Huy hiệu “Đã xác minh” không chỉ để trang trí.
Nó là bằng chứng cho thấy commit thực sự đến từ chủ sở hữu khóa, không phải chỉ là ai đó đang giả mạo họ.

Có ai thực sự quan tâm không?

Thành thật mà nói?
Hầu hết các nhà phát triển không kiểm tra huy hiệu xác minh trên mọi commit.

Nhưngcác hệ thống thì có quan tâm.
Các tổ chức có thể yêu cầu commit đã ký thông quaquy tắc bảo vệ nhánh.
Các ngành công nghiệp được quy định cần chúng để tuân thủ.
Các công cụ bảo mật gắn cờ các kho lưu trữ không có chúng.
Và khi các cuộc tấn công chuỗi cung ứng xảy ra, commit đã ký là cách duy nhất để chứng minh cái gì là hợp pháp.

Điều này giống như HTTPS 10 năm trước.
Tùy chọn, cho đến khi nó không còn là tùy chọn nữa.

Bạn không thiết lập điều này cho hôm nay.
Bạn đang thiết lập nó cho khi nó quan trọng.

Hướng dẫn này dành cho macOS

Hướng dẫn này tập trung vào macOS sử dụng GPG Keychain, một phần của GPG Suite, cung cấp giao diện GUI đẹp để quản lý khóa.
Nếu bạn đang dùng Linux hoặc Windows, các khái niệm là giống nhau, nhưng bạn sẽ sử dụng các công cụ khác:

  • Linux:
    Sử dụng công cụ dòng lệnhgpg(thường được cài đặt sẵn)
  • Windows:
    Hãy thửGpg4winhoặc cách của Linux nếu sử dụngWindows Subsystem for Linux(WSL).

Các bước cấu hình git là giống nhau trên tất cả các nền tảng.
Giả định rằng bạn có một tài khoản GitHub và khoảng 15 phút.

Bước 1:
Cài đặt Công cụ GPG

Hãy truy cậpgpgtools.orgvà tải xuống GPG Suite.
Nó bao gồm GPG Keychain, cung cấp cho bạn giao diện trực quan để quản lý khóa của bạn thay vì vật lộn với các công cụ dòng lệnh.

Cài đặt nó như bất kỳ ứng dụng Mac nào khác.

Bước 2:
Tạo Khóa GPG của Bạn

Mở GPG Keychain và nhấp vào “New” để tạo một cặp khóa.

Điền vào:

  • Tên:
    Tên thật của bạn (nên khớp với tài khoản GitHub của bạn)
  • Email:
    Email liên kết với tài khoản GitHub của bạn
  • Cụm mật khẩu:
    Chọn một cụm mật khẩu mạnh.
    Bạn sẽ cần cái này mỗi lần ký một commit

Cài đặt quan trọng:

  • Tôi đặt khóa của mình hết hạn sau 1 năm.
    Đây là một thực hành bảo mật tốt.
    Nếu khóa của bạn bị xâm phạm, nó cuối cùng sẽ trở nên vô dụng.
    Bạn luôn có thể gia hạn ngày hết hạn khi nó gần đến.
  • Đảm bảo loại khóa là RSA và ít nhất 4096 bit để có bảo mật tốt.

Nhấp vào “Generate key” và đợi vài giây.

⚠️ Sao lưu Khóa Riêng tư của Bạn

Cụm mật khẩu của bạn bảo vệ khóa riêng tư của bạn, nhưng nó không phải là một bản sao lưu.
Nếu bạn mất chính tệp khóa riêng tư (chẳng hạn như trong quá trình sự cố máy tính hoặc cài đặt lại), ngay cả việc biết cụm mật khẩu của bạn cũng không giúp ích gì.
Không có tệp khóa riêng tư, bạn không thể ký các commit mới ngay cả khi bạn nhớ cụm mật khẩu.

Tùy chọn sao lưu tốt:

  • Xuất khóa riêng tư của bạn (gpg --export-secret-keys --armor YOUR_KEY_ID > private-key.asc) và lưu trữ trong trình quản lý mật khẩu như 1Password hoặc Bitwarden dưới dạng Ghi chú Bảo mật.
    Lưu ý bạn sẽ rất có thể được yêu cầu nhập cụm mật khẩu.Exporting private key
  • Sao lưu toàn bộ thư mục~/.gnupgvào bộ nhớ đám mây được mã hóa
  • Giữ một bản sao được mã hóa trên ổ đĩa ngoài an toàn

Dù chọn phương pháp nào, hãy đảm bảo nó được mã hóa và chỉ bạn mới có thể truy cập.

Bước 3:
Xuất Khóa Công Khai Của Bạn

Trong GPG Keychain, chọn khóa mới của bạn, sau đó vàoExporttừ menu (hoặc nhấp chuột phải vào khóa).

Đảm bảo rằng “Include secret key in exported file”khôngđược chọn và lưu nó ở đâu đó.

Mở tệp đó trong trình soạn thảo văn bản.
Nó sẽ trông giống như thế này:

-----BEGIN PGP PUBLIC KEY BLOCK----- [bunch of random-looking characters] -----END PGP PUBLIC KEY BLOCK----- 
Enter fullscreen modeExit fullscreen mode

Sao chép toàn bộ khối đó.

Bước 4:
Thêm Khóa Công Khai Của Bạn vào GitHub

  1. Truy cập GitHub → Settings → SSH and GPG keys
  2. Nhấp “New GPG key”
  3. Dán khóa công khai của bạn
  4. Nhấp “Add GPG key”

GitHub giờ đã biết khóa công khai của bạn và có thể xác minh các commit được ký bằng khóa riêng tư của bạn.

Bước 5:
Cấu hình Git để Ký Commit

Mở Terminal và chạy các lệnh sau:

Đầu tiên, lấy ID khóa của bạn:

gpg --list-secret-keys--keyid-format=long 
Enter fullscreen modeExit fullscreen mode

Bạn sẽ thấy đầu ra như:

sec rsa4096/ABC123DEF456 2022-01-15 [SC] [expires: 2026-01-15] 
Enter fullscreen modeExit fullscreen mode

PhầnABC123DEF456đó là ID khóa của bạn.

Bây giờ cấu hình git:

# Tell git which key to use (replace with your actual key ID) git config --global user.signingkey ABC123DEF456 # Tell git to sign all commits by default git config --global commit.gpgsign true# Tell git where GPG is located (for macOS) git config --global gpg.program /usr/local/bin/gpg 
Enter fullscreen modeExit fullscreen mode

Nếu bạn muốn xác minh cấu hình của mình:

git config --global--list | grepgpg git config --global--list | grepsigningkey 
Enter fullscreen modeExit fullscreen mode

Bạn sẽ thấy:

commit.gpgsign=true user.signingkey=ABC123DEF456 gpg.program=/usr/local/bin/gpg 
Enter fullscreen modeExit fullscreen mode

Bước 6:
Kiểm tra

Tạo một commit thử nghiệm:

git commit --allow-empty-m"Testing GPG signing" git log --show-signature-1
Enter fullscreen modeExit fullscreen mode

Bạn sẽ thấy “Good signature” trong đầu ra.
Nếu bạn đẩy commit này lên GitHub, bạn sẽ thấy huy hiệu “Verified” đẹp mắt bên cạnh commit của mình.

Lưu ý:
lần đầu tiên bạn thực hiện commit với khóa GPG của mình, nó sẽ yêu cầu bạn nhập cụm mật khẩu và thêm nó vào keychain của Apple.
Điều này hoàn toàn bình thường và đây là cách bạn sẽ tránh được việc bị nhắc nhập cụm mật khẩu mỗi lần.

Gia hạn Khóa Của Bạn (Khi Nó Hết hạn)

Khi khóa của bạn sắp hết hạn, GPG Keychain giúp việc gia hạn trở nên dễ dàng:

  1. Mở GPG Keychain
  2. Chọn khóa của bạn
  3. Nhấp đúp để mở chi tiết khóa
  4. Nhấp nútChange...bên cạnh ngày hết hạn
  1. Chọn ngày hết hạn mới (Tôi thường gia hạn thêm một năm)
  1. Nhập cụm mật khẩu của bạn để xác nhận

Bạn không cần cập nhật bất cứ điều gì trên GitHub.
ID khóa vẫn giữ nguyên, vì vậy git và GitHub tiếp tục hoạt động mà không cần bất kỳ thay đổi nào.

Khắc phục Sự cố

“gpg failed to sign the data”

Điều này thường có nghĩa là:

  1. GPG không tìm thấy khóa của bạn:
    Kiểm tra kỹ ID khóa của bạn vớigpg --list-secret-keys
  2. Vấn đề với cụm mật khẩu:
    Lời nhắc cụm mật khẩu của bạn có thể bị ẩn.
    Thử chạyecho "test" | gpg --clearsignđể kích hoạt nó
  • Đường dẫn GPG sai:
    Đảm bảo lệnhgit config --global gpg.programtrỏ đến đúng vị trí
  • Trên macOS, nếu bạn cài đặt qua GPG Tools, đường dẫn phải là/usr/local/bin/gpg.

    “Không có khóa bí mật”

    Điều này có nghĩa git đang tìm kiếm một khóa không tồn tại.
    Chạy lệnh:

    gpg --list-secret-keys
    Chế độ toàn màn hìnhThoát chế độ toàn màn hình

    Đảm bảo ID khóa trong cấu hình git của bạn khớp với một trong các khóa được liệt kê.

    Commit vẫn hiển thị là chưa xác minh trên GitHub

    Kiểm tra xem:

    1. Email trong cấu hình git của bạn khớp với email trên khóa GPG
    2. Email đã được xác minh trong tài khoản GitHub của bạn
    3. Bạn đã tải khóa công khai lên GitHub

    Tổng kết

    Thiết lập này mất khoảng 15 phút, nhưng một khi đã cấu hình xong, bạn không cần phải bận tâm nữa.
    Mọi commit bạn tạo sẽ tự động được ký và bạn nhận được huy hiệu xác minh chứng tỏ đó thực sự là code của bạn.

    Nếu bạn làm việc với mã nguồn mở hoặc trong môi trường nơi nguồn gốc code quan trọng, commit được ký không phải là tùy chọn.
    Chúng là yêu cầu bắt buộc.
    Hãy thiết lập ngay bây giờ khi bạn đang nghĩ về nó.

    Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!