Mục lục
Bảo mật API trong Microservices
Hôm qua tôi nhận cuộc gọi từ một startup ở TP.HCM: họ vừa phát hiện một nhân viên tạm thời vô tình commit một API key production vào GitHub. Khoảng 45 phút sau đó, một attacker ở Trung Quốc đã dùng key đó để spam 5 triệu requests, gây tổn hại khoảng 200 triệu đồng. Họ không có microservices lúc đó, nhưng nếu có thì vấn đề sẽ còn tệ hơn gấp mười lần.
Đó chính là điều khó hiểu khi bạn xây dựng kiến trúc microservices: mỗi service có cơ chế authentication riêng, mỗi cái lại có thể bị compromise độc lập. Bạn không chỉ phải lo HTTP request từ client bên ngoài, mà còn phải lo service A gọi service B, service B gọi service C... Một lỗi nhỏ ở endpoint nào đó, và toàn bộ chuyên chế sụp đổ.
Vấn đề thực tế không ai muốn nói ra
Trong thực tế, hầu hết các công ty Việt Nam xây dựng microservices mà tôi từng thấy đều có chung một vấn đề: họ quăng tất cả API keys vào .env file, share docker-compose.yml cho cả team, và hy vọng rằng "chưa bao giờ xảy ra vấn đề thì không cần lo". Đó là cách suy nghĩ sai lầm. Thống kê từ Gartner cho thấy 70% security incidents trong các hệ thống microservices liên quan đến authentication hoặc authorization bị sơ hở.
Khi bạn có 20 services, 5 API gateways, và mỗi cái đều cần xác thực với các cái khác, bạn đang chơi với lửa mà không biết. Một cách tiếp cận "brute force" là hardcode credentials ở mọi nơi—nhưng đó chính là cách khiến cơ sở dữ liệu của bạn bị leak lên Pastebin một ngày nào đó.
JWT: Vũ khí phổ biến nhất (và những hạn chế của nó)
JWT được công bố năm 2015 và nhanh chóng trở thành chuẩn de facto. Nó đơn giản: client login, nhận một token, gửi token đó trong header Authorization cho mọi request. Mỗi service có thể verify token mà không cần gọi authorization server. Tuyệt vời, phải không?
Nhưng thực tế không hề đơn giản. JWT có một vấn đề lớn: nó không thể bị revoke ngay lập tức. Nếu một user logout, token của họ vẫn còn hợp lệ cho đến khi nó expire. Nếu một employee bị sa thải, token của họ sẽ hoạt động tới cuối ngày nếu bạn đặt token expiration là 24 giờ (một lỗi lầm phổ biến ở đây).
Chia sẻ bài viết


