Làm thế nào để ngăn chặn máy chủ bị tấn công giả mạo máy chủ chính?


8

Tôi muốn thiết lập một mô hình trò chơi đa lớp dựa trên phòng, nơi người chơi có thể tổ chức các trận đấu và phục vụ như một máy chủ (IE máy chủ có sức mạnh có thẩm quyền). Tôi muốn lưu trữ một máy chủ chính theo dõi các vật phẩm, cấp bậc, tiền mặt, điểm kinh nghiệm, v.v.

Trong một mô hình như vậy, làm cách nào tôi có thể ngăn người nào đó đang lưu trữ trò chơi (với máy chủ đã sửa đổi) giả mạo máy chủ chính với kết quả khớp không hợp lệ, do đó đạt được exp, tiền hoặc thứ hạng.

Cảm ơn. -Cody


4
Câu trả lời chung chung ngắn hơn: bạn không thể. Ngay khi mã thực thi trên một hệ thống không thuộc quyền kiểm soát của bạn, ai đó có thể hack nó bằng cách nào đó, chẳng hạn như chạy một nghìn trận đấu và chỉ báo cáo những kết quả có lợi.
Jari Komppa

1
Tôi đồng ý với @JariKomppa. Ngoài ra, không cần phải đăng bài viết của bạn.
jcora

1
@Cody: Tôi đã đưa ra hai câu trả lời dưới đây, dựa trên các cách hiểu khác nhau về câu hỏi của bạn. Bạn có thể vui lòng cho tôi biết cái nào (nếu có) gần với những gì bạn muốn hỏi không?
Ilmari Karonen

Câu trả lời:


4

Nó đã được chỉ ra rằng câu trả lời trước đây của tôi có thể được dựa trên sự hiểu lầm về những gì bạn có nghĩa là "giả mạo". (Nếu vậy, xin vui lòng cho tôi biết và tôi sẽ xóa nó.)

Nếu điều bạn muốn ngăn chặn là các máy chủ trò chơi gửi dữ liệu không có thật đến máy chủ chính, thì - như Jari Komppa lưu ý - nói chung là không thể ngăn chặn hoàn toàn. Trên thực tế, nó chỉ đơn giản là một biến thể của vấn đề phòng chống gian lận nhiều người chơi cổ điển , ngoại trừ với các máy chủ trung gian thay vì các máy khách bị nghi ngờ là gian lận. Nhiều kỹ thuật tương tự được sử dụng để ngăn chặn gian lận truyền thống cũng có thể hoạt động ở đây, nhưng như thường lệ, không ai trong số chúng hoàn toàn không thể đánh lừa được.

Điều đó nói rằng, có một số điều bạn có thể làm điều đó đặc biệt có thể giúp chống lại các máy chủ gian lận. Một trong số họ sẽ yêu cầu mỗi người chơi trong một trận đấu liên hệ riêng với máy chủ chính và xác nhận rằng họ đang tham gia trận đấu đó. (Bạn có thể muốn làm điều đó trước khi trận đấu bắt đầu, để bạn có thể chắc chắn rằng mọi người đồng ý ai là người tham gia và để không ai muốn khẳng định họ không tham gia trận đấu mà họ thua. Bạn có thể sử dụng chữ ký điện tử mặc dù vậy, về cơ bản, về cơ bản, bạn có thể yêu cầu mọi người chơi trong trận đấu ký một thông báo có nội dung " Tôi là người chơi X và tôi đang tham gia trận đấu M trên máy chủ S tại thời điểm T với người chơi Y, Z và W."và gửi nó đến máy chủ trò chơi, sau này có thể chuyển tiếp nó đến máy chủ chính.) Bằng cách đó, bạn ít nhất có thể đảm bảo rằng một máy chủ gian lận không thể ảnh hưởng đến thứ hạng của bất kỳ người chơi nào không thực sự chơi trên máy chủ đó .

Điều này đặc biệt hữu ích nếu bạn đang sử dụng thứ gì đó như xếp hạng Elo nơi xếp hạng người chơi chủ yếu phụ thuộc vào hiệu suất tương đối của họ . Chắc chắn, ai đó đang chạy một máy chủ không có thật vẫn có thể tạo ra một loạt các tài khoản giả và gửi kết quả nói rằng tài khoản của họ đánh bại những người giả mạo, nhưng với một hệ thống xếp hạng tương đối, tất cả những gì sẽ làm là khiến tài khoản của kẻ lừa đảo xếp hạng cao hơn một chút so với hàng giả ( lần lượt sẽ có xếp hạng đáy đá).

