Xác thực giữa máy khách, máy chủ trung tâm và máy chủ chạy trình phát


8

Tôi đang phát triển một trò chơi mã nguồn mở sử dụng sơ đồ máy khách-máy chủ tương tự như Minecraft. Chúng tôi sẽ kiểm soát máy chủ xác thực trung tâm xác minh tài khoản là hợp lệ, trong khi người chơi sẽ chạy máy chủ của riêng họ.

Xác thực ứng dụng khách rất đơn giản, nhưng làm thế nào để máy chủ biết rằng người dùng hợp lệ mà không có bất kỳ quyền truy cập nào là thông tin đăng nhập hoặc mã thông báo phiên?

Ví dụ:

  • Máy khách> Máy chủ Auth: Gửi thông tin đăng nhập của người dùng.
  • Auth Server> Client: Trả lời bằng ID phiên nếu đăng nhập hợp lệ.

Sau đó, máy khách có thể kết nối với máy chủ, nhưng máy chủ không có cách nào xác minh khách hàng là người mà nó nói. Các máy chủ này được điều hành bởi người chơi, giúp họ dễ dàng sửa đổi máy chủ và thu thập dữ liệu người dùng. (Chỉ có thể tin cậy máy chủ trung tâm)

Máy chủ xác thực có thể chấp nhận các kết nối TCP, nhưng tôi tự hỏi liệu HTTPS có dễ dàng hơn trong trường hợp này không, vì nhận được phản hồi dễ dàng hơn so với việc thiết lập trình lắng nghe ở mỗi bên, đặc biệt chỉ cho một vài yêu cầu.

Câu trả lời:


3

Chỉnh sửa: Sau khi đăng bài này, tôi nhận ra đó gần như là câu trả lời chính xác được đưa ra bởi Ali.S (hơi khác một chút nhưng cách tiếp cận tổng thể là như nhau.) Nó bắt đầu như một thứ hoàn toàn khác.

Phương pháp này giả định rằng tất cả các thông tin liên lạc đang được tổ chức trên một loạt các đường hầm an toàn. Làm thế nào bạn đạt được điều này không quan trọng. Tôi muốn đề nghị TLS, nhưng đó chỉ là tôi.

  1. Máy khách => Máy chủ trò chơi Máy khách kết nối với máy chủ trò chơi và bắt đầu phiên đăng nhập.
  2. Máy chủ trò chơi => Máy chủ xác thực Máy chủ trò chơi kết nối với máy chủ xác thực và yêu cầu mã thông báo ID phiên từ máy chủ xác thực. Kết nối này được giữ mở để lắng nghe thành công / thất bại đăng nhập.
  3. Máy chủ trò chơi => Máy khách Mã thông báo ID phiên được gửi lại cho máy khách.
  4. Máy khách => Máy chủ xác thực Máy khách gửi ID phiên tới máy chủ xác thực cùng với tên người dùng và mật khẩu của người dùng và một số thông tin về máy chủ (IP, khóa công khai TLS, v.v. Xem chú thích)
  5. Auth Server => Game Server Máy chủ auth sau đó gửi thông tin về thông tin đăng nhập đến máy chủ trò chơi (trạng thái thành công, tên người dùng, số liệu thống kê, v.v.) bằng ID phiên do khách hàng cung cấp.
  6. Máy chủ trò chơi => Máy khách Máy chủ trò chơi cho khách hàng biết rằng xác thực đã thành công và cho phép họ tham gia.
  7. Tất cả các kết nối ngoại trừ kết nối máy khách ban đầu đến máy chủ trò chơi hiện bị phá bỏ.

Ngoài ra, bạn có thể cung cấp cho các máy chủ trò chơi một cổng chuyên dụng để nghe thông tin đăng nhập. Nếu bạn chọn tuyến đường này, thì luồng sẽ như thế này:

  1. Máy khách => Máy chủ Auth Máy khách gửi tên người dùng, mật khẩu và IP máy chủ đến máy chủ xác thực.
  2. Auth Server => Game Server + Client Nếu đăng nhập thành công, máy chủ auth sẽ gửi một mã thông báo duy nhất đến máy chủ và máy khách trò chơi. Gửi IP của khách hàng đến máy chủ trò chơi để mã thông báo không thể bị đánh cắp.
  3. Máy khách => Máy chủ trò chơi Máy khách sau đó gửi mã thông báo đến máy chủ trò chơi, sau đó nó được xác minh và xóa trên máy chủ trò chơi. Máy chủ trò chơi sau đó cho phép khách hàng vào.

Cách tiếp cận thứ hai này sẽ làm cho việc thực hiện tổng thể dễ dàng hơn một chút.

