De-identified authentication at scale (Anonymous Credential Service)

Bài tóm tắt Meta 2022 3. Quy mô lớn Độ khó: Khó

Meta · 2022 · 3. Quy mô lớn · Độ khó: Khó — bài gốc

Bài về dịch vụ chung của Meta đứng sau WhatsApp 2021; được tính vào timeline WhatsApp vì DIT là use case lớn nhất.

Bối cảnh

  • Meta trước đó giảm dữ liệu bằng cách khử định danh hoặc gộp sau khi thu, cách làm bị động và tốn tài nguyên ở quy mô của họ. Hướng mới: khử định danh ngay tại nguồn bằng xác thực ẩn danh.
  • Xác thực theo user ID là cách chống scraping, spam, DDoS phổ biến; bài toán là giữ được lớp bảo vệ đó mà không cần biết user là ai.

Thay đổi chính

  • ACS (Anonymous Credential Service): dịch vụ multi-tenant, sẵn sàng cao, cho client xác thực ẩn danh. Giao thức ba pha: setup (lấy public key), cấp token (client làm mù token, server ký, client gỡ mù và tính shared_secret), đổi token (gửi token gốc, dữ liệu và HMAC bằng shared_secret qua kênh ẩn danh). Token lúc ký và lúc đổi không nối được với nhau.
  • Use case: DIT của WhatsApp cần hàng trăm nghìn request/giây (2022); federated learning là hướng tiềm năng (chống cập nhật model giả mà không biết ai gửi).
  • Kiến trúc: service C++ trên Twine (hệ điều phối container của Meta), cân bằng tải toàn cầu, mỗi vùng tự scale theo nhu cầu; API Thrift cho cấp và đổi token.
  • Cô lập theo use case: mỗi request ghi tên use case, mỗi use case có khoá riêng, nên token cấp cho use case này không đổi được ở use case khác (ví dụ user Facebook với user Instagram có cơ chế xác thực khác nhau). Xoay khoá định kỳ bằng hạ tầng job bất đồng bộ, khoá cất trong keychain service; một job khác phát public key mới cho client.

Bài học khi scale (theo Meta)

  • Chi phí tăng tuyến tính với traffic: mỗi use case mới lại cần thêm máy theo tỉ lệ 1:1, đúng lúc chuỗi cung ứng server khan hiếm. Cách giải: cho mỗi use case đặt giới hạn dùng lại credential; bộ đếm số lần đổi token lưu trên ZippyDB, quá giới hạn thì từ chối. Use case nhạy cảm đặt giới hạn 1 (không dùng lại).
  • Đỉnh nhân tạo: một use case lớn cache dữ liệu trên điện thoại rồi gửi lô cùng một giờ mỗi đêm, thực chất là tự DDoS ACS. Sửa cho use case đó bằng dithering (rải thời điểm gửi); sửa chung bằng rate limiter toàn cục cùng đội traffic, bỏ bớt traffic ACS khi vượt ngưỡng.
  • Onboarding cần chuyên gia: ban đầu mỗi use case mới cần một người trong đội ngồi giải thích và cấu hình tay. Chuyển sang cổng tự phục vụ (React), SDK Android/iOS với hàm cấp cao kiểu fetch-acs-token, wiki và codegen, để đội khác dùng mà không cần hiểu mật mã.

Bài học cho SWE

  • Một primitive bảo mật chỉ lan rộng khi có dạng dịch vụ multi-tenant và SDK, không bắt mỗi đội tự làm mật mã.
  • Client di động gửi theo lịch cố định là nguồn thundering herd kinh điển; luôn thêm jitter.
  • Núm "dùng lại token" là đánh đổi trực tiếp giữa chi phí máy và mức riêng tư, nên để mỗi use case tự chọn trong giới hạn.

Liên quan