git log - git stash - git rebase - git filter-repo

Vì sao lệnh `git log` vẫn hiển thị thông tin cá nhân của bạn: Git Commit Lịch sử không bao giờ quên

Vì sao lệnh `git log` lại để lộ thông tin bí mật ngay cả sau khi chúng đã bị "xóa"?

Xóa một dòng khỏi tệp và commitViệc thực hiện thay đổi không thực sự xóa dữ liệu nhạy cảm khỏi kho lưu trữ của bạn. Nếu bí mật đó, chẳng hạn như khóa API, thông tin xác thực hoặc mã thông báo, đã từng được lưu trữ, thì dữ liệu đó vẫn có thể bị xóa. commitTed, nó nằm trong lịch sử Git của bạn. Bất kỳ ai đang chạy git log -p, chương trình githoặc kiểm tra sự khác biệt so với trước đây. commitvẫn có thể lấy lại được nó.

Ngay cả khi bạn ghi đè lên một tập tin hoặc thay thế giá trị, git-log Nó bảo toàn toàn bộ lịch sử của mọi thay đổi. Đây là điều được thiết kế sẵn. Toàn bộ mô hình của Git dựa trên tính bất biến. commit lịch sử và các bản sao được phân phối. Vì vậy, trừ khi bạn cố tình viết lại lịch sử, bí mật của bạn vẫn còn đó. Dưới đây là một ví dụ thực tế:

⚠️ Đây chỉ là ví dụ minh họa, không được sử dụng trong môi trường sản xuất.

Quá muộn rồi. git-log vẫn hiển thị chìa khóa đó ở phần ban đầu commit.

Những hiểu lầm xung quanh git stash và git rebase

Nhiều nhà phát triển cho rằng kho git Giúp che giấu hoặc xóa bỏ bí mật. Không đúng. kho git chỉ có kệ thư mục làm việc Thay đổi tạm thời; nó không bao giờ chạm tới commit lịch sử. Nếu một bí mật từng tồn tại commitTed, việc lưu trữ các thay đổi sau đó không giúp làm sạch nó chút nào.

Thế còn cơ sở git rebaseMặc dù nó có thể viết lại lịch sử, nhưng điều đó phải được thực hiện trước đó.cisely. Chỉ đang chạy git rebase -i và sắp xếp lại hoặc nén lại commits không xóa các bí mật trừ khi bạn chỉnh sửa hoặc xóa chúng một cách rõ ràng. Và nếu thậm chí chỉ có một bản sao hoặc bản phân nhánh tồn tại với bản gốc. commitBí mật của bạn vẫn còn đó.

Tệ hơn nữa, việc rebase mà không force-push đúng cách hoặc phối hợp lại với cộng tác viên có thể làm lộ lại thông tin đăng nhập thông qua các thao tác merge.

⚠️ Đây chỉ là ví dụ minh họa, không sử dụng trong môi trường thực tế.

⚠️ Đây chỉ là ví dụ minh họa, không nên chạy trên kho lưu trữ sản phẩm thực tế.

Chỉnh sửa commit Chứa đựng bí mật, nhưng quên không gỡ bỏ nó. trên màn hình git-log Might xem Sạch hơn, nhưng nội dung nhạy cảm vẫn có thể khôi phục được.

Rủi ro thực tế từ việc quên thông tin đăng nhập trong lịch sử Git

Đây không phải là lý thuyết suông. Kẻ tấn công chủ động quét các kho lưu trữ công khai và riêng tư để tìm kiếm những bí mật ẩn giấu bên trong. commit lịch sử. Các nhánh GitHub, kho lưu trữ sao chép và bộ nhớ cache. CI/CD pipelineTất cả chúng đều có thể lưu giữ những kỷ vật bị lãng quên đó.

  • Khóa API bị rò rỉ từ một dự án cũ. git-log Điều này đã dẫn đến việc một công ty khởi nghiệp phải trả hàng nghìn đô la phí dịch vụ đám mây.
  • Mã thông báo OAuth commitCác lệnh ted, sau đó "deleted", được sử dụng để chiếm đoạt tài khoản người dùng.
  • Những bí mật được chôn giấu sâu trong các nhánh mã nguồn mở đã gây ra các sự cố bảo mật nghiêm trọng.

Những vấn đề này có quy mô lớn. CI/CDMỗi tác vụ sao chép kho lưu trữ đều chạy git-log Ẩn sâu bên trong, và mọi sản phẩm tạo ra từ quá trình xây dựng đều có khả năng chứa dấu vết của những bí mật bị lộ.

Dọn dẹp dữ liệu nhạy cảm bằng git filter-repo

Nếu đã xảy ra hư hỏng, công cụ đáng tin cậy nhất để làm sạch là... git bộ lọc-repo. không giống cơ sở git rebase, viết lại hệ thống riêng biệt, commits, git bộ lọc-repo có thể viết lại toàn bộ commit Lịch sử dựa trên đường dẫn tệp, mẫu hoặc nội dung.

Ví dụ: để loại bỏ tất cả các lần xuất hiện của config.json có thể chứa đựng những bí mật:

⚠️ Ví dụ mang tính chất giáo dục, hãy kiểm tra trong kho lưu trữ thử nghiệm trước khi sử dụng trong môi trường sản xuất.

Hoặc để xóa tất cả commitcác chuỗi ký tự cụ thể (ví dụ: AWS_SECRET_ACCESS_KEY):

⚠️ Ví dụ mang tính chất giáo dục, hãy kiểm tra trong kho lưu trữ thử nghiệm trước khi sử dụng trong môi trường sản xuất.

Hãy cẩn thận: Thao tác này sẽ viết lại. commit mã băm. Bạn sẽ cần phải thực hiện thao tác đẩy bắt buộc và thông báo cho tất cả cộng tác viên. Bất kỳ khóa tự động hóa hoặc triển khai nào được liên kết với commit Mã băm sẽ bị lỗi.

Ngoài ra, các công cụ như BFG Repo Cleaner Chúng cung cấp các chức năng tương tự nhưng kém linh hoạt hơn và hiện được coi là lỗi thời đối với các trường hợp phức tạp.

Ngăn chặn rò rỉ thông tin bí mật trước khi chúng đến được Git.

Phòng ngừa tốt hơn là khắc phục hậu quả. Dưới đây là cách ngăn chặn những bí mật bị lộ ra ngoài. git-log:

1. Pre-commit Hooks

Sử dụng các công cụ như pre-commit, gitleaks, hoặc là bùa phù hộ để tìm kiếm bí mật trước commits:

2. CI/CD Pipeline Thực thi

Tích hợp phát hiện bí mật Thêm điều này vào các tác vụ CI của bạn. Dừng quá trình xây dựng khi phát hiện ra các bí mật. Hãy biến điều này thành chính sách.

3. Quản lý bí mật

Tuyệt đối không nên mã hóa cứng thông tin đăng nhập. Hãy sử dụng biến môi trường, kho lưu trữ hoặc trình quản lý bí mật ngay từ đầu.

4. Các mối phụ thuộc kiểm toán

Đừng tin tưởng mù quáng vào các gói phần mềm của bên thứ ba. Bí mật có thể bị rò rỉ. thông qua npm, PyPI hoặc các lớp Docker.

Khắc phục lỗi cuối cùng: Loại bỏ các bí mật bằng git filter-repo

Việc xóa bỏ các thông tin bí mật khỏi mã nguồn là chưa đủ. git-log Nó lưu giữ đầy đủ hồ sơ trừ khi bạn cố tình viết lại lịch sử. Đừng dựa vào... kho git hoặc chưa chín kỹ cơ sở git rebase nỗ lực. Sử dụng git bộ lọc-repo Khi bạn cần dọn dẹp kỹ lưỡng và thực thi các chính sách cũng như quét trước khi các thông tin bí mật được đưa vào kho lưu trữ của bạn.

Để chủ động phát hiện các bí mật, hãy cân nhắc sử dụng các công cụ như... Xygeni để bảo đảm của bạn pipelines, thực thi commit Vệ sinh và ngăn ngừa những rò rỉ tốn kém trước khi chúng bị phát hiện. Git không bao giờ quên, nhưng bạn có thể đảm bảo rằng nó không bao giờ nhớ bí mật của bạn ngay từ đầu.

sca-tools-software-composition-analysis-tools
Ưu tiên, khắc phục và bảo mật các rủi ro phần mềm của bạn
Đăng ký tài khoản miễn phí ngay.
Không cần thẻ tín dụng.

Bảo mật quá trình phát triển và phân phối phần mềm của bạn.

với bộ sản phẩm Xygeni