Nỗi ám ảnh mang tên “Rotate mật khẩu” trên Production
Nếu bạn từng run tay khi gõ lệnh ALTER USER trên một cụm DB đang gánh hơn 5.000 kết nối đồng thời, bạn không hề cô đơn. Việc thay đổi mật khẩu định kỳ (Password Rotation) là bắt buộc để đảm bảo bảo mật, nhưng nó luôn đi kèm rủi ro gián đoạn dịch vụ.
Kịch bản quen thuộc thường là: Bạn đổi mật khẩu trên MySQL Server, sau đó cuống cuồng cập nhật cấu hình cho hàng loạt microservices. Chỉ vài giây lệch pha, lỗi Access denied sẽ bủa vây log hệ thống. Kết quả là request của người dùng bị fail, và sếp bắt đầu đứng sau lưng hỏi tại sao hệ thống sập.
Mình từng quản lý một hệ thống Fintech với hơn 20 service chạy trên Kubernetes. Dù đã áp dụng Rolling Update, việc cập nhật ConfigMap vẫn có độ trễ nhất định. Khoảng hở 5-10 giây đó đủ để khiến hàng trăm giao dịch thanh toán bị hủy. Đó là lúc mình nhận ra cách làm truyền thống không còn phù hợp với những hệ thống yêu cầu độ sẵn sàng 99.99%.
Tại sao cách đổi mật khẩu cũ luôn gây lỗi?
Vấn đề nằm ở tính nguyên tử (atomic). Trong các phiên bản MySQL trước 8.0.14, một User chỉ được phép có duy nhất một mật khẩu tại một thời điểm. Khi bạn thực thi lệnh thay đổi, mật khẩu cũ bị ghi đè ngay lập tức.
Sự cố xảy ra do độ trễ đồng bộ:
- Phía Server: Đã chuyển sang mật khẩu mới.
- Phía Client (App): Vẫn đang dùng mật khẩu cũ trong Connection Pool hoặc cache cấu hình.
Để xử lý triệt để, chúng ta cần một cơ chế cho phép User sử dụng song song cả mật khẩu cũ và mới trong giai đoạn chuyển tiếp.
Mẹo cũ: Tạo user phụ và những rắc rối kèm theo
Trước đây, các DBA thường tạo một User tạm (như app_user_v2) với quyền hạn tương đương. Sau khi ứng dụng chuyển sang User mới ổn định, User cũ mới bị xóa bỏ.
Cách này giúp tránh downtime nhưng lại tạo ra “rác” trong hệ thống quản lý. Việc sao chép thủ công hàng chục quyền (Privileges) từ User cũ sang User mới rất dễ sai sót, gây ra những lỗ hổng bảo mật khó kiểm soát.
MySQL 8 Dual Password: Giải pháp thay đổi cuộc chơi
Từ bản 8.0.14, MySQL giới thiệu tính năng Dual Password. Đây là cứu cánh thực sự cho anh em DevOps. Một tài khoản MySQL giờ đây có thể sở hữu hai mật khẩu cùng lúc: một mật khẩu chính (Primary) và một mật khẩu phụ (Secondary).
Cơ chế rất thông minh: MySQL sẽ kiểm tra thông tin đăng nhập với cả hai mật khẩu. Chỉ cần khớp một trong hai, kết nối sẽ được chấp nhận ngay lập tức.
Quy trình triển khai 3 bước an toàn
Giả sử user webapp_user đang dùng mật khẩu OldPass123 và bạn cần đổi sang NewPass456.
Bước 1: Thiết lập mật khẩu phụ với RETAIN CURRENT PASSWORD
Thay vì ghi đè, chúng ta sẽ đẩy mật khẩu hiện tại xuống hàng ghế dự phòng.
-- Đặt mật khẩu mới làm chính, giữ mật khẩu cũ làm phụ
ALTER USER 'webapp_user'@'%' IDENTIFIED BY 'NewPass456' RETAIN CURRENT PASSWORD;
Lúc này, cả hai mật khẩu đều có hiệu lực. Các instance cũ vẫn chạy bình thường với OldPass123, không một request nào bị gián đoạn.
Bước 2: Cập nhật ứng dụng
Bây giờ bạn có thể thong thả cập nhật mật khẩu mới vào Vault, ConfigMap hoặc biến môi trường. Sau đó, tiến hành deploy/restart các service theo lộ trình.
Trong quá trình rolling update, hệ thống sẽ tồn tại song song các pod dùng pass cũ và pod dùng pass mới. Cả hai đều kết nối thành công vào Database.
Bước 3: Dọn dẹp với DISCARD OLD PASSWORD
Khi chắc chắn 100% các service đã chuyển sang mật khẩu mới (kiểm tra qua log hoặc monitor), hãy xóa mật khẩu cũ để bảo mật.
-- Xóa bỏ hoàn toàn mật khẩu phụ
ALTER USER 'webapp_user'@'%' DISCARD OLD PASSWORD;
Sau lệnh này, OldPass123 chính thức bị vô hiệu hóa.
Kinh nghiệm thực chiến để tránh “ăn hành”
Dù tính năng này rất mạnh, bạn vẫn nên lưu ý vài điểm quan trọng:
- Kiểm tra version: Tính năng này chỉ có từ MySQL 8.0.14 trở lên. Đừng thử trên MySQL 5.7 kẻo nhận lỗi cú pháp.
- Quản lý quyền: Bạn cần quyền
APPLICATION_PASSWORD_ADMINnếu muốn user tự đổi mật khẩu phụ của chính mình. - Tuyệt đối không quên bước DISCARD: Để hai mật khẩu tồn tại quá lâu là một rủi ro bảo mật nghiêm trọng. Hãy coi Dual Password chỉ là trạng thái tạm thời trong quá trình deployment.
- Theo dõi log: Hãy bật
General Loghoặc dùng Performance Schema để kiểm tra xem còn kết nối nào đang dùng mật khẩu cũ không trước khi thực hiện lệnhDISCARD.
Kỹ thuật Dual Password giúp quy trình vận hành trở nên chuyên nghiệp hơn. Nó xóa bỏ sự phụ thuộc về thời gian giữa đội DBA và Dev. Nếu hệ thống của bạn yêu cầu độ ổn định cao, hãy áp dụng ngay kỹ thuật này trong lần rotate mật khẩu tới.

