Ba tầng, và lockfile chỉ phủ một
Câu hỏi để kiểm một build có tái lập được hay không rất đơn giản: build lại cùng một commit sáu tháng sau có ra cùng một artifact không? Với gần như mọi dự án, câu trả lời là không — và ba tầng dưới đây là ba lý do.
| Tầng | Ghim bằng gì | Lockfile có phủ? |
|---|---|---|
| Package của ngôn ngữ | packages.lock.json, package-lock.json | Có |
| Base image | digest sha256:..., không phải tag | Không |
| Công cụ trong CI | SHA của commit, không phải tag | Không |
Hai tầng dưới là hai tầng bị bỏ, và chúng bị bỏ vì cùng một lý do: tag trông như một phiên bản nhưng nó là một con trỏ có thể di chuyển.
FROM node:20 không nói "phiên bản 20" mà nói "bất cứ image nào đang được gắn nhãn 20 lúc này". Nhãn đó được cập nhật mỗi khi có bản patch, nên hai lần build cách nhau một tuần dùng hai image khác nhau. Thường đó là điều tốt (bản vá bảo mật tự về), và đó chính là lý do người ta để nguyên — nhưng nó cũng có nghĩa là bạn không biết mình đang chạy gì, và một image bị chèn code sẽ về theo cùng đường đó.
uses: actions/checkout@v4 còn tệ hơn về mặt tin cậy: v4 là một git tag, và git tag di chuyển được bởi bất kỳ ai có quyền push lên repo của action đó. Một action chạy trong workflow của bạn với token của workflow — tức là quyền đọc/ghi repo và secret.
Đánh đổi phải nói ra: ghim theo digest nghĩa là bản vá bảo mật không tự về. Bạn đổi "cập nhật âm thầm, không kiểm soát" thành "cập nhật có kiểm soát, phải chủ động". Đánh đổi đó chỉ đáng nếu bạn thật sự có cơ chế cập nhật — nên ghim mà không có Dependabot hay Renovate là làm hệ thống tệ hơn, không tốt hơn.
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…