Mục lục
- 1. Hai hệ thống nói chuyện với nhau bằng gì
- 2. Token là gì, và vì sao nó tốt hơn gửi mật khẩu mỗi lần
- 3. Điểm yếu cố hữu: ai cầm được token là dùng được
- 4. Tại Cloudzone: bốn cửa chứ không một
- 5. Danh sách IP - lớp khoá mà kẻ trộm khoá không mang theo được
- 6. Quyền hẹp: đăng ký thứ gì dùng được thứ đó
- 7. Nói thẳng: token của Cloudzone không tự hết hạn
- 8. Bốn việc phía bạn phải làm
Khi hệ thống của quý Khách hàng tự đặt một máy ảo, tự gia hạn dịch vụ cuối tháng, hay tự tạo tài khoản lưu trữ cho khách/đối tác mới, thì thứ đứng giữa hai bên là một kênh API. Kênh đó toàn quyền từ khởi tạo, gia hạn, thanh toán dịch vụ, ... Nên câu hỏi đầu tiên không phải "gọi thế nào" mà là xác thực - "ai được gọi".
Bài này nói về cơ chế bảo mật của một kênh API nói chung, rồi liên hệ đến kênh API của Cloudzone để phân tích ngoài token còn những lớp bảo mật nào để bảo vệ các kênh đấu nối API này.
1. Hai hệ thống nói chuyện với nhau bằng gì
Một user thông thường sẽ đăng nhập bằng tên và mật khẩu. Máy móc thì không: không có ai ngồi gõ, không có màn hình để hiện ô đăng nhập, và lời gọi có thể xảy ra hàng nghìn lần một ngày.
Cách làm phổ biến là cấp phát token. Bên cung cấp dịch vụ giao cho bên tích hợp một bộ thông tin nhận dạng. Bên tích hợp dùng bộ đó đổi lấy một chuỗi gọi là token. Từ đó về sau, mỗi lời gọi mang token đi kèm, và máy chủ nhìn token để xác thực và biết ai đang gọi.
Nghe thì giống mật khẩu, nhưng khác ở chỗ quan trọng: token là thứ cấp ra được và thu hồi được mà không phải đụng tới tài khoản gốc.
2. Token là gì, và vì sao nó tốt hơn gửi mật khẩu mỗi lần
Token là một chuỗi ký tự do máy chủ sinh ra, gắn với đúng một tài khoản và đúng một phạm vi quyền. Ba lợi ích thật của nó:
- Mật khẩu gốc không phải đi lại trên đường truyền liên tục. Bạn dùng nó một lần để lấy token, sau đó làm việc bằng token.
- Thu hồi được riêng lẻ. Nghi một đoạn tích hợp bị lộ thì huỷ token đó, các đoạn khác và tài khoản đăng nhập vẫn chạy bình thường.
- Giới hạn được phạm vi. Một token có thể chỉ được đọc, hoặc chỉ được chạm vào một nhóm dịch vụ.
Đó là lý do gần như mọi API nghiêm túc đều đi theo hướng này, thay vì bắt hệ thống của khách lưu mật khẩu đăng nhập rồi gửi đi mỗi lần gọi.
3. Điểm yếu cố hữu: ai cầm được token là dùng được
Đây là chỗ nhiều người khi triển khai hệ thống bỏ qua. Token là thông tin mang theo: máy chủ không biết người gửi là ai, nó chỉ biết chuỗi gửi lên có đúng hay không. Nghĩa là bất kỳ ai có được chuỗi đó đều gọi được, từ bất kỳ đâu.
Token rò ra ngoài theo những đường rất thông thường: lọt vào nhật ký hệ thống, nằm trong mã nguồn đẩy lên kho chung, gửi qua tin nhắn cho đồng nghiệp, hoặc còn nguyên trong máy của người đã nghỉ việc.
Vì vậy một kênh API chỉ dựa vào token là một kênh chỉ có một lớp khoá. Mất chìa khóa dù vô tình hay cố ý có thể để cho người khác toàn quyền xâm nhập hệ thống.
4. Tại Cloudzone: API được thiết lập kết hợp nhiều cơ chế bảo mật/xác thực
Kênh API của Cloudzone không giao cho bạn một chuỗi duy nhất. Bạn nhận ba giá trị khác nhau, và chúng dùng để lấy giá trị thứ tư:
- Email tài khoản - gắn kênh API vào đúng tài khoản Portal của bạn.
- Mật khẩu API - riêng cho kênh API, không phải mật khẩu đăng nhập Portal.
- Khoá bí mật - giá trị thứ hai phải có, để một mình mật khẩu API không đủ.
- Token - đổi từ ba giá trị trên mà ra.
Điểm khác biệt nằm ở bước sau: mọi lời gọi về sau phải mang đủ cả bốn, không phải riêng token. Bị mất token hoặc 1 trong các bí mật trên sẽ không hoàn toàn khai thác được thông tin.
Vì sao tách mật khẩu API khỏi mật khẩu Portal: hai thứ này có vòng đời khác nhau. Bạn đổi mật khẩu đăng nhập vì lý do cá nhân bất cứ lúc nào, nhưng đoạn tích hợp đang chạy thì không nên chết theo. Tách ra thì hai việc không kéo nhau.

5. Danh sách IP - lớp khoá mà kẻ trộm khoá không mang theo được
Đây là lớp đáng nói nhất, vì nó bù đúng vào điểm yếu ở mục 3.
Khi đăng ký quyền API, bạn khai địa chỉ IP công cộng của máy chủ sẽ gọi API, tối đa năm địa chỉ. Lời gọi đến từ địa chỉ ngoài danh sách bị từ chối ngay, trước cả khi hệ thống xét tới bộ khoá.
Ý nghĩa thực tế: kẻ lấy được đủ bộ khoá của bạn vẫn không gọi được, trừ khi họ đứng sẵn trên chính máy chủ bạn đã khai. Khoá thì chép đi được, còn địa chỉ IP nằm trong whitelist thì không.
Ba điều nên biết trước khi khai:
- Phải là IP công cộng mà máy chủ của bạn đi ra Internet, không phải địa chỉ trong mạng nội bộ. Khai nhầm dải nội bộ thì hệ thống chặn ngay ở bước kết nối.
- Hệ thống khớp từng địa chỉ một, không nhận cả dải mạng. Chặt hơn, nhưng cũng nghĩa là mỗi máy chủ phải khai riêng.
- Nên dùng IP tĩnh. Đường mạng cấp IP động thì mỗi lần nhà mạng đổi là kênh ngắt cho tới khi danh sách được cập nhật lại.
Danh sách này nằm trong trang Quản lý API của Portal và bạn tự sửa được. Đổi máy chủ, thêm một máy nữa, hay nhà mạng cấp dải khác: khách hàng cần sửa ngay trong Portal, có hiệu lực lập tức, không phải gửi yêu cầu mới rồi chờ duyệt lại.
6. Quyền hẹp: đăng ký dịch vụ sử dụng trong API
Lúc đăng ký, bạn chọn nhóm dịch vụ cần dùng: VPS Việt Nam, VPS GPU, máy chủ Proxy, dịch vụ Hosting, Lưu trữ Cloudzone Box, ... Chọn đúng thứ bạn cần, không cần đăng ký hết.
Kèm theo đó, trang API trong Portal cho bạn thấy ngày được cấp quyền và lần gọi API gần nhất. Con số thứ hai là thứ nên nhìn định kỳ: một kênh lẽ ra chạy hằng ngày mà lần gọi gần nhất đã lâu thì hoặc đoạn tích hợp đã chết, hoặc có vấn đề kỹ thuật cần xem lại.
7. Token của Cloudzone không tự hết hạn
Nhiều hệ thống cho token tuổi thọ ngắn, hết hạn thì bên tích hợp tự lấy token mới. Cloudzone hiện không làm vậy: token lấy một lần rồi dùng tiếp, gọi lại lệnh lấy token thì vẫn trả về đúng giá trị cũ.
Tuy nhiên, để nâng cao bảo mật và dự phòng khả năng có thể bị lộ API token key và cần phải đổi, trang API trong Portal có nút Cấp lại khoá: bấm là hệ thống sinh mật khẩu API và khoá bí mật mới, token đổi theo, và bộ cũ ngừng hoạt động ngay lập tức.
Đánh đổi ở đây là gì: token dài hạn thì đoạn tích hợp của bạn đơn giản hơn, không phải viết cơ chế tự lấy token mới. Đổi lại, nó đặt trách nhiệm lên hai thứ khác: danh sách IP giữ cửa, và bạn chủ động cấp lại khoá khi nghi ngờ. Bấm Cấp lại khoá thì mọi hệ thống đang dùng bộ cũ sẽ ngừng gọi được cho tới khi bạn cập nhật.
8. Bốn việc cần lưu ý
Hạ tầng chỉ giữ được phần của hạ tầng. Phần còn lại nằm ở cách khách hàng sử dụng:
- Đừng ghi bộ khoá vào nhật ký hệ thống. Nhật ký là nơi rò rỉ phổ biến nhất, vì nó thường được chia sẻ rộng hơn mã nguồn.
- Đừng để khoá trong mã nguồn đẩy lên kho chung. Đặt trong biến môi trường hoặc kho bí mật riêng.
- Đổi người phụ trách thì cấp lại khoá, giống như đổi khoá cửa truy cập hệ thống.
- Gọi API từ máy chủ có IP tĩnh, đừng gọi từ máy cá nhân qua đường mạng gia đình.
Và một điều kỹ thuật khi tích hợp nên biết trước: mọi phản hồi của API Cloudzone đều trả về HTTP 200, kết quả thật nằm trong trường trạng thái của phản hồi. Nếu chỉ dựa vào mã HTTP mà kết luận thành công có thể dẫn đến nhầm lẫn.
Kênh API mở cho mọi khách hàng Cloudzone, đăng ký ngay trong Portal. Cách đăng ký và những gì đặt được qua API, mời Quý khách hàng xem bài API Cloudzone: khách hàng thêm tùy chọn đặt và quản lý dịch vụ thông qua API. Muốn nhìn rộng hơn về các nhóm lỗ hổng API theo chuẩn OWASP, mời Quý khách hàng xem bài Bảo mật API: lỗ hổng thường gặp theo OWASP API và cách phòng. Cần hỗ trợ tích hợp, mời Quý khách hàng chat với Cloudzone.