Chú thích:

Lý do tôi xác định rằng một số thông tin nên được gửi về máy chủ trò chơi đến máy chủ xác thực là để tăng cường quá trình chống lại các trò giả mạo. Máy chủ có thể xác minh thông tin để đảm bảo rằng nó cho phép kết nối mà người chơi mong đợi.

ID phiên sẽ không phải bảo mật bằng mật mã, mặc dù điều đó sẽ khiến việc kết nối giả mạo trở nên khó khăn hơn nếu có.

Nếu bạn chọn đi tuyến đường TLS, bạn có thể thiết lập máy chủ ký tên ký tất cả các certs được sử dụng bởi cơ sở hạ tầng của bạn và thêm nó dưới dạng CA đáng tin cậy trong phần mềm máy khách / máy chủ. Miễn là bạn không để chứng chỉ ký của mình bị lỏng lẻo, bạn sẽ có thể cung cấp một số xác thực hợp lệ.

Để giảm thiểu các cuộc tấn công DoS, hãy thực hiện thời gian chờ kết nối sau 20 giây hoặc ít hơn. Nếu nó tồn tại lâu hơn thế, thì có gì đó không ổn và bạn không cần đợi 3 phút để chờ kết nối hết thời gian chờ.


Lưu ý rằng luồng thay thế của bạn có thể không hoạt động đối với các máy khách đứng sau các thiết bị NAT "song song" (được phân loại là "nghiêm ngặt", theo chương trình Xbox Live của Microsoft). Và có thể gặp sự cố tương tự nếu hai máy khách cùng lúc đứng sau cùng một thiết bị NAT (tùy thuộc vào chi tiết cụ thể về cách thiết bị NAT của chúng xử lý tình huống đó); điều này là do máy chủ trò chơi có thể thấy một cổng + địa chỉ IP khác với máy chủ xác thực, chỉ do NAT. Cách tiếp cận được liệt kê đầu tiên nên hoạt động mà không gặp rắc rối trong mọi trường hợp.
Trevor Powell

Chỉ cần làm cho thuật ngữ rõ ràng, Khách hàng (người chơi) sẽ không có yêu cầu đặc biệt nào được đặt cho họ cho luồng thứ hai. Chỉ có máy chủ trò chơi sẽ cần một bản đồ cổng chuyên dụng cho phương pháp này. Vì nó đã phục vụ trò chơi trên một cổng chuyên dụng, nên điều này không quá nhiều để hỏi. Toàn bộ quá trình được bắt đầu bằng cách máy khách khởi tạo kết nối với máy chủ xác thực, điều mà bất kỳ thiết bị nào trên internet cũng có thể thực hiện, bất kể NAT của họ nghiêm ngặt đến mức nào.
Kaslai

Khi đọc lại bình luận của bạn, tôi nghĩ tôi thấy vấn đề của bạn là gì. Trong trường hợp người dùng sử dụng một số loại cân bằng tải về mặt lý thuyết có thể gửi yêu cầu xác thực qua một IP và yêu cầu kết nối trò chơi qua một IP khác, thì điều đó có thể được giải quyết bằng giải pháp của Ali S.
Kaslai

Vâng, đó là những gì tôi dự định chỉ ra (nhưng có lẽ không làm rõ). Theo NAT "nghiêm ngặt" (theo định nghĩa của Microsoft), máy chủ xác thực và máy chủ trò chơi sẽ không thấy cùng một giá trị IP: Cổng cho một người chơi, do đó, máy chủ xác thực không thể thông báo hữu ích cho máy chủ trò chơi IP / cổng nhìn. Vấn đề này cũng có thể xảy ra với NAT "vừa phải" (tùy thuộc vào việc triển khai NAT cụ thể) nếu có hai người chơi đằng sau một thiết bị NAT, cả hai đều cố gắng gửi từ cùng một số cổng.
Trevor Powell

Ah, tôi chỉ nghĩ rằng IP nên được tính. Cổng không thực sự quan trọng; Nó chỉ để ngăn chặn bên thứ ba độc hại đánh cắp mã thông báo và sử dụng nó ở nơi khác. Sẽ không có vấn đề gì nếu có nhiều người dùng đằng sau cùng một NAT, vì mã thông báo sẽ xác định người dùng thực tế, do đó không có vấn đề va chạm nào phải lo lắng.
Kaslai

2

Các khách hàng nên có một tincông chính.

Khóa riêng phải là số nhận dạng duy nhất mà máy khách nhận được từ máy chủ xác thực. Khóa công khai cũng nên được gửi cho khách hàng.

Trước khi máy khách kết nối với máy chủ trò chơi, nó sẽ gửi một tin nhắn có khóa riêng và ip của máy chủ trò chơi mà nó muốn kết nối tới máy chủ xác thực. Sau đó, máy chủ xác thực sẽ xác minh và tìm sự trùng khớp cho khóa riêng và lưu trữ khóa chung trong hồ sơ của nó.

Máy chủ trò chơi mà máy khách đang kết nối sẽ gửi yêu cầu đến máy chủ xác thực sau khi nhận được khóa chung của máy khách. Nếu máy chủ xác thực có thể xác minh rằng máy khách muốn kết nối với IP đó của máy chủ trò chơi, hãy gửi lại rằng đó là máy khách ổn. Sau đó, máy chủ trò chơi sẽ cho phép khách hàng kết nối.

Khóa riêng chỉ được sử dụng để xác thực ứng dụng khách để máy chủ trò chơi không nhận được id xác thực thực.


1
Tôi nghĩ rằng tôi hiểu quá trình sử dụng. Tôi đã viết lên một loại sơ đồ: i.pyratron.com/MXkZXU.png Thông tin này có vẻ đúng không?
Cyral

@Cyral Điều đó có vẻ đúng.
Tĩnh

1

Có nhiều giải pháp mà tôi có thể nghĩ ra, nhưng đây là giải pháp an toàn nhất:

  1. khách hàng kết nối với máy chủ.
  2. khách hàng yêu cầu một cầu xác thực.
  3. máy chủ kết nối với máy chủ auth, hoạt động như một proxy giữa người chơi và auth. người phục vụ.
  4. máy khách và máy chủ xác thực, tạo thành một phiên SSL qua cây cầu mới được hình thành này.
  5. sử dụng kết nối an toàn này qua cầu nối, khách hàng đăng nhập vào máy chủ xác thực.
  6. máy chủ auth cho máy chủ trò chơi biết liệu đăng nhập có thành công hay không, qua một số kết nối TCP khác. sau đó ngắt kết nối cầu nối / đăng nhập.
  7. Máy khách và máy chủ trò chơi hiện có thể tiếp tục liên lạc (chỉ) qua kết nối đã có (được sử dụng để xác thực).

Lưu ý rằng, trong kịch bản này, máy chủ trò chơi thực sự không có cách nào nghe lén, mặc dù toàn bộ xác thực đang đi qua nó. vì lý do tương tự, ISP của bạn không thể theo dõi những gói bạn gửi tới Facebook hoặc đến từ facebook.


Về mặt kỹ thuật, ISP có quyền truy cập vào dữ liệu thô.
Tĩnh

@HaroldSeefeld Về mặt kỹ thuật không phải là những người đi qua kết nối IPSec / HTTPS.
Ali1S232

1

Cách tôi sẽ làm là bằng cách yêu cầu máy chủ Auth gửi mã thông báo cho Khách hàng sau khi đăng nhập cùng với danh sách các máy chủ Trò chơi được xác thực (để Khách hàng có thể chắc chắn rằng máy chủ Trò chơi hợp lệ).

Sau đó, Khách hàng sẽ gửi mã thông báo đến máy chủ Trò chơi, sau đó sẽ gửi mã đến máy chủ Auth để xác nhận rằng đây là máy khách hợp lệ.

Đăng nhập:

  1. Client to Auth server: tên người dùng và mật khẩu được mã hóa
  2. Xác thực máy chủ cho khách hàng: mã thông báo

Sau này khi tham gia Máy chủ trò chơi:

  1. Client to Game server: mã thông báo được đề cập trước đó
  2. Máy chủ trò chơi đến máy chủ Auth: một lần nữa mã thông báo
  3. Xác thực máy chủ đến Máy chủ trò chơi: nếu mã thông báo hợp lệ thì tín hiệu OK
  4. Máy chủ trò chơi cho khách hàng: cho phép khách hàng tham gia

0

Làm thế nào về việc ký mã thông báo JWT với một bí mật chỉ có máy chủ xác thực và máy chủ trung tâm biết? Nó cho phép bạn ký json, có thể được xác minh sau.


Điều đó có cho phép các máy chủ do người chơi chạy để lấy cắp thông tin đăng nhập của người dùng không?
idbrii

Không, có 2 cách để làm điều này: 1 - khách hàng yêu cầu jwt với máy chủ trong đó, cho phép máy chủ lấy cắp danh tính, nhưng chỉ trên máy chủ của họ (không phải là vấn đề lớn) 2 - JWT chỉ hoạt động một lần
Ben Aubin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.