Bảo mật Secret trong Git với git-crypt: Mã hóa file nhạy cảm không cần Vault

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

Chuyện thật như đùa: Khi file .env lọt vào mắt xanh của bot quét GitHub

Cách đây vài năm, một người bạn của mình vô tình commit file .env chứa toàn bộ thông tin database production lên một repository public. Chỉ chưa đầy 2 phút sau, hệ thống đã ghi nhận hàng chục ngàn request brute-force từ các bot tự động. Kết quả? Cả team phải thức đến 3 giờ sáng để xoay vòng (rotate) toàn bộ API keys và dọn dẹp database. Theo báo cáo của GitGuardian, năm 2023 có tới hơn 12.8 triệu secret bị lộ trên GitHub – đừng để mình là nạn nhân tiếp theo.

Thông thường, chúng ta hay dùng .gitignore để “giấu” file nhạy cảm. Nhưng khi làm việc nhóm, việc gửi file cấu hình qua Slack, Telegram hay Google Drive lại tạo ra một mớ hỗn độn và rủi ro bảo mật. git-crypt sinh ra để giải quyết đúng bài toán này: Giữ secret ngay trong Git nhưng ở dạng mã hóa.

Cân nhắc giữa git-crypt và các giải pháp khác

Trước khi bắt tay vào cấu hình, hãy cùng nhìn nhanh xem git-crypt đứng ở đâu so với các đối thủ:

  • AWS Secrets Manager / HashiCorp Vault: Cực kỳ xịn sò cho doanh nghiệp lớn. Tuy nhiên, nó đi kèm chi phí từ vài chục đến vài trăm USD/tháng và tốn ít nhất vài ngày để setup hệ thống fetch key phức tạp.
  • Environment Variables trên CI/CD: Chỉ giải quyết được lúc deploy. Dev dưới local vẫn phải tự quản lý file .env thủ công.
  • git-crypt: Miễn phí, cài đặt trong 5 phút. File trên máy bạn là văn bản thuần (clear-text), nhưng khi git push, Git tự động mã hóa chúng thành mã nhị phân. Đây là lựa chọn “vừa miếng” nhất cho các dự án vừa và nhỏ.

Tại sao git-crypt lại được lòng Developer?

Điểm ăn tiền nhất của git-crypt là workflow cực kỳ mượt mà. Bạn cứ git addgit commit như bình thường mà không cần thay đổi thói quen. Với những ai không có quyền truy cập, họ chỉ thấy một đống ký tự rác khi mở file trên GitHub.

Tuy nhiên, bạn cần lưu ý: git-crypt không hỗ trợ thu hồi quyền (revoke) linh hoạt. Nếu một thành viên rời team, bạn sẽ phải tạo key mới và mã hóa lại toàn bộ file. Nếu team bạn có nhân sự ra vào liên tục (high turnover), hãy cân nhắc các giải pháp quản lý tập trung như Doppler hay Vault.

Hướng dẫn triển khai git-crypt chi tiết

Mình sẽ hướng dẫn bạn hai cách: dùng Symmetric Key (chia sẻ 1 file key duy nhất) và GPG (quản lý theo định danh từng người).

1. Cài đặt nhanh

Với macOS, Homebrew là lựa chọn gọn nhất:

brew install git-crypt

Nếu dùng Ubuntu hoặc Debian:

sudo apt install git-crypt

2. Cấu hình file cần bảo vệ

Đầu tiên, hãy khởi tạo git-crypt trong thư mục dự án:

git-crypt init

Bây giờ, hãy chỉ định những file bạn muốn mã hóa thông qua file .gitattributes. Ví dụ, mình muốn bảo vệ file .env và toàn bộ certs trong thư mục certs/:

# File .gitattributes
.env filter=git-crypt diff=git-crypt
certs/*.pem filter=git-crypt diff=git-crypt
config/secrets.yml filter=git-crypt diff=git-crypt

Bí kíp nhỏ: Bạn phải khai báo trong .gitattributes trước khi git add file. Nếu lỡ commit file ở dạng rõ (clear-text) trước đó, lịch sử Git vẫn sẽ lưu lại dấu vết cũ. Lúc này, bạn buộc phải dùng các công cụ như BFG Repo-Cleaner để xóa sạch lịch sử commit cũ.

3. Cách 1: Sử dụng Symmetric Key (Phù hợp team nhỏ)

Cách này tạo ra một file key bí mật. Bạn chỉ cần gửi file này cho đồng nghiệp qua các kênh an toàn như Bitwarden Send hoặc 1Password.

Để xuất key, bạn chạy lệnh:

git-crypt export-key ~/my-project.key

Khi đồng nghiệp clone dự án về, họ chỉ cần chạy lệnh sau để giải mã toàn bộ file:

git-crypt unlock /path/to/my-project.key

4. Cách 2: Sử dụng GPG (Chuyên nghiệp và an toàn hơn)

Với GPG, bạn không cần share chung một file key. Mỗi người dùng key cá nhân của họ và bạn sẽ cấp quyền cho từng email cụ thể.

Trước hết, hãy thêm chính bạn vào danh sách được phép giải mã:

git-crypt add-gpg-user [email protected]

Khi có thành viên mới, họ chỉ cần gửi GPG Public Key cho bạn. Bạn import key đó và add họ vào:

gpg --import colleague-public-key.asc
git-crypt add-gpg-user [email protected]

Hệ thống sẽ tự tạo một commit trong thư mục .git-crypt/. Bạn push commit này lên là xong. Đồng nghiệp chỉ cần gõ git-crypt unlock, máy tính sẽ tự tìm key phù hợp để mở khóa.

Kiểm tra lại thành quả

Để chắc chắn không có file nhạy cảm nào bị bỏ sót, hãy chạy lệnh:

git-crypt status

Màn hình sẽ hiển thị danh sách file kèm trạng thái encrypted. Nếu file nào quan trọng mà vẫn báo not encrypted, hãy kiểm tra lại file .gitattributes ngay.

Vài lưu ý thực tế để tránh “ăn hành”

Sau một thời gian dài áp dụng git-crypt, mình đúc kết được vài kinh nghiệm sau:

  • Tuyệt đối không mã hóa .gitignore: Git cần đọc file này ở dạng rõ để biết cái gì cần bỏ qua.
  • Xử lý Staging Area: Nếu bạn sửa .gitattributes mà Git không cập nhật trạng thái mã hóa, hãy thử git rm --cached <file> rồi add lại từ đầu.
  • Sao lưu Key: Nếu mất Symmetric Key, coi như dữ liệu của bạn biến thành rác vĩnh viễn. Hãy cất nó kỹ trong trình quản lý mật khẩu.
  • Tích hợp CI/CD: Với GitHub Actions, hãy lưu nội dung key vào Secret của GitHub, sau đó ghi ra file tạm trong lúc chạy pipeline để thực hiện git-crypt unlock.

Git-crypt là một giải pháp cân bằng cực tốt giữa tính tiện dụng và bảo mật. Nó giúp repository của bạn luôn sẵn sàng để thực thi (ready-to-run) nhưng vẫn đảm bảo kẻ xấu không thể đọc được những thông tin nhạy cảm nhất.

Share: