Mục tiêu
Bốn bài trước dạy chọn nguyên hàm, giữ secret, mã hoá lưu trữ và TLS. Bài này kiểm thứ khó nhất trong mật mã ứng dụng và cũng là thứ ít được dạy nhất: xoay một khoá trên một hệ thống đang chạy, không có downtime, không mất dữ liệu.
Vì sao nó khó: xoay khoá không phải một thao tác mà là một quá trình có trạng thái trung gian, và trong trạng thái đó hệ thống phải đọc được cả dữ liệu cũ và mới. Làm sai thứ tự thì hoặc bạn mất dữ liệu, hoặc bạn có downtime, hoặc bạn tưởng đã xoay xong mà chưa.
Tình huống — 07:40 sáng thứ Ba. Một thành viên nhóm vừa nhận ra rằng ba tháng trước, một commit đã đưa appsettings.Production.json vào repo. File đó chứa:
| Secret | Dùng ở đâu | Có bao nhiêu dữ liệu phụ thuộc |
|---|---|---|
Crypto:CardKey | Mã hoá cột payments.card_number_encrypted | 2,4 triệu bản ghi |
Jwt:SigningKey (HS256) | Ký access token của chính ta | Mọi token đang lưu hành, sống 15 phút |
Db:ConnectionString | Postgres, tài khoản app_api | — |
Partner:ApiKey | Gọi API đối tác | — |
Repo là private, nhưng nó có bốn fork nội bộ và CI cache đầy đủ.
Việc phải làm. Viết kế hoạch xoay cho cả bốn, và với mỗi cái trả lời:
- Thứ tự — cái nào trước, và vì sao?
- Xoay được không có downtime không? Nếu không thì cần bao lâu?
- Điểm không thể quay lại ở đâu — sau bước nào thì không rollback được?
- Làm sao biết là đã xong?
Câu 3 là câu tính điểm, và nó là câu người ta không hỏi cho tới khi rollback thất bại.
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…