Ba chỗ secret bị lộ, và chỉ một chỗ được nhắc tới
"Đừng commit secret vào git" là lời khuyên ai cũng biết, và nó phủ đúng một trong ba chỗ. Hai chỗ còn lại lộ secret cho nhiều người hơn và ít ai kiểm.
| Chỗ | Ai đọc được | Vì sao ít ai kiểm |
|---|---|---|
| Lịch sử git | Ai clone được repo | Được biết, nhưng người ta kiểm file hiện tại chứ không kiểm lịch sử |
| Biến môi trường của CI | Ai sửa được pipeline, và mọi log của mọi lần chạy | Nó trông như cách làm đúng |
| Image container | Ai pull được image, kể cả từ registry nội bộ | ENV và layer bị xoá vẫn còn trong image |
Chỗ thứ hai đáng nói vì nó là cách làm được khuyên: "đưa secret vào biến môi trường thay vì file". Đúng, nhưng chưa đủ — biến môi trường trong CI có ba đường lộ:
- Một bước build in ra
envđể debug, và log đó lưu 90 ngày. - Một script
set -xin mọi lệnh kèm giá trị biến. - Một dependency trong build đọc
process.envvà gửi đi (đây là supply chain, module 6).
Chỗ thứ ba là chỗ tinh vi nhất: RUN rm secret.txt trong Dockerfile không xoá gì cả. Mỗi RUN tạo một layer, và layer trước vẫn nằm trong image — docker history và một lệnh tar trên layer đó lấy lại được file. Cùng lý do đó áp cho ARG mang secret vào build.
Và điều quan trọng nhất của bài này: khi một secret đã lộ, xoá nó không phải bản vá — xoay nó mới là bản vá. Một commit đã push thì tồn tại trong mọi clone, mọi fork, mọi bản cache của CI, và trong index của bất kỳ ai đang quét GitHub. git rebase để xoá nó khỏi lịch sử là dọn dẹp; nó không lấy lại được cái đã đi ra. Thứ tự đúng luôn là: xoay trước, dọn sau.
Bình luận
Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.
Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.
Đang tải bình luận…