DDoS là một kiểu tấn công vô cùng nhức nhối khi sản phẩm của chúng ta có số lượng người dùng tăng cao và bị để mắt bởi các hacker, không có một phương pháp nào hiệu quả một 100% đối với các cuộc tấn công DDoS vậy nên sẽ cần phải kết hợp cả các giải pháp từ phần cứng cho đến phần mềm. May mắn là EzyPlatform đã được thừa hưởng giải pháp từ EzyFox Server.

Tấn công DDoS là gì?

503 copy.jpg

Là một cách thức của kẻ tấn công làm cho máy chủ của chúng ta không thể nhận thêm bất kì yêu cầu nào nữa, dẫn đến việc không thể phục vụ bất kỳ người dùng nào. Người dùng có thể chờ mãi không đăng nhập được hay không sử dụng được bất kỳ dịch vụ nào.

Về cơ bản có 2 kiểu tấn công chính:

  1. Kẻ tấn công khai thác lỗ hổng từ một API xử lý rất nặng nào đó, và gửi request liên tục vào đây làm cho server dùng toàn bộ tài nguyên chỉ để phục vụ cho kẻ tấn công này.
  2. Kẻ tấn công sử dụng nhiều nguồn tài nguyên gấp rất nhiều lần khả năng chịu đựng của server, khiến cho nó không còn khả năng chấp nhận những request khác nữa.

Đối với trường hợp thứ 2, nếu kẻ tấn công có thể huy động được hàng nghìn thiết bị để giả lập giống như user thật điều đó sẽ rất khó để chống đỡ, vì trong 1 luồng dữ liệu socket, việc xử lý 1 request là tương đối nặng nề.

Về phía phần mềm thì EzyPlatform và EzyFox Server cung cấp một loạt các giải pháp để chống DDoS như sau:

  1. Sử dụng hữu hạn số thread.
  2. Hạn chế số lượng session.
  3. Hạn chế số lượng request.
  4. Phân phối đều tài nguyên.

Sử dụng hữu hạn số lượng thread

Nếu bạn tưởng tượng cứ mỗi một yêu cầu gửi đến thì EzyFox Server sẽ lại tạo ra một luồng để xử lý kiểu này:

Thread newThread(() => process(request));
newThread.start();

Thì không phải phải như vậy. Bởi vì máy tính cũng có số lượng hữu hạn số luồng, mỗi luồng lại tiêu tốn một tài nguyên nhất định, ví dụ mỗi luồng tiêu tốn 2MB và có 1,000 yêu cầu đồng thời như vậy sẽ tiêu tốn hết 2GB bộ nhớ và điều này không ổn. Chính vì vậy mà EzyPlatform và EzyFox Server sử dụng hữu hạn số lượng thread thông qua cơ chế thread pool, nghĩa là một yêu cầu khi gửi đến sẽ không được xử lý ngay lập tức bởi một thread mà được đưa vào trong một hàng đợi và được xử lý khi có một thread nhàn rỗi.

Tuy nhiên không chỉ có một mà có rất nhiều thread pool tồn tại trong EzyPlatform và EzyFox Server cho các mục đích khác nhau, bạn có thể tuỳ chỉnh thông qua cấu hình:

<thread-pool-size>
    <statistics>1</statistics>
    <stream-handler>8</stream-handler>
    <socket-data-receiver>8</socket-data-receiver>
    <system-request-handler>8</system-request-handler>
    <extension-request-handler>8</extension-request-handler>
    <socket-disconnection-handler>2</socket-disconnection-handler>
    <socket-user-removal-handler>3</socket-user-removal-handler>
</thread-pool-size>

Hạn chế số lượng session

ddos-1.png

Mỗi client sẽ được đại diện bởi 1 session, và mỗi một session lại chiếm một số lượng tài nguyên nhất định, nên cần giữ số lượng session ở mức thấp nhất có thể. Như đã đề cập trong bài trước EzyFox Server sử dụng 1 thread để thanh tra và loại bỏ các loại session:

  1. Đã quá thời gian đăng nhập cho phép.
  2. Đã quá lâu không có request nào gửi đến server.
  3. Một session nếu muốn giữ kết nối với server phải gửi command ping định kì, có thể 3 hoặc 5 giây tuỳ theo bạn cấu hình. Nếu quá 15 giây mà không có bất kì lệnh ping nào chẳng gửi đến server chẳng hạn, server sẽ chủ động ngắt kết nối với session này.

Hạn chế số lượng request

ddos-2.png

Sẽ có rất nhiều request được gửi đến EzyPlatform và EzyFox Server, tuy nhiên nó cần giới hạn số lượng request tối đa cho một client, ví dụ như trong hình, server sẽ chỉ chấp nhận các request màu xanh tại 1 thời điểm, còn những request màu đỏ, do vượt quá số lượng mà server có thể chịu tải sẽ bị drop và không được xử lý.

Các request cũng sẽ không được xử lý ngay, mà còn phải trải qua 1 quá trình điều phối xoay vòng để có thể đảm bảo tài nguyên được phân phối một cách hợp lý. Điều này sẽ bắt buộc kẻ tấn công phải huy động rất nhiều máy hoặc nhiều IP khác nhau để tấn công EzyPlatform, mặc dù nó không thể đảm bảo 100% chống toàn bộ cuộc tấn công nhưng cũng sẽ gây cản trở và làm nản lòng kẻ tấn công.

Phân phối đều tài nguyên

ddos-3.png

Để server không chỉ phục vụ duy nhất 1 client nào đó, chúng ta cần phải xử dụng cơ chế "băng đạn tròn" để xoay tua liên tục. Mỗi client sẽ có 1 request queue, mỗi lần xử lý sẽ lấy 1 request từ một queue và rồi lại cho queue này về cuối. Ví dụ:

Queue1: A1, A2, A3
Queue2: B1, B2, B3
Queue3: C1, C2, C3

Lượt xử lý đầu tiên sẽ lấy A3 ra để xử lý và trạng thái sẽ là:

Queue2: B1, B2, B3
Queue3: C1, C2, C3
Queue1: A1, A2

Lượt xử lý tiếp theo sẽ lấy B3 ra để xử lý và trạng thái sẽ là:

Queue3: C1, C2, C3
Queue1: A1, A2
Queue2: B1, B2

Cứ như vậy cho đến khi nào các queue rỗng hết thì thôi. Điều này sẽ đảm bảo server sẽ phục vụ đều cho tất cả client và buộc kẻ tấn công phải liên tục nhồi request vào EzyPlatform, chỉ cần dừng tấn công server lại hoạt động bình thường.

Cấu hình

Bạn có thể tìm thấy cấu hình cho phần chống DDoS của EzyPlatform trong tập tin socket/settings/ezy-settings.xml đoạn mã:

<session-management>
    <session-max-idle-time>15</session-max-idle-time>
    <session-max-waiting-time>30</session-max-waiting-time>
    <session-max-request-per-second>
        <value>20</value>
        <action>DISCONNECT_SESSION</action>
    </session-max-request-per-second>
</session-management>

Tổng kết

Tấn công DDoS không phải là hiếm gặp và khó chống đỡ 100%, sẽ yêu cầu cả giải pháp phần cứng và phần mềm. Về phần mềm thì EzyPlatform đã đưa ra các giải pháp tương đối trọn vẹn để đảo bảo server sẽ hoạt động ổn định và sống sót qua cuộc tấn công DDoS thông qua các cơ chế phân phối tài nguyên đều và hợp lý, sử dụng hữu hạn số thread thông qua hàng đợi và thread pool.