Xóa khóa API khỏi tệp chưa phải là xong, vì git vẫn nhớ. Thứ tự đúng khi lộ khóa và cách chặn từ đầu.
Hàng xóm đã đúc bản sao trong ngày chìa còn dưới thảm. Bản sao vẫn ở ngoài.
Chìa cũ, kể cả bản sao, không còn mở được gì. Đây là cách chắc chắn duy nhất.
Thứ ai cầm được là dùng được: khóa API, mật khẩu, mã truy cập. Như chìa khóa nhà.
Mọi commit từ trước đến nay. Xóa dòng ở commit mới không xóa ở commit cũ.
Tạo khóa mới, chuyển nơi dùng sang, rồi vô hiệu khóa cũ. Như đổi ổ khóa.
Vô hiệu hóa khóa ngay để nó không còn mở được gì.
Giá trị đặt ngoài code, chương trình đọc lúc chạy. Như chìa khóa để ở hộp riêng.
Đoạn lệnh git tự chạy ngay trước khi lưu commit, có thể từ chối lần lưu đó.
Tệp hiện tại sạch: grep và git grep không in ra gì.
Cặp khóa ví dụ có sẵn trong tài liệu AWS. Kho thử, Git 2.56.0, chạy thật.
Ba lệnh, dưới một giây: ai có kho này cũng đọc lại được cả hai khóa.
Tệp sạch không có nghĩa kho sạch. Phải tìm trong lịch sử.
Tài liệu secret scanning của GitHub cũng khuyên xoay ngay, và nói xóa khỏi lịch sử là chậm, thường không cần khi khóa đã thu hồi.
Khóa cũ còn hoạt động, lúc này có hai khóa.
Mọi ứng dụng và công cụ sang khóa mới.
Biết khóa cũ còn ai dùng không.
Đổi khóa cũ sang Inactive trước.
Nơi nào còn dùng khóa cũ sẽ hỏng.
Sau một thời gian mới xóa khóa cũ.
| Phút | Việc | Trong 15 phút? |
|---|---|---|
| 0 đến 2 | Vô hiệu hóa khóa bị lộ | Được |
| 2 đến 5 | Tạo khóa mới, lưu vào nơi cất | Được |
| 5 đến 10 | Cập nhật các nơi dùng | Nếu ít nơi |
| 10 đến 15 | Kiểm ứng dụng, báo người liên quan | Được |
| Sau đó | Đọc nhật ký, dọn lịch sử, xoay khóa liên quan | Không |
Mốc mục tiêu do tác giả đề xuất, không phải số đo. Thời gian thật tùy quyền truy cập và việc bạn biết khóa dùng ở đâu.
Ghi vào .gitignore trước khi tạo tệp. Tệp đã được theo dõi thì git vẫn theo dõi.
Muốn ngừng theo dõi: git rm --cached. Khóa trong lịch sử vẫn còn.
Bộ quét 30 dòng Python, cả lần thử mất khoảng 0,14 giây.
Khóa tách làm hai chuỗi rồi nối lại: commit vẫn qua (mã 0).
Dòng password = "change-me-please" chỉ là chữ giữ chỗ nhưng bị chặn.
Nhánh main sau khi viết lại bằng filter-branch (khoảng 0,8 giây, 5 commit).
Nhánh sao lưu refs/original và reflog: phải xóa rồi chạy gc mới sạch.
Bản sao chụp trước khi viết lại: git log -S vẫn thấy cả hai commit.
Xoay khóa trước, đọc nhật ký, rồi mới dọn lịch sử. Giữ bí mật ngoài code, chặn lúc commit, và luôn đọc diff.