Một điều rõ ràng khác cần làm để ngăn chặn gian lận là để người chơi xác minh kết quả trận đấu của họ trực tiếp từ máy chủ chính. Nếu người chơi thắng một trận đấu trên một máy chủ mới, nhưng kết quả được gửi đến máy chủ chính nói rằng họ đã thua (hoặc nếu kết quả không bao giờ được gửi đi), điều đó sẽ cho họ biết rằng có điều gì đó đáng nghi đang xảy ra. Hy vọng rằng, tại thời điểm đó, họ sẽ báo cáo máy chủ gian lận hoặc ít nhất là bỏ phiếu bằng chân và không bao giờ chơi trên máy chủ đó nữa.

Trên thực tế, bạn có thể thực hiện điều này tự động: sau mỗi trò chơi, một khi kết quả đã được gửi đến máy chủ chính, hãy để khách hàng lấy lại chúng từ máy chủ chính và so sánh chúng với cách khách hàng nghĩ rằng trò chơi kết thúc. Nếu có sự không phù hợp, hãy báo cáo cả cho người chơi (để họ biết có gì đó không ổn) và máy chủ chính (để bạn có thể phát hiện các máy chủ gian lận). Tất nhiên, với tư cách là người vận hành máy chủ chính, sau đó bạn sẽ cần phải quyết định ai nói dối - máy chủ hoặc người chơi - nhưng hy vọng trong hầu hết các trường hợp sẽ khá rõ ràng từ mẫu báo cáo.


Cảm ơn Ilmari rất nhiều, cả hai câu trả lời đều tuyệt vời (xin vui lòng giữ chúng xung quanh). Xin lỗi vì sự chậm trễ, tôi đã đi lạc hướng. -Cody
Cody Smith

5

Lưu ý: Câu trả lời này có thể dựa trên sự hiểu lầm của câu hỏi - xem bình luận bên dưới.


Câu trả lời chung chung ngắn: sử dụng chữ ký số .

Cụ thể, máy chủ chính phải có khóa riêng cho sơ đồ chữ ký số phù hợp (RSA, DSA, ECDSA, v.v.) và bằng cách nào đó nên chuyển tiếp khóa công khai của mình đến tất cả các máy khách một cách an toàn. Sau đó, máy chủ có thể ký bất kỳ dữ liệu nào mà nó gửi cho khách hàng bằng khóa riêng (hoặc có thể sử dụng nó để đàm phán một bí mật chung có thể sử dụng để mã hóa đối xứng và / hoặc xác thực thông tin liên lạc giữa nó và khách hàng cụ thể đó) và khách hàng có thể sử dụng khóa chung để xác minh rằng chữ ký đã được tạo bởi máy chủ.

Tất nhiên, vấn đề tiếp theo của bạn được phân phối khóa công khai để cho một máy chủ giả mạo không giả mạo có thể đó và thay thế khóa công khai của riêng mình. Điều đó có thể không khó lắm nếu bạn có thể làm điều đó trước (ví dụ: phân phối khóa cùng với thực thi trò chơi), nhưng sẽ rất khó nếu bạn phải làm điều đó sau, ví dụ vì không biết danh tính của máy chủ chính nâng cao. Một giải pháp tiêu chuẩn là phân phối một số khóa công khai khác (có khóa riêng tương ứng chỉ được biết đến với bạn) cho tất cả các máy khách, sau đó ký thông báo chứa khóa chung của máy chủ chính với khóa khác đó trước khi phát.

Trên thực tế, bạn thậm chí có thể mở rộng chuỗi chữ ký như vậy hơn nữa - giả sử, có một khóa riêng siêu bí mật, được giữ an toàn ở một nơi nào đó và có khóa công khai được biết đến cho tất cả khách hàng và một khóa riêng "sử dụng hàng ngày" khác được sử dụng để thực sự ký các khóa máy chủ và khóa chung của nó được ký với khóa chính siêu bí mật trước khi khóa trong két. Bản thân nó không hữu ích, nhưng nó có khả năng rất hữu ích nếu bạn cũng bao gồm một số cơ chế để thu hồi các khóa bị xâm nhập, do đó, ví dụ nếu khóa sử dụng hàng ngày của bạn bị rò rỉ, bạn có thể thu hồi nó và tạo một khóa khác.

Những gì tôi mô tả ở trên là một loại cơ sở hạ tầng khóa công khai thô sơ . Trên thực tế, việc thực hiện một cách an toàn có thể trở nên khá phức tạp, nhưng may mắn là nó đã được thực hiện trước đó. Trên thực tế, bất cứ khi nào bạn kết nối với một trang web (như Wikipedia ) bằng HTTPS , thì đây chính xác là những gì trình duyệt của bạn làm: nó nhận được chứng chỉ khóa công khai từ máy chủ, xác minh rằng chứng chỉ khớp với tên máy chủ trong URL, không phải được liệt kê là bị thu hồi và đã được ký bởi một cơ quan chứng nhận đã biết và đáng tin cậy , sau đó sử dụng nó để đàm phán khóa mã hóa đối xứng tạm thờichỉ biết đến chính nó và chủ sở hữu của khóa riêng tương ứng với chứng chỉ. Khóa đối xứng này sau đó được sử dụng để mã hóa và xác thực tất cả dữ liệu được gửi giữa máy khách và máy chủ.

Cụ thể, bạn thực sự nên xem qua các thư viện SSL / TLS hiện có (thường đi kèm với triển khai PKI X.509 ), hoặc có thể tại SPKI . Đây vẫn là một số phức tạp, nhưng có lẽ dễ dàng hơn (và an toàn hơn) so với cố gắng để cuộn của riêng bạn.


Tôi có thể sai, xin vui lòng sửa cho tôi nếu nó là như vậy, nhưng tôi nghĩ rằng bạn đang thiếu điểm của câu hỏi. Anh ta muốn cho phép mọi người tạo máy chủ của riêng họ, báo cáo số liệu thống kê cho máy chủ chính. Khi anh ta làm điều đó, không có cách nào anh ta thực sự có thể ngăn chặn hack (@Jari Kompppa có quyền). -1 bây giờ.
jcora

1
@Bane: Bạn có thể đúng. Tôi đã giải thích cụm từ "giả mạo máy chủ chính" trong câu hỏi là " giả vờ là máy chủ chính", nhưng sau khi đọc lại câu hỏi, tôi có thể thấy rằng anh ta có thể có nghĩa là " gửi dữ liệu giả đến máy chủ chính". Bạn đúng rằng chữ ký số sẽ không giúp được gì trong việc chống lại điều đó.
Ilmari Karonen

2

Điều này phụ thuộc vào bản chất của trò chơi và lý do bạn giảm tải vai trò máy chủ.

Trong một số trường hợp nhất định, bạn có thể có thể đạt được điều này với nhật ký kiểm toán mật mã. Ví dụ: nếu đó là trò chơi theo lượt hai người chơi và bạn có thể sắp xếp cho mỗi khách hàng có một khóa bất đối xứng riêng cho mục đích chữ ký, bạn có thể có một giao thức dọc theo dòng

  • Trạng thái ban đầu S0 bao gồm một mã định danh duy nhất cho trò chơi (để ngăn chặn các cuộc tấn công phát lại) và mặt khác được coi là không đổi. Nếu có một yếu tố ngẫu nhiên, máy chủ trung tâm sẽ được sản xuất và lưu vào đó để so sánh trong tương lai.
  • P1 thực hiện di chuyển m1; ký trạng thái kết quả S1, tạo chữ ký C1; và gửi nó với di chuyển của mình (S1, C1, m1) đến P2.
  • P2 thực hiện di chuyển m2; ký trạng thái kết quả S2, tạo chữ ký C2; và gửi nó với di chuyển của mình (S2, C2, m2) đến P1.
  • Vân vân.

Cuối cùng, cả hai khách hàng đều gửi kết quả đến máy chủ trung tâm và nếu họ không đồng ý thì họ sẽ gửi các bản kiểm toán: (S1, C1, m1), (S2, C2, m2), v.v. Vì mỗi người chơi đã ký di chuyển, họ cam kết với họ.

Nó vẫn dễ bị tổn thương bởi một người chơi DDOSing người khác để ngăn họ gửi kết quả của họ, nhưng thực sự bạn không thể làm gì nhiều về điều đó.

NB Đây chỉ là một bản phác thảo nhanh - tôi chắc chắn rằng nếu bạn đăng nó lên crypto.stackexchange.com sẽ có người chọc vào những lỗ hổng lớn trong đó - nhưng tôi nghĩ nguyên tắc là âm thanh. Nhận bất cứ kế hoạch nào bạn thiết kế được xem xét bởi một người biết công cụ của họ trước khi bạn bắt đầu dựa vào nó.


Bạn có thể tránh vấn đề DoS bằng cách yêu cầu gửi nhật ký kiểm toán trừ khi tất cả người chơi gửi kết quả và đồng ý với nó. Tuy nhiên, một vấn đề khác là một người chơi nhận ra họ đang thua có thể bỏ cuộc chơi. Bạn có thể quy định rằng bỏ học đồng nghĩa với việc thua cuộc, nhưng sau đó một người chơi có thể khiến nó giống như đối thủ của họ là người bỏ cuộc bằng cách nối thêm một bước di chuyển vào đường mòn kiểm toán của họ. Một cách khác là cho phép người chơi tải xuống các bản kiểm toán đã gửi và sau đó tự sửa đổi, nhưng điều đó có thể dẫn đến một số trò chơi khá lôi cuốn.
Ilmari Karonen
